IKEffectorInspector.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. using UnityEngine;
  2. using UnityEditor;
  3. using System.Collections;
  4. namespace RootMotion.FinalIK {
  5. /*
  6. * Custom inspector and scene view tools for IKEffector
  7. * */
  8. public class IKEffectorInspector: IKSolverInspector {
  9. #region Public methods
  10. public static void DrawArrayElementEffector(SerializedProperty effector, bool editHierarchy) {
  11. if (!editHierarchy) return;
  12. if (effector.FindPropertyRelative("bones").arraySize > 1) {
  13. GUILayout.BeginHorizontal();
  14. GUILayout.Space(indent);
  15. AddClampedFloat(effector.FindPropertyRelative("falloff"), new GUIContent("Distance Falloff", string.Empty), 0f, Mathf.Infinity);
  16. GUILayout.EndHorizontal();
  17. }
  18. AddArray(effector.FindPropertyRelative("bones"), new GUIContent("Bones", string.Empty), editHierarchy, false, null, OnAddToArrayBone, DrawArrayElementLabelBone, false);
  19. if (effector.isExpanded) EditorGUILayout.Space();
  20. }
  21. public static void OnAddToArrayEffector(SerializedProperty effector) {
  22. effector.FindPropertyRelative("positionWeight").floatValue = 0f;
  23. effector.FindPropertyRelative("rotationWeight").floatValue = 0f;
  24. effector.FindPropertyRelative("falloff").floatValue = 0.5f;
  25. effector.FindPropertyRelative("position").vector3Value = Vector3.zero;
  26. effector.FindPropertyRelative("positionOffset").vector3Value = Vector3.zero;
  27. }
  28. public static void DrawArrayElementLabelEffector(SerializedProperty effector, bool editHierarchy) {
  29. GUILayout.Space(Inspector.indent);
  30. if (editHierarchy) {
  31. EditorGUILayout.PropertyField(effector, new GUIContent(GetArrayName(effector.FindPropertyRelative("bones"), "Effector"), string.Empty), false, GUILayout.Width(100));
  32. } else {
  33. EditorGUILayout.LabelField(new GUIContent(GetArrayName(effector.FindPropertyRelative("bones"), "Effector"), string.Empty), GUILayout.Width(100));
  34. }
  35. GUILayout.Space(10);
  36. GUILayout.Label("Position", GUILayout.Width(50));
  37. effector.FindPropertyRelative("positionWeight").floatValue = GUILayout.HorizontalSlider(effector.FindPropertyRelative("positionWeight").floatValue, 0f, 1f, GUILayout.Width(50));
  38. GUILayout.Space(5);
  39. GUILayout.Label("Rotation", GUILayout.Width(50));
  40. effector.FindPropertyRelative("rotationWeight").floatValue = GUILayout.HorizontalSlider(effector.FindPropertyRelative("rotationWeight").floatValue, 0f, 1f, GUILayout.Width(50));
  41. if (!editHierarchy && effector.FindPropertyRelative("bones").arraySize > 1) {
  42. EditorGUILayout.LabelField(new GUIContent("Falloff", string.Empty), GUILayout.Width(50));
  43. EditorGUILayout.PropertyField(effector.FindPropertyRelative("falloff"), GUIContent.none);
  44. effector.FindPropertyRelative("falloff").floatValue = Mathf.Clamp(effector.FindPropertyRelative("falloff").floatValue, 0f, Mathf.Infinity);
  45. }
  46. }
  47. public static void AddScene(IKEffector e, Color color, bool modifiable, float size) {
  48. if (!modifiable) return;
  49. // Draw effectors
  50. bool rotate = e.isEndEffector;
  51. float weight = rotate? Mathf.Max(e.positionWeight, e.rotationWeight): e.positionWeight;
  52. if (e.bone != null && weight > 0) {
  53. //if (Application.isPlaying) {
  54. Handles.color = new Color(color.r, color.g, color.b, weight);
  55. Handles.DrawLine(e.position, e.bone.position);
  56. Inspector.SphereCap(0, e.bone.position, Quaternion.identity, size * 0.5f);
  57. // Manipulating position and rotation
  58. if (e.target == null) {
  59. switch(Tools.current) {
  60. case Tool.Move:
  61. e.position = Handles.PositionHandle(e.position, Quaternion.identity);
  62. break;
  63. case Tool.Rotate:
  64. if (rotate) e.rotation = Handles.RotationHandle(e.rotation, e.position);
  65. break;
  66. }
  67. }
  68. if (rotate) Inspector.CubeCap(0, e.position, e.rotation, size);
  69. else Inspector.SphereCap(0, e.position, Quaternion.identity, size);
  70. //}
  71. }
  72. }
  73. #endregion Public methods
  74. private static void DrawArrayElementLabelBone(SerializedProperty bone, bool editHierarchy) {
  75. AddObjectReference(bone, GUIContent.none, editHierarchy, 0, 300);
  76. }
  77. private static void OnAddToArrayBone(SerializedProperty bone) {
  78. bone.objectReferenceValue = null;
  79. }
  80. }
  81. }