FingerRigInspector.cs 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. using UnityEngine;
  2. using System.Collections;
  3. using UnityEditor;
  4. namespace RootMotion.FinalIK {
  5. // Custom Scene View handles for the FingerRig.
  6. [CustomEditor(typeof(FingerRig))]
  7. public class FingerRigInspector : Editor {
  8. private FingerRig script { get { return target as FingerRig; }}
  9. private int selected = -1;
  10. private MonoScript monoScript;
  11. void OnEnable() {
  12. if (serializedObject == null) return;
  13. // Changing the script execution order
  14. if (!Application.isPlaying) {
  15. monoScript = MonoScript.FromMonoBehaviour(script);
  16. int currentExecutionOrder = MonoImporter.GetExecutionOrder(monoScript);
  17. if (currentExecutionOrder != 10000) MonoImporter.SetExecutionOrder(monoScript, 10000);
  18. }
  19. }
  20. void OnSceneGUI() {
  21. if (!script.enabled) return;
  22. string message = string.Empty;
  23. if (!script.IsValid(ref message)) return;
  24. if (Application.isPlaying && !script.initiated) return;
  25. Color color = Color.cyan;
  26. color.a = script.weight;
  27. Handles.color = color;
  28. GUI.color = color;
  29. // Display the bones
  30. if (!Application.isPlaying) {
  31. for (int i = 0; i < script.fingers.Length; i++) {
  32. Handles.DrawLine(script.fingers[i].bone1.position, script.fingers[i].bone2.position);
  33. Inspector.SphereCap(0, script.fingers[i].bone1.position, Quaternion.identity, IKSolverInspector.GetHandleSize(script.fingers[i].bone1.position) * 0.5f);
  34. Inspector.SphereCap(0, script.fingers[i].bone2.position, Quaternion.identity, IKSolverInspector.GetHandleSize(script.fingers[i].bone2.position) * 0.5f);
  35. if (script.fingers[i].bone3 != null) {
  36. Handles.DrawLine(script.fingers[i].bone2.position, script.fingers[i].bone3.position);
  37. Handles.DrawLine(script.fingers[i].bone3.position, script.fingers[i].tip.position);
  38. Inspector.SphereCap(0, script.fingers[i].bone3.position, Quaternion.identity, IKSolverInspector.GetHandleSize(script.fingers[i].bone3.position) * 0.5f);
  39. } else {
  40. Handles.DrawLine(script.fingers[i].bone2.position, script.fingers[i].tip.position);
  41. }
  42. Inspector.SphereCap(0, script.fingers[i].tip.position, Quaternion.identity, IKSolverInspector.GetHandleSize(script.fingers[i].tip.position) * 0.5f);
  43. }
  44. }
  45. // Selecting solvers
  46. if (Application.isPlaying) {
  47. if (selected >= 0 && selected < script.fingers.Length) {
  48. if (script.fingers[selected].weight > 0f) {
  49. color.a = script.weight * script.fingers[selected].weight;
  50. Handles.color = color;
  51. float size = IKSolverInspector.GetHandleSize(script.fingers[selected].IKPosition);
  52. Inspector.CubeCap(0, script.fingers[selected].IKPosition, script.fingers[selected].IKRotation, size);
  53. if (script.fingers[selected].target == null) {
  54. switch(Tools.current) {
  55. case Tool.Move:
  56. script.fingers[selected].IKPosition = Handles.PositionHandle(script.fingers[selected].IKPosition, Tools.pivotRotation == PivotRotation.Local? script.fingers[selected].IKRotation: Quaternion.identity);
  57. break;
  58. case Tool.Rotate:
  59. script.fingers[selected].IKRotation = Handles.RotationHandle(script.fingers[selected].IKRotation, script.fingers[selected].IKPosition);
  60. break;
  61. }
  62. }
  63. }
  64. }
  65. for (int i = 0; i < script.fingers.Length; i++) {
  66. color.a = script.weight * script.fingers[i].weight;
  67. Handles.color = color;
  68. Handles.DrawLine(script.fingers[i].tip.position, script.fingers[i].IKPosition);
  69. if (script.fingers[i].weight > 0 && selected != i && script.fingers[i].initiated) {
  70. float size = IKSolverInspector.GetHandleSize(script.fingers[i].IKPosition) * 0.5f;
  71. if (Inspector.DotButton(script.fingers[i].IKPosition, Quaternion.identity, size, size)) selected = i;
  72. }
  73. }
  74. }
  75. Handles.color = Color.white;
  76. GUI.color = Color.white;
  77. }
  78. }
  79. }