holopy3/Assets/Plugins/RootMotion/Editor/FinalIK/BipedIKInspector.cs
2020-12-10 15:25:12 +01:00

115 lines
3.6 KiB
C#

using UnityEditor;
using UnityEngine;
using System.Collections;
using System;
namespace RootMotion.FinalIK {
/*
* Custom inspector for Biped IK.
* */
[CustomEditor(typeof(BipedIK))]
public class BipedIKInspector : Editor {
private BipedIK script { get { return target as BipedIK; }}
private int selectedSolver = -1;
private SerializedProperty references, solvers;
private SerializedProperty[] solversProps;
private SerializedContent fixTransforms;
public void OnEnable() {
if (serializedObject == null) return;
// Store the MonoScript for changing script execution order
if (!Application.isPlaying) {
MonoScript monoScript = MonoScript.FromMonoBehaviour(script);
// Changing the script execution order to make sure BipedIK always executes after any other script except FullBodyBipedIK
int executionOrder = MonoImporter.GetExecutionOrder(monoScript);
if (executionOrder != 9998) MonoImporter.SetExecutionOrder(monoScript, 9998);
}
references = serializedObject.FindProperty("references");
solvers = serializedObject.FindProperty("solvers");
solversProps = BipedIKSolversInspector.FindProperties(solvers);
fixTransforms = new SerializedContent(serializedObject.FindProperty("fixTransforms"), new GUIContent("Fix Transforms", "If true, will fix all the Transforms used by the solver to their initial state in each Update. This prevents potential problems with unanimated bones and animator culling with a small cost of performance."));
// Automatically detecting references
if (!Application.isPlaying) {
if (script.references.isEmpty) {
BipedReferences.AutoDetectReferences(ref script.references, script.transform, new BipedReferences.AutoDetectParams(false, true));
references.isExpanded = true;
solvers.isExpanded = false;
for (int i = 0; i < solversProps.Length; i++) solversProps[i].isExpanded = false;
// Setting default values and initiating
script.InitiateBipedIK();
script.SetToDefaults();
EditorUtility.SetDirty(script);
} else script.InitiateBipedIK();
Warning.logged = false;
string message = string.Empty;
if (Application.isPlaying) {
if (BipedReferences.SetupError(script.references, ref message) || BipedReferences.SetupWarning(script.references, ref message)) {
Warning.Log(message, script.references.root, false);
}
}
}
}
// Override the default warning box
private void AddWarningBox(string message) {
EditorGUILayout.Space();
EditorGUILayout.LabelField("Invalid/incomplete setup, can't initiate solver. " + message, EditorStyles.helpBox);
EditorGUILayout.Space();
}
public override void OnInspectorGUI() {
serializedObject.Update();
EditorGUILayout.Space();
Inspector.AddContent(fixTransforms);
string message = string.Empty;
// Editing References
if (BipedReferencesInspector.AddModifiedInspector(references)) {
if (!Application.isPlaying) {
Warning.logged = false;
if (!BipedReferences.SetupError(script.references, ref message)) {
script.InitiateBipedIK();
}
}
}
if (BipedReferences.SetupError(script.references, ref message)) {
// Warning box
AddWarningBox(message);
Warning.Log(message, script.transform, false);
} else {
// Editing Solvers
BipedIKSolversInspector.AddInspector(solvers, solversProps);
}
EditorGUILayout.Space();
serializedObject.ApplyModifiedProperties();
}
void OnSceneGUI() {
if (!script.enabled) return;
// Draw the scene view helpers for the solvers
BipedIKSolversInspector.AddScene(script.solvers, ref selectedSolver);
}
}
}