69 lines
2.5 KiB
C#
69 lines
2.5 KiB
C#
|
#if UNITY_EDITOR
|
||
|
using UnityEditor;
|
||
|
using UnityEngine;
|
||
|
|
||
|
namespace SLZ.Marrow.Utilities
|
||
|
{
|
||
|
public class DrawGizmoHelper
|
||
|
{
|
||
|
public enum ArrowType
|
||
|
{
|
||
|
Default,
|
||
|
Double
|
||
|
}
|
||
|
|
||
|
public static void Arrow(Vector3 start, Vector3 end, Vector3 normal = default(Vector3), ArrowType type = ArrowType.Default, float arrowHeadLength = 0.2f, float arrowHeadAngle = 30.0f)
|
||
|
{
|
||
|
if (normal.sqrMagnitude <= 0)
|
||
|
{
|
||
|
normal = Vector3.up;
|
||
|
}
|
||
|
|
||
|
Vector3 pos = start;
|
||
|
Vector3 direction = end - start;
|
||
|
Vector3 headRight = Vector3.zero;
|
||
|
Vector3 headLeft = Vector3.zero;
|
||
|
if (direction != Vector3.zero)
|
||
|
{
|
||
|
headRight = Quaternion.LookRotation(direction, normal) * Quaternion.Euler(0, 180 + arrowHeadAngle, 0) * new Vector3(0, 0, 1);
|
||
|
headLeft = Quaternion.LookRotation(direction, normal) * Quaternion.Euler(0, 180 - arrowHeadAngle, 0) * new Vector3(0, 0, 1);
|
||
|
}
|
||
|
|
||
|
Gizmos.DrawRay(pos + direction, headRight * arrowHeadLength);
|
||
|
Gizmos.DrawRay(pos + direction, headLeft * arrowHeadLength);
|
||
|
switch (type)
|
||
|
{
|
||
|
case ArrowType.Default:
|
||
|
Gizmos.DrawRay(pos, direction);
|
||
|
break;
|
||
|
case ArrowType.Double:
|
||
|
Gizmos.DrawRay(pos, direction);
|
||
|
Gizmos.DrawRay(pos, -headRight * arrowHeadLength);
|
||
|
Gizmos.DrawRay(pos, -headLeft * arrowHeadLength);
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
public static void DrawText(string text, Vector3 position = default(Vector3))
|
||
|
{
|
||
|
Handles.BeginGUI();
|
||
|
GUI.color = Gizmos.color;
|
||
|
position = Gizmos.matrix.MultiplyPoint(position);
|
||
|
var view = SceneView.currentDrawingSceneView;
|
||
|
if (view == null)
|
||
|
return;
|
||
|
Vector3 screenPos = view.camera.WorldToScreenPoint(position);
|
||
|
if (screenPos.y < 0 || screenPos.y > Screen.height || screenPos.x < 0 || screenPos.x > Screen.width || screenPos.z < 0)
|
||
|
{
|
||
|
Handles.EndGUI();
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
Vector2 size = GUI.skin.label.CalcSize(new GUIContent(text));
|
||
|
GUI.Label(new Rect(screenPos.x - (size.x / 2), view.position.height - screenPos.y - (size.y * 2f), size.x, size.y), text);
|
||
|
Handles.EndGUI();
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
#endif
|