AreaClock2DEditor.cs 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. using System.Linq;
  2. using UnityEditor;
  3. using UnityEngine;
  4. namespace Chronos
  5. {
  6. [CustomEditor(typeof(AreaClock2D)), CanEditMultipleObjects]
  7. public class AreaClock2DEditor : AreaClockEditor<AreaClock2D>
  8. {
  9. protected override void CheckForCollider()
  10. {
  11. AreaClock2D clock = (AreaClock2D)serializedObject.targetObject;
  12. Collider2D collider = clock.GetComponent<Collider2D>();
  13. if (collider == null || !collider.enabled)
  14. {
  15. EditorGUILayout.HelpBox("An area clock requires a collider component.", MessageType.Error);
  16. }
  17. else if (!collider.isTrigger)
  18. {
  19. EditorGUILayout.HelpBox("The collider attached to the area clock should be a trigger.", MessageType.Warning);
  20. }
  21. }
  22. private static bool IsVectorNegative(Vector3 v)
  23. {
  24. return v.x < 0 || v.y < 0 || v.z < 0;
  25. }
  26. [DrawGizmo(GizmoType.Active)]
  27. private static void DrawGizmos(AreaClock2D clock, GizmoType gizmoType)
  28. {
  29. // Draw icon...
  30. Gizmos.color = Color.white;
  31. Vector3 position;
  32. if (clock.mode == AreaClockMode.PointToEdge)
  33. {
  34. position = clock.transform.TransformPoint(clock.center);
  35. }
  36. else
  37. {
  38. position = clock.transform.position;
  39. }
  40. Gizmos.DrawIcon(position, "Chronos/AreaClock");
  41. // Draw inset approximations for padding...
  42. if (clock.mode == AreaClockMode.DistanceFromEntry)
  43. {
  44. Handles.color = clock.padding > 0 ? Color.cyan : Color.red;
  45. Vector2 inset = -(2 * clock.padding * Vector2.one);
  46. CircleCollider2D circleCollider = clock.GetComponent<CircleCollider2D>();
  47. if (circleCollider != null)
  48. {
  49. Vector2 scale = clock.transform.lossyScale;
  50. float maxScale = Mathf.Max(scale.x, scale.y);
  51. Vector2 insetScale = (maxScale * (2 * circleCollider.radius) * Vector2.one) + inset;
  52. if (IsVectorNegative(insetScale)) Handles.color = Color.red;
  53. Handles.matrix = Matrix4x4.TRS(clock.transform.position, clock.transform.rotation, insetScale);
  54. Handles.DrawWireDisc(Vector3.zero, Vector3.forward, 0.5f);
  55. return;
  56. }
  57. BoxCollider2D boxCollider = clock.GetComponent<BoxCollider2D>();
  58. if (boxCollider != null)
  59. {
  60. Vector2 insetScale = Vector2.Scale(boxCollider.size, clock.transform.lossyScale) + inset;
  61. if (IsVectorNegative(insetScale)) Handles.color = Color.red;
  62. Handles.matrix = Matrix4x4.TRS(clock.transform.position, clock.transform.rotation, insetScale);
  63. Handles.DrawPolyLine
  64. (
  65. new Vector3(-1, -1, 0) / 2,
  66. new Vector3(-1, +1, 0) / 2,
  67. new Vector3(+1, +1, 0) / 2,
  68. new Vector3(+1, -1, 0) / 2,
  69. new Vector3(-1, -1, 0) / 2
  70. );
  71. return;
  72. }
  73. PolygonCollider2D polyCollider = clock.GetComponent<PolygonCollider2D>();
  74. if (polyCollider != null)
  75. {
  76. Vector3 bounds = polyCollider.bounds.size;
  77. float smallestBound = Mathf.Min(bounds.x, bounds.y);
  78. Vector2 normalizedBounds = smallestBound * new Vector2(1 / bounds.x, 1 / bounds.y);
  79. Vector2 insetScale = (Vector2)clock.transform.lossyScale + Vector2.Scale(normalizedBounds, inset);
  80. if (IsVectorNegative(insetScale)) Handles.color = Color.red;
  81. Handles.matrix = Matrix4x4.TRS(clock.transform.position, clock.transform.rotation, insetScale);
  82. Vector3[] points = polyCollider.points.Select(v2 => (Vector3)v2).ToArray();
  83. Handles.DrawPolyLine(points);
  84. return;
  85. }
  86. }
  87. }
  88. }
  89. }