using UnityEngine; using System.Collections; using UnityEditor; namespace RootMotion.FinalIK { // Custom Scene View handles for the FingerRig. [CustomEditor(typeof(FingerRig))] public class FingerRigInspector : Editor { private FingerRig script { get { return target as FingerRig; }} private int selected = -1; private MonoScript monoScript; void OnEnable() { if (serializedObject == null) return; // Changing the script execution order if (!Application.isPlaying) { monoScript = MonoScript.FromMonoBehaviour(script); int currentExecutionOrder = MonoImporter.GetExecutionOrder(monoScript); if (currentExecutionOrder != 10000) MonoImporter.SetExecutionOrder(monoScript, 10000); } } void OnSceneGUI() { if (!script.enabled) return; string message = string.Empty; if (!script.IsValid(ref message)) return; if (Application.isPlaying && !script.initiated) return; Color color = Color.cyan; color.a = script.weight; Handles.color = color; GUI.color = color; // Display the bones if (!Application.isPlaying) { for (int i = 0; i < script.fingers.Length; i++) { Handles.DrawLine(script.fingers[i].bone1.position, script.fingers[i].bone2.position); Inspector.SphereCap(0, script.fingers[i].bone1.position, Quaternion.identity, IKSolverInspector.GetHandleSize(script.fingers[i].bone1.position) * 0.5f); Inspector.SphereCap(0, script.fingers[i].bone2.position, Quaternion.identity, IKSolverInspector.GetHandleSize(script.fingers[i].bone2.position) * 0.5f); if (script.fingers[i].bone3 != null) { Handles.DrawLine(script.fingers[i].bone2.position, script.fingers[i].bone3.position); Handles.DrawLine(script.fingers[i].bone3.position, script.fingers[i].tip.position); Inspector.SphereCap(0, script.fingers[i].bone3.position, Quaternion.identity, IKSolverInspector.GetHandleSize(script.fingers[i].bone3.position) * 0.5f); } else { Handles.DrawLine(script.fingers[i].bone2.position, script.fingers[i].tip.position); } Inspector.SphereCap(0, script.fingers[i].tip.position, Quaternion.identity, IKSolverInspector.GetHandleSize(script.fingers[i].tip.position) * 0.5f); } } // Selecting solvers if (Application.isPlaying) { if (selected >= 0 && selected < script.fingers.Length) { if (script.fingers[selected].weight > 0f) { color.a = script.weight * script.fingers[selected].weight; Handles.color = color; float size = IKSolverInspector.GetHandleSize(script.fingers[selected].IKPosition); Inspector.CubeCap(0, script.fingers[selected].IKPosition, script.fingers[selected].IKRotation, size); if (script.fingers[selected].target == null) { switch(Tools.current) { case Tool.Move: script.fingers[selected].IKPosition = Handles.PositionHandle(script.fingers[selected].IKPosition, Tools.pivotRotation == PivotRotation.Local? script.fingers[selected].IKRotation: Quaternion.identity); break; case Tool.Rotate: script.fingers[selected].IKRotation = Handles.RotationHandle(script.fingers[selected].IKRotation, script.fingers[selected].IKPosition); break; } } } } for (int i = 0; i < script.fingers.Length; i++) { color.a = script.weight * script.fingers[i].weight; Handles.color = color; Handles.DrawLine(script.fingers[i].tip.position, script.fingers[i].IKPosition); if (script.fingers[i].weight > 0 && selected != i && script.fingers[i].initiated) { float size = IKSolverInspector.GetHandleSize(script.fingers[i].IKPosition) * 0.5f; if (Inspector.DotButton(script.fingers[i].IKPosition, Quaternion.identity, size, size)) selected = i; } } } Handles.color = Color.white; GUI.color = Color.white; } } }