RotationLimitHingeInspector.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. using UnityEditor;
  2. using UnityEngine;
  3. using System.Collections;
  4. namespace RootMotion.FinalIK
  5. {
  6. /*
  7. * Custom inspector for RotationLimitHinge
  8. * */
  9. [CustomEditor(typeof(RotationLimitHinge))]
  10. [CanEditMultipleObjects]
  11. public class RotationLimitHingeInspector : RotationLimitInspector
  12. {
  13. private RotationLimitHinge script { get { return target as RotationLimitHinge; } }
  14. #region Inspector
  15. public override void OnInspectorGUI()
  16. {
  17. GUI.changed = false;
  18. // Draw the default inspector
  19. DrawDefaultInspector();
  20. if (GUI.changed) EditorUtility.SetDirty(script);
  21. }
  22. #endregion Inspector
  23. #region Scene
  24. void OnSceneGUI()
  25. {
  26. // Set defaultLocalRotation so that the initial local rotation will be the zero point for the rotation limit
  27. if (!Application.isPlaying && !script.defaultLocalRotationOverride) script.defaultLocalRotation = script.transform.localRotation;
  28. if (script.axis == Vector3.zero) return;
  29. // Quick Editing Tools
  30. Handles.BeginGUI();
  31. GUILayout.BeginArea(new Rect(10, 10, 200, 50), "Rotation Limit Hinge", "Window");
  32. // Rotating display
  33. if (GUILayout.Button("Rotate display 90 degrees"))
  34. {
  35. if (!Application.isPlaying) Undo.RecordObject(script, "Rotate Display");
  36. script.zeroAxisDisplayOffset += 90;
  37. if (script.zeroAxisDisplayOffset >= 360) script.zeroAxisDisplayOffset = 0;
  38. }
  39. GUILayout.EndArea();
  40. Handles.EndGUI();
  41. // Normalize the main axes
  42. Vector3 axis = Direction(script.axis.normalized);
  43. Vector3 cross = Direction(Quaternion.AngleAxis(script.zeroAxisDisplayOffset, script.axis) * script.crossAxis.normalized);
  44. // Axis vector
  45. DrawArrow(script.transform.position, axis, colorDefault, "Axis", 0.02f);
  46. if (script.useLimits)
  47. {
  48. // Zero rotation vector
  49. DrawArrow(script.transform.position, cross * 0.5f, colorDefault, " 0", 0.02f);
  50. // Arcs for the rotation limit
  51. Handles.color = colorDefaultTransparent;
  52. Handles.DrawSolidArc(script.transform.position, axis, cross, script.min, 0.5f);
  53. Handles.DrawSolidArc(script.transform.position, axis, cross, script.max, 0.5f);
  54. }
  55. Handles.color = colorDefault;
  56. GUI.color = colorDefault;
  57. Inspector.CircleCap(0, script.transform.position, Quaternion.LookRotation(axis, cross), 0.5f);
  58. if (!script.useLimits) return;
  59. // Handles for adjusting rotation limits in the scene
  60. Quaternion minRotation = Quaternion.AngleAxis(script.min, axis);
  61. Handles.DrawLine(script.transform.position, script.transform.position + minRotation * cross);
  62. Quaternion maxRotation = Quaternion.AngleAxis(script.max, axis);
  63. Handles.DrawLine(script.transform.position, script.transform.position + maxRotation * cross);
  64. // Undoable scene handles
  65. float min = script.min;
  66. min = DrawLimitHandle(min, script.transform.position + minRotation * cross, Quaternion.identity, 0.5f, "Min", -10);
  67. if (min != script.min)
  68. {
  69. if (!Application.isPlaying) Undo.RecordObject(script, "Min Limit");
  70. script.min = min;
  71. }
  72. float max = script.max;
  73. max = DrawLimitHandle(max, script.transform.position + maxRotation * cross, Quaternion.identity, 0.5f, "Max", 10);
  74. if (max != script.max)
  75. {
  76. if (!Application.isPlaying) Undo.RecordObject(script, "Max Limit");
  77. script.max = max;
  78. }
  79. Handles.color = Color.white;
  80. GUI.color = Color.white;
  81. }
  82. /*
  83. * Converting directions from local space to world space
  84. * */
  85. private Vector3 Direction(Vector3 v)
  86. {
  87. if (script.transform.parent == null) return script.defaultLocalRotation * v;
  88. return script.transform.parent.rotation * (script.defaultLocalRotation * v);
  89. }
  90. #endregion Scene
  91. }
  92. }