InteractionTriggerInspector.cs 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. using UnityEngine;
  2. using UnityEditor;
  3. using System.Collections;
  4. namespace RootMotion.FinalIK {
  5. // Custom scene view helpers for the InteractionTrigger
  6. [CustomEditor(typeof(InteractionTrigger))]
  7. public class InteractionTriggerInspector : Editor {
  8. private InteractionTrigger script { get { return target as InteractionTrigger; }}
  9. void OnSceneGUI() {
  10. if (!script.enabled) return;
  11. var collider = script.GetComponent<Collider>();
  12. if (collider != null)
  13. collider.isTrigger = true;
  14. else {
  15. Warning.Log ("InteractionTrigger requires a Collider component.", script.transform, true);
  16. return;
  17. }
  18. if (script.ranges.Length == 0) return;
  19. for (int i = 0; i < script.ranges.Length; i++) {
  20. DrawRange (script.ranges[i], i);
  21. }
  22. Handles.BeginGUI();
  23. int h = script.ranges.Length * 18;
  24. GUILayout.BeginArea(new Rect(10, 10, 200, h + 25), "InteractionTrigger Visualization", "Window");
  25. // Rotating display
  26. for (int i = 0; i < script.ranges.Length; i++) {
  27. script.ranges[i].show = GUILayout.Toggle(script.ranges[i].show, new GUIContent(" Show Range " + i.ToString() + ": " + script.ranges[i].name, string.Empty));
  28. }
  29. GUILayout.EndArea();
  30. Handles.EndGUI();
  31. }
  32. private void DrawRange(InteractionTrigger.Range range, int index) {
  33. range.name = string.Empty;
  34. for (int i = 0; i < range.interactions.Length; i++) {
  35. if (range.name.Length > 50) {
  36. range.name += "...";
  37. break;
  38. }
  39. if (i > 0) range.name += "; ";
  40. for (int e = 0; e < range.interactions[i].effectors.Length; e++) {
  41. if (e > 0) range.name += ", ";
  42. range.name += range.interactions[i].effectors[e].ToString();
  43. }
  44. if (range.interactions[i].interactionObject != null) {
  45. range.name += ": " + range.interactions[i].interactionObject.name;
  46. }
  47. }
  48. if (!range.show) return;
  49. Color color = GetColor(index);
  50. Handles.color = color;
  51. GUI.color = color;
  52. // Character Position
  53. DrawCharacterPosition(range, index);
  54. // Camera Position
  55. DrawCameraPosition(range, index);
  56. Handles.color = Color.white;
  57. GUI.color = Color.white;
  58. }
  59. private void DrawCharacterPosition(InteractionTrigger.Range range, int index) {
  60. Vector3 labelPosition = script.transform.position - Vector3.up * index * 0.05f;
  61. if (!range.characterPosition.use) {
  62. Handles.Label(labelPosition, "Character Position is not used for Range " + index.ToString() + ": " + range.name);
  63. return;
  64. }
  65. range.characterPosition.radius = Mathf.Max(range.characterPosition.radius, 0f);
  66. if (range.characterPosition.radius <= 0f) {
  67. Handles.Label(labelPosition, "Character Position radius is zero for Range " + index.ToString() + ": " + range.name);
  68. return;
  69. }
  70. if (range.characterPosition.maxAngle <= 0f) {
  71. Handles.Label(labelPosition, "Character Position max angle is zero for Range " + index.ToString() + ": " + range.name);
  72. return;
  73. }
  74. Vector3 f = script.transform.forward;
  75. if (range.characterPosition.fixYAxis) f.y = 0f;
  76. if (f == Vector3.zero) {
  77. Handles.Label(script.transform.position - Vector3.up * index * 0.05f, "Invalid rotation of InteractionTrigger for Range " + index.ToString() + ": " + range.name);
  78. return; // Singularity
  79. }
  80. Quaternion triggerRotation = Quaternion.LookRotation(f, (range.characterPosition.fixYAxis? Vector3.up: script.transform.up));
  81. Vector3 position = script.transform.position + triggerRotation * range.characterPosition.offset3D;
  82. Vector3 direction = triggerRotation * range.characterPosition.direction3D;
  83. Quaternion rotation = direction == Vector3.zero? triggerRotation: Quaternion.LookRotation(direction, (range.characterPosition.fixYAxis? Vector3.up: script.transform.up));
  84. Vector3 up = rotation * Vector3.up;
  85. Vector3 forward = rotation * Vector3.forward;
  86. Handles.DrawWireDisc(position, up, range.characterPosition.radius);
  87. if (range.characterPosition.orbit) {
  88. float mag = range.characterPosition.offset.magnitude;
  89. if (mag - range.characterPosition.radius > 0f) {
  90. Handles.DrawWireDisc(script.transform.position, up, mag - range.characterPosition.radius);
  91. }
  92. Handles.DrawWireDisc(script.transform.position, up, mag + range.characterPosition.radius);
  93. }
  94. Vector3 x = forward * range.characterPosition.radius;
  95. Quaternion q = Quaternion.AngleAxis(-range.characterPosition.maxAngle, up);
  96. Vector3 dir = q * x;
  97. if (direction != Vector3.zero && range.characterPosition.maxAngle < 180f) {
  98. Handles.DrawLine(position, position + x);
  99. Inspector.DotCap(0, position + x, Quaternion.identity, range.characterPosition.radius * 0.01f);
  100. }
  101. Handles.Label(position - Vector3.up * index * 0.05f, "Character Position for Range " + index.ToString() + ": " + range.name);
  102. Color color = Handles.color;
  103. Color transparent = new Color(color.r, color.g, color.b, 0.3f);
  104. Handles.color = transparent;
  105. Handles.DrawSolidArc(position, up, dir, range.characterPosition.maxAngle * 2f, range.characterPosition.radius);
  106. Handles.color = color;
  107. }
  108. private void DrawCameraPosition(InteractionTrigger.Range range, int index) {
  109. if (range.cameraPosition.lookAtTarget == null) return;
  110. Vector3 labelPosition = range.cameraPosition.lookAtTarget.transform.position - Vector3.up * index * 0.05f;
  111. if (range.cameraPosition.direction == Vector3.zero) {
  112. Handles.Label(labelPosition, "Camera Position direction is Vector3.zero for Range" + index.ToString() + ": " + range.name);
  113. return;
  114. }
  115. if (range.cameraPosition.maxAngle <= 0f) {
  116. Handles.Label(labelPosition, "Camera Position max angle is zero for Range" + index.ToString() + ": " + range.name);
  117. return;
  118. }
  119. range.cameraPosition.maxDistance = Mathf.Max(range.cameraPosition.maxDistance, 0f);
  120. if (range.cameraPosition.maxDistance <= 0f) {
  121. Handles.Label(labelPosition, "Camera Position Max Distance is zero for Range" + index.ToString() + ": " + range.name);
  122. return;
  123. }
  124. Quaternion targetRotation = range.cameraPosition.GetRotation();
  125. Vector3 position = range.cameraPosition.lookAtTarget.transform.position;
  126. Vector3 direction = targetRotation * range.cameraPosition.direction;
  127. direction = direction.normalized * range.cameraPosition.maxDistance;
  128. Handles.DrawLine(position, position + direction);
  129. Inspector.DotCap(0, position + direction, Quaternion.identity, 0.005f);
  130. Handles.Label(position + direction * 1.1f, "Camera Position for Range " + index.ToString() + ": " + range.name);
  131. if (range.cameraPosition.maxAngle >= 180f) return;
  132. float r = Mathf.Sin(range.cameraPosition.maxAngle * Mathf.Deg2Rad) * range.cameraPosition.maxDistance;
  133. float d = Mathf.Cos(range.cameraPosition.maxAngle * Mathf.Deg2Rad) * range.cameraPosition.maxDistance;
  134. Quaternion rotation = targetRotation * Quaternion.LookRotation(range.cameraPosition.direction);
  135. Inspector.CircleCap(0, position + direction.normalized * d, rotation, r);
  136. if (SceneView.lastActiveSceneView != null && SceneView.lastActiveSceneView.camera != null) {
  137. //Vector3 c = Vector3.Cross(direction, SceneView.lastActiveSceneView.camera.transform.forward);
  138. Vector3 c = Vector3.Cross(direction, (range.cameraPosition.lookAtTarget.transform.position - SceneView.lastActiveSceneView.camera.transform.position).normalized);
  139. c = Vector3.Cross(direction, c);
  140. Quaternion dirRotation = Quaternion.AngleAxis(range.cameraPosition.maxAngle, c);
  141. Vector3 dir3 = dirRotation * direction;
  142. Handles.DrawLine(position, position + dir3);
  143. Vector3 dir4 = Quaternion.Inverse(dirRotation) * direction;
  144. Handles.DrawLine(position, position + dir4);
  145. Handles.DrawWireArc(position, -c, dir3, range.cameraPosition.maxAngle * 2, range.cameraPosition.maxDistance);
  146. }
  147. }
  148. private static Color GetColor(int index) {
  149. float i = (float)index + 1f;
  150. return new Color(1f / i, i * 0.1f, (i * i) + 0.1f);
  151. }
  152. }
  153. }