115 lines
3.6 KiB
C#
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);
|
|
}
|
|
}
|
|
}
|
|
|