AreaClock3DEditor.cs 3.1 KB

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