186 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
		
		
			
		
	
	
			186 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| 
								 | 
							
								///////////////////////////////////////////////////////////////////////////
							 | 
						|||
| 
								 | 
							
								//  IK Helper Tool 1.1 - IK Remover StateMachineBehaviour                //
							 | 
						|||
| 
								 | 
							
								//  Kevin Iglesias - https://www.keviniglesias.com/     			     //
							 | 
						|||
| 
								 | 
							
								//  Contact Support: support@keviniglesias.com                           //
							 | 
						|||
| 
								 | 
							
								//  Documentation: 														 //
							 | 
						|||
| 
								 | 
							
								//  https://www.keviniglesias.com/assets/IKHelperTool/Documentation.pdf  //
							 | 
						|||
| 
								 | 
							
								///////////////////////////////////////////////////////////////////////////
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								using System.Collections;
							 | 
						|||
| 
								 | 
							
								using System.Collections.Generic;
							 | 
						|||
| 
								 | 
							
								using UnityEngine;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								//For custom inspector only
							 | 
						|||
| 
								 | 
							
								#if UNITY_EDITOR
							 | 
						|||
| 
								 | 
							
									using UnityEditor;
							 | 
						|||
| 
								 | 
							
								#endif
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								namespace KevinIglesias {
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
									public class IKHelperToolSMBRemover : StateMachineBehaviour
							 | 
						|||
| 
								 | 
							
									{
							 | 
						|||
| 
								 | 
							
										private IKHelperTool iKHTScript;
							 | 
						|||
| 
								 | 
							
										
							 | 
						|||
| 
								 | 
							
										public int id;
							 | 
						|||
| 
								 | 
							
										
							 | 
						|||
| 
								 | 
							
										public bool clearAll;
							 | 
						|||
| 
								 | 
							
										
							 | 
						|||
| 
								 | 
							
										public bool smoothExit;
							 | 
						|||
| 
								 | 
							
										
							 | 
						|||
| 
								 | 
							
								        public float delay;
							 | 
						|||
| 
								 | 
							
								        
							 | 
						|||
| 
								 | 
							
										public float speed;
							 | 
						|||
| 
								 | 
							
										
							 | 
						|||
| 
								 | 
							
										// OnStateEnter is called when a transition starts and the state machine starts to evaluate this state
							 | 
						|||
| 
								 | 
							
										override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											if(iKHTScript == null)
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												iKHTScript = animator.GetComponent<IKHelperTool>();
							 | 
						|||
| 
								 | 
							
								               
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
											
							 | 
						|||
| 
								 | 
							
											if(iKHTScript != null)
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												iKHTScript.ClearIK(clearAll, id, delay, smoothExit, speed);
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
									}
							 | 
						|||
| 
								 | 
							
								    
							 | 
						|||
| 
								 | 
							
								#if UNITY_EDITOR
							 | 
						|||
| 
								 | 
							
									//Custom Inspector
							 | 
						|||
| 
								 | 
							
									[CustomEditor(typeof(IKHelperToolSMBRemover))]
							 | 
						|||
| 
								 | 
							
								    public class IKHelperToolSMBRemoverCustomInspector : Editor
							 | 
						|||
| 
								 | 
							
								    {
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
										public override void OnInspectorGUI()
							 | 
						|||
| 
								 | 
							
										{
							 | 
						|||
| 
								 | 
							
											var SMBScript = target as IKHelperToolSMBRemover;
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
											
							 | 
						|||
| 
								 | 
							
											GUI.enabled = true;
							 | 
						|||
| 
								 | 
							
								            GUILayout.Space(5);
							 | 
						|||
| 
								 | 
							
											
							 | 
						|||
| 
								 | 
							
											if(!SMBScript.clearAll)
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												GUILayout.BeginHorizontal();
							 | 
						|||
| 
								 | 
							
												EditorGUI.BeginChangeCheck();
							 | 
						|||
| 
								 | 
							
												EditorStyles.label.fontStyle = FontStyle.Bold;
							 | 
						|||
| 
								 | 
							
												int iID = EditorGUILayout.IntField("State IK ID:", SMBScript.id);
							 | 
						|||
| 
								 | 
							
												EditorStyles.label.fontStyle = FontStyle.Normal;
							 | 
						|||
| 
								 | 
							
												if(EditorGUI.EndChangeCheck()) {
							 | 
						|||
| 
								 | 
							
													Undo.RegisterUndo(target, "Changed ID");
							 | 
						|||
| 
								 | 
							
													SMBScript.id = iID;
							 | 
						|||
| 
								 | 
							
												}
							 | 
						|||
| 
								 | 
							
												GUILayout.EndHorizontal();
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
											
							 | 
						|||
| 
								 | 
							
											GUILayout.BeginHorizontal();
							 | 
						|||
| 
								 | 
							
											EditorGUI.BeginChangeCheck();
							 | 
						|||
| 
								 | 
							
											bool iBool = EditorGUILayout.Toggle("Clear All IK States", SMBScript.clearAll);
							 | 
						|||
| 
								 | 
							
											if(EditorGUI.EndChangeCheck()) {
							 | 
						|||
| 
								 | 
							
												Undo.RegisterUndo(target, "Clear All IK States");
							 | 
						|||
| 
								 | 
							
												SMBScript.clearAll = iBool;
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
											GUILayout.EndHorizontal();
							 | 
						|||
| 
								 | 
							
								
							 | 
						|||
| 
								 | 
							
								            GUILayout.BeginHorizontal();
							 | 
						|||
| 
								 | 
							
											EditorGUI.BeginChangeCheck();
							 | 
						|||
| 
								 | 
							
											float iFloat = EditorGUILayout.FloatField("Delay (seconds)", SMBScript.delay);
							 | 
						|||
| 
								 | 
							
											if(EditorGUI.EndChangeCheck()) {
							 | 
						|||
| 
								 | 
							
												Undo.RegisterUndo(target, "Change Delay");
							 | 
						|||
| 
								 | 
							
												SMBScript.delay = iFloat;
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
											GUILayout.EndHorizontal();
							 | 
						|||
| 
								 | 
							
								            
							 | 
						|||
| 
								 | 
							
											GUILayout.BeginHorizontal();
							 | 
						|||
| 
								 | 
							
											EditorGUI.BeginChangeCheck();
							 | 
						|||
| 
								 | 
							
											iBool = EditorGUILayout.Toggle("Smooth Exit", SMBScript.smoothExit);
							 | 
						|||
| 
								 | 
							
											if(EditorGUI.EndChangeCheck()) {
							 | 
						|||
| 
								 | 
							
												Undo.RegisterUndo(target, "Change Smooth Exit");
							 | 
						|||
| 
								 | 
							
												SMBScript.smoothExit = iBool;
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
											GUILayout.EndHorizontal();
							 | 
						|||
| 
								 | 
							
											
							 | 
						|||
| 
								 | 
							
											if(SMBScript.smoothExit)
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												GUI.enabled = true;
							 | 
						|||
| 
								 | 
							
											}else{
							 | 
						|||
| 
								 | 
							
												GUI.enabled = false;
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
											
							 | 
						|||
| 
								 | 
							
								            if(SMBScript.speed < 0.01f)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                SMBScript.speed = 0.01f;
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
								            
							 | 
						|||
| 
								 | 
							
											GUILayout.BeginHorizontal();
							 | 
						|||
| 
								 | 
							
											EditorGUI.BeginChangeCheck();
							 | 
						|||
| 
								 | 
							
											iFloat = EditorGUILayout.FloatField("Speed (seconds):", SMBScript.speed);
							 | 
						|||
| 
								 | 
							
											if(EditorGUI.EndChangeCheck()) {
							 | 
						|||
| 
								 | 
							
												Undo.RegisterUndo(target, "Change IK Speed");
							 | 
						|||
| 
								 | 
							
												SMBScript.speed = iFloat;
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
											GUILayout.EndHorizontal();
							 | 
						|||
| 
								 | 
							
											GUI.enabled = true;
							 | 
						|||
| 
								 | 
							
											
							 | 
						|||
| 
								 | 
							
											GUILayout.Space(2);
							 | 
						|||
| 
								 | 
							
											
							 | 
						|||
| 
								 | 
							
											GUILayout.BeginHorizontal();
							 | 
						|||
| 
								 | 
							
											GUIContent buttonContent;
							 | 
						|||
| 
								 | 
							
											if(EditorApplication.isPlaying)
							 | 
						|||
| 
								 | 
							
											{
							 | 
						|||
| 
								 | 
							
												if(IKHelperUtils.clearClipboard)
							 | 
						|||
| 
								 | 
							
												{
							 | 
						|||
| 
								 | 
							
													buttonContent = new GUIContent("Variables copied!", "Copy changes made in Play Mode");
							 | 
						|||
| 
								 | 
							
												}else{
							 | 
						|||
| 
								 | 
							
													buttonContent = new GUIContent("Copy variables", "Copy changes made in Play Mode");
							 | 
						|||
| 
								 | 
							
												}
							 | 
						|||
| 
								 | 
							
												if(GUILayout.Button(buttonContent))
							 | 
						|||
| 
								 | 
							
												{
							 | 
						|||
| 
								 | 
							
													IKHelperUtils.savedRemoverSMB.id = SMBScript.id;
							 | 
						|||
| 
								 | 
							
													IKHelperUtils.savedRemoverSMB.clearAll = SMBScript.clearAll;
							 | 
						|||
| 
								 | 
							
													IKHelperUtils.savedRemoverSMB.smoothExit = SMBScript.smoothExit;
							 | 
						|||
| 
								 | 
							
													IKHelperUtils.savedRemoverSMB.delay = SMBScript.delay;
							 | 
						|||
| 
								 | 
							
													IKHelperUtils.savedRemoverSMB.speed = SMBScript.speed;
							 | 
						|||
| 
								 | 
							
													
							 | 
						|||
| 
								 | 
							
													IKHelperUtils.clearClipboard = true;
							 | 
						|||
| 
								 | 
							
												}
							 | 
						|||
| 
								 | 
							
											}else{
							 | 
						|||
| 
								 | 
							
												
							 | 
						|||
| 
								 | 
							
												GUI.enabled = IKHelperUtils.clearClipboard;
							 | 
						|||
| 
								 | 
							
												buttonContent = new GUIContent("Paste variables", "Paste changes made in Play Mode");
							 | 
						|||
| 
								 | 
							
												if(GUILayout.Button(buttonContent))
							 | 
						|||
| 
								 | 
							
												{
							 | 
						|||
| 
								 | 
							
													EditorGUI.BeginChangeCheck();
							 | 
						|||
| 
								 | 
							
													GUI.changed = true;
							 | 
						|||
| 
								 | 
							
													
							 | 
						|||
| 
								 | 
							
													if(EditorGUI.EndChangeCheck()) {
							 | 
						|||
| 
								 | 
							
														Undo.RegisterUndo(target, "Pasted variables");
							 | 
						|||
| 
								 | 
							
													}
							 | 
						|||
| 
								 | 
							
													
							 | 
						|||
| 
								 | 
							
													SMBScript.id = IKHelperUtils.savedRemoverSMB.id;
							 | 
						|||
| 
								 | 
							
													SMBScript.clearAll = IKHelperUtils.savedRemoverSMB.clearAll;
							 | 
						|||
| 
								 | 
							
													SMBScript.smoothExit = IKHelperUtils.savedRemoverSMB.smoothExit;
							 | 
						|||
| 
								 | 
							
													SMBScript.delay = IKHelperUtils.savedRemoverSMB.delay;
							 | 
						|||
| 
								 | 
							
													SMBScript.speed = IKHelperUtils.savedRemoverSMB.speed;
							 | 
						|||
| 
								 | 
							
								                    
							 | 
						|||
| 
								 | 
							
								                    Debug.Log("Pasted variables.");
							 | 
						|||
| 
								 | 
							
												}	
							 | 
						|||
| 
								 | 
							
												GUI.enabled = true;
							 | 
						|||
| 
								 | 
							
											}
							 | 
						|||
| 
								 | 
							
											GUILayout.EndHorizontal();
							 | 
						|||
| 
								 | 
							
											
							 | 
						|||
| 
								 | 
							
											if(GUI.changed)
							 | 
						|||
| 
								 | 
							
								            {
							 | 
						|||
| 
								 | 
							
								                if(!EditorApplication.isPlaying)
							 | 
						|||
| 
								 | 
							
												{
							 | 
						|||
| 
								 | 
							
													EditorUtility.SetDirty(target);
							 | 
						|||
| 
								 | 
							
													EditorApplication.MarkSceneDirty();
							 | 
						|||
| 
								 | 
							
								                }
							 | 
						|||
| 
								 | 
							
								            }
							 | 
						|||
| 
								 | 
							
										}
							 | 
						|||
| 
								 | 
							
									}
							 | 
						|||
| 
								 | 
							
								#endif	
							 | 
						|||
| 
								 | 
							
								}
							 |