-
-
Notifications
You must be signed in to change notification settings - Fork 242
/
MyDebug.cs
187 lines (154 loc) · 6.11 KB
/
MyDebug.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
using System.Collections.Generic;
using System.Text;
using JetBrains.Annotations;
using UnityEngine;
namespace MyBox
{
[PublicAPI]
public static class MyDebug
{
#region Log Array
private static StringBuilder _stringBuilder;
private static void PrepareStringBuilder()
{
if (_stringBuilder == null) _stringBuilder = new StringBuilder();
else _stringBuilder.Clear();
}
public static void LogArray<T>(T[] toLog)
{
PrepareStringBuilder();
_stringBuilder.Append("Log Array: ").Append(typeof(T).Name).Append(" (").Append(toLog.Length).Append(")\n");
for (var i = 0; i < toLog.Length; i++)
{
_stringBuilder.Append("\n\t").Append(i.ToString().Colored(Colors.brown)).Append(": ").Append(toLog[i]);
}
Debug.Log(_stringBuilder.ToString());
}
public static void LogArray<T>(IList<T> toLog)
{
PrepareStringBuilder();
var count = toLog.Count;
_stringBuilder.Append("Log Array: ").Append(typeof(T).Name).Append(" (").Append(count).Append(")\n");
for (var i = 0; i < count; i++)
{
_stringBuilder.Append("\n\t" + i.ToString().Colored(Colors.brown) + ": " + toLog[i]);
}
Debug.Log(_stringBuilder.ToString());
}
#endregion
public static void LogColor(Color color)
{
Debug.Log("<color=#" + ColorUtility.ToHtmlStringRGB(color) + ">████████████</color> = " + color);
}
#region Debug Bounds
/// <summary>
/// Draw bounds of Mesh
/// </summary>
public static void DrawDebugBounds(MeshFilter mesh, Color color)
{
#if UNITY_EDITOR
if (mesh == null) return;
var renderer = mesh.GetComponent<MeshRenderer>();
DrawDebugBounds(renderer, color);
#endif
}
/// <summary>
/// Draw bounds of MeshRenderer
/// </summary>
public static void DrawDebugBounds(MeshRenderer renderer, Color color)
{
#if UNITY_EDITOR
var bounds = renderer.bounds;
DrawDebugBounds(bounds, color);
#endif
}
/// <summary>
/// Draw bounds of Bounds
/// </summary>
public static void DrawDebugBounds(Bounds bounds, Color color)
{
#if UNITY_EDITOR
Vector3 v3Center = bounds.center;
Vector3 v3Extents = bounds.extents;
var v3FrontTopLeft = new Vector3(v3Center.x - v3Extents.x, v3Center.y + v3Extents.y, v3Center.z - v3Extents.z); // Front top left corner
var v3FrontTopRight = new Vector3(v3Center.x + v3Extents.x, v3Center.y + v3Extents.y, v3Center.z - v3Extents.z); // Front top right corner
var v3FrontBottomLeft = new Vector3(v3Center.x - v3Extents.x, v3Center.y - v3Extents.y, v3Center.z - v3Extents.z); // Front bottom left corner
var v3FrontBottomRight = new Vector3(v3Center.x + v3Extents.x, v3Center.y - v3Extents.y, v3Center.z - v3Extents.z); // Front bottom right corner
var v3BackTopLeft = new Vector3(v3Center.x - v3Extents.x, v3Center.y + v3Extents.y, v3Center.z + v3Extents.z); // Back top left corner
var v3BackTopRight = new Vector3(v3Center.x + v3Extents.x, v3Center.y + v3Extents.y, v3Center.z + v3Extents.z); // Back top right corner
var v3BackBottomLeft = new Vector3(v3Center.x - v3Extents.x, v3Center.y - v3Extents.y, v3Center.z + v3Extents.z); // Back bottom left corner
var v3BackBottomRight = new Vector3(v3Center.x + v3Extents.x, v3Center.y - v3Extents.y, v3Center.z + v3Extents.z); // Back bottom right corner
Debug.DrawLine(v3FrontTopLeft, v3FrontTopRight, color);
Debug.DrawLine(v3FrontTopRight, v3FrontBottomRight, color);
Debug.DrawLine(v3FrontBottomRight, v3FrontBottomLeft, color);
Debug.DrawLine(v3FrontBottomLeft, v3FrontTopLeft, color);
Debug.DrawLine(v3BackTopLeft, v3BackTopRight, color);
Debug.DrawLine(v3BackTopRight, v3BackBottomRight, color);
Debug.DrawLine(v3BackBottomRight, v3BackBottomLeft, color);
Debug.DrawLine(v3BackBottomLeft, v3BackTopLeft, color);
Debug.DrawLine(v3FrontTopLeft, v3BackTopLeft, color);
Debug.DrawLine(v3FrontTopRight, v3BackTopRight, color);
Debug.DrawLine(v3FrontBottomRight, v3BackBottomRight, color);
Debug.DrawLine(v3FrontBottomLeft, v3BackBottomLeft, color);
#endif
}
#endregion
public static void DrawString(string text, Vector3 worldPos, Color? colour = null)
{
#if UNITY_EDITOR
var view = UnityEditor.SceneView.currentDrawingSceneView;
if (view == null) return;
var defaultColor = GUI.color;
UnityEditor.Handles.BeginGUI();
if (colour.HasValue) GUI.color = colour.Value;
Vector3 screenPos = view.camera.WorldToScreenPoint(worldPos);
Vector2 size = GUI.skin.label.CalcSize(new GUIContent(text));
GUI.Label(new Rect(screenPos.x - (size.x / 2), -screenPos.y + view.position.height + 4, size.x, size.y), text);
UnityEditor.Handles.EndGUI();
GUI.color = defaultColor;
#endif
}
/// <summary>
/// Draw directional arrow
/// </summary>
public static void DrawArrowRay(Vector3 position, Vector3 direction, float headLength = 0.25f, float headAngle = 20.0f)
{
#if UNITY_EDITOR
var rightVector = new Vector3(0, 0, 1);
var directionRotation = Quaternion.LookRotation(direction);
Debug.DrawRay(position, direction);
Vector3 right = directionRotation * Quaternion.Euler(0, 180 + headAngle, 0) * rightVector;
Vector3 left = directionRotation * Quaternion.Euler(0, 180 - headAngle, 0) * rightVector;
Debug.DrawRay(position + direction, right * headLength);
Debug.DrawRay(position + direction, left * headLength);
#endif
}
/// <summary>
/// Draw XYZ dimensional RGB cross
/// </summary>
public static void DrawDimensionalCross(Vector3 position, float size, float duration = 0)
{
#if UNITY_EDITOR
var halfSize = size / 2;
Debug.DrawLine(position.OffsetY(-halfSize), position.OffsetY(halfSize), Color.green, duration);
Debug.DrawLine(position.OffsetX(-halfSize), position.OffsetX(halfSize), Color.red, duration);
Debug.DrawLine(position.OffsetZ(-halfSize), position.OffsetZ(halfSize), Color.blue, duration);
#endif
}
#if UNITY_AI_ENABLED
/// <summary>
/// Draw segments of a path with Debug Lines
/// </summary>
public static void VisualizeNavMeshPath(UnityEngine.AI.NavMeshPath path)
{
var corners = path.corners;
for (var i = 1; i < corners.Length; i++)
{
var cornerA = corners[i - 1];
var cornerB = corners[i];
Debug.DrawLine(cornerA, cornerB);
}
}
#endif
}
}