You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
	
	
		
			119 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C#
		
	
		
		
			
		
	
	
			119 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			C#
		
	
| 
								 
											1 year ago
										 
									 | 
							
								using UnityEditor;
							 | 
						||
| 
								 | 
							
								using UnityEngine;
							 | 
						||
| 
								 | 
							
								using System.Collections;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace RootMotion.FinalIK
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /*
							 | 
						||
| 
								 | 
							
									 * Custom inspector for RotationLimitHinge
							 | 
						||
| 
								 | 
							
									 * */
							 | 
						||
| 
								 | 
							
								    [CustomEditor(typeof(RotationLimitHinge))]
							 | 
						||
| 
								 | 
							
								    [CanEditMultipleObjects]
							 | 
						||
| 
								 | 
							
								    public class RotationLimitHingeInspector : RotationLimitInspector
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        private RotationLimitHinge script { get { return target as RotationLimitHinge; } }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        #region Inspector
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        public override void OnInspectorGUI()
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            GUI.changed = false;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            // Draw the default inspector
							 | 
						||
| 
								 | 
							
								            DrawDefaultInspector();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if (GUI.changed) EditorUtility.SetDirty(script);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        #endregion Inspector
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        #region Scene
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        void OnSceneGUI()
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            // Set defaultLocalRotation so that the initial local rotation will be the zero point for the rotation limit
							 | 
						||
| 
								 | 
							
								            if (!Application.isPlaying && !script.defaultLocalRotationOverride) script.defaultLocalRotation = script.transform.localRotation;
							 | 
						||
| 
								 | 
							
								            if (script.axis == Vector3.zero) return;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            // Quick Editing Tools
							 | 
						||
| 
								 | 
							
								            Handles.BeginGUI();
							 | 
						||
| 
								 | 
							
								            GUILayout.BeginArea(new Rect(10, 10, 200, 50), "Rotation Limit Hinge", "Window");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            // Rotating display
							 | 
						||
| 
								 | 
							
								            if (GUILayout.Button("Rotate display 90 degrees"))
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                if (!Application.isPlaying) Undo.RecordObject(script, "Rotate Display");
							 | 
						||
| 
								 | 
							
								                script.zeroAxisDisplayOffset += 90;
							 | 
						||
| 
								 | 
							
								                if (script.zeroAxisDisplayOffset >= 360) script.zeroAxisDisplayOffset = 0;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            GUILayout.EndArea();
							 | 
						||
| 
								 | 
							
								            Handles.EndGUI();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            // Normalize the main axes
							 | 
						||
| 
								 | 
							
								            Vector3 axis = Direction(script.axis.normalized);
							 | 
						||
| 
								 | 
							
								            Vector3 cross = Direction(Quaternion.AngleAxis(script.zeroAxisDisplayOffset, script.axis) * script.crossAxis.normalized);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            // Axis vector
							 | 
						||
| 
								 | 
							
								            DrawArrow(script.transform.position, axis, colorDefault, "Axis", 0.02f);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if (script.useLimits)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                // Zero rotation vector
							 | 
						||
| 
								 | 
							
								                DrawArrow(script.transform.position, cross * 0.5f, colorDefault, " 0", 0.02f);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                // Arcs for the rotation limit
							 | 
						||
| 
								 | 
							
								                Handles.color = colorDefaultTransparent;
							 | 
						||
| 
								 | 
							
								                Handles.DrawSolidArc(script.transform.position, axis, cross, script.min, 0.5f);
							 | 
						||
| 
								 | 
							
								                Handles.DrawSolidArc(script.transform.position, axis, cross, script.max, 0.5f);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            Handles.color = colorDefault;
							 | 
						||
| 
								 | 
							
								            GUI.color = colorDefault;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            Inspector.CircleCap(0, script.transform.position, Quaternion.LookRotation(axis, cross), 0.5f);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            if (!script.useLimits) return;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            // Handles for adjusting rotation limits in the scene
							 | 
						||
| 
								 | 
							
								            Quaternion minRotation = Quaternion.AngleAxis(script.min, axis);
							 | 
						||
| 
								 | 
							
								            Handles.DrawLine(script.transform.position, script.transform.position + minRotation * cross);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            Quaternion maxRotation = Quaternion.AngleAxis(script.max, axis);
							 | 
						||
| 
								 | 
							
								            Handles.DrawLine(script.transform.position, script.transform.position + maxRotation * cross);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            // Undoable scene handles
							 | 
						||
| 
								 | 
							
								            float min = script.min;
							 | 
						||
| 
								 | 
							
								            min = DrawLimitHandle(min, script.transform.position + minRotation * cross, Quaternion.identity, 0.5f, "Min", -10);
							 | 
						||
| 
								 | 
							
								            if (min != script.min)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                if (!Application.isPlaying) Undo.RecordObject(script, "Min Limit");
							 | 
						||
| 
								 | 
							
								                script.min = min;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            float max = script.max;
							 | 
						||
| 
								 | 
							
								            max = DrawLimitHandle(max, script.transform.position + maxRotation * cross, Quaternion.identity, 0.5f, "Max", 10);
							 | 
						||
| 
								 | 
							
								            if (max != script.max)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                if (!Application.isPlaying) Undo.RecordObject(script, "Max Limit");
							 | 
						||
| 
								 | 
							
								                script.max = max;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            Handles.color = Color.white;
							 | 
						||
| 
								 | 
							
								            GUI.color = Color.white;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        /*
							 | 
						||
| 
								 | 
							
										 * Converting directions from local space to world space
							 | 
						||
| 
								 | 
							
										 * */
							 | 
						||
| 
								 | 
							
								        private Vector3 Direction(Vector3 v)
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            if (script.transform.parent == null) return script.defaultLocalRotation * v;
							 | 
						||
| 
								 | 
							
								            return script.transform.parent.rotation * (script.defaultLocalRotation * v);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        #endregion Scene
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |