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.
		
		
		
		
		
			
		
			
	
	
		
			94 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C#
		
	
		
		
			
		
	
	
			94 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C#
		
	
| 
								 
											1 year ago
										 
									 | 
							
								using UnityEditor;
							 | 
						||
| 
								 | 
							
								using UnityEngine;
							 | 
						||
| 
								 | 
							
								using System.Collections;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace RootMotion.FinalIK
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /*
							 | 
						||
| 
								 | 
							
									 * Custom inspector for RotationLimitAngle.
							 | 
						||
| 
								 | 
							
									 * */
							 | 
						||
| 
								 | 
							
								    [CustomEditor(typeof(RotationLimitAngle))]
							 | 
						||
| 
								 | 
							
								    [CanEditMultipleObjects]
							 | 
						||
| 
								 | 
							
								    public class RotationLimitAngleInspector : RotationLimitInspector
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        private RotationLimitAngle script { get { return target as RotationLimitAngle; } }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        #region Inspector
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        public override void OnInspectorGUI()
							 | 
						||
| 
								 | 
							
								        {
							 | 
						||
| 
								 | 
							
								            GUI.changed = false;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            // Draw the default inspector
							 | 
						||
| 
								 | 
							
								            DrawDefaultInspector();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            script.limit = Mathf.Clamp(script.limit, 0, 180);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            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;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            DrawRotationSphere(script.transform.position);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            // Display the main axis
							 | 
						||
| 
								 | 
							
								            DrawArrow(script.transform.position, Direction(script.axis), colorDefault, "Axis", 0.02f);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            Vector3 swing = script.axis.normalized;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            // Display limits
							 | 
						||
| 
								 | 
							
								            lastPoint = script.transform.position;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            for (int i = 0; i < 360; i += 2)
							 | 
						||
| 
								 | 
							
								            {
							 | 
						||
| 
								 | 
							
								                Quaternion offset = Quaternion.AngleAxis(i, swing);
							 | 
						||
| 
								 | 
							
								                Quaternion limitedRotation = Quaternion.AngleAxis(script.limit, offset * script.crossAxis);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                Vector3 limitedDirection = Direction(limitedRotation * swing);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                Handles.color = colorDefaultTransparent;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                Vector3 limitPoint = script.transform.position + limitedDirection;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                if (i == 0) zeroPoint = limitPoint;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                Handles.DrawLine(script.transform.position, limitPoint);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                if (i > 0)
							 | 
						||
| 
								 | 
							
								                {
							 | 
						||
| 
								 | 
							
								                    Handles.color = colorDefault;
							 | 
						||
| 
								 | 
							
								                    Handles.DrawLine(limitPoint, lastPoint);
							 | 
						||
| 
								 | 
							
								                    if (i == 358) Handles.DrawLine(limitPoint, zeroPoint);
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								                lastPoint = limitPoint;
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								            Handles.color = Color.white;
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        private Vector3 lastPoint, zeroPoint;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        /*
							 | 
						||
| 
								 | 
							
										 * 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
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |