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.

95 lines
3.2 KiB
C#

6 months ago
using UnityEngine;
using System.Collections;
namespace RootMotion.FinalIK
{
/// <summary>
/// Updates any Final IK component in Editor mode
/// </summary>
[ExecuteInEditMode]
public class EditorIK : MonoBehaviour
{
[Tooltip("If slot assigned, will update Animator before IK.")] public Animator animator;
[Tooltip("Create/Final IK/Editor IK Pose")] public EditorIKPose defaultPose;
[HideInInspector] public Transform[] bones = new Transform[0];
public IK ik { get; private set; }
private void OnEnable()
{
if (Application.isPlaying) return;
if (ik == null) ik = GetComponent<IK>();
if (ik == null)
{
Debug.LogError("EditorIK needs to have an IK component on the same GameObject.", transform);
return;
}
if (bones.Length == 0) bones = ik.transform.GetComponentsInChildren<Transform>();
}
private void OnDisable()
{
if (Application.isPlaying) return;
if (defaultPose != null && defaultPose.poseStored) defaultPose.Restore(bones);
if (ik != null) ik.GetIKSolver().executedInEditor = false;
}
private void OnDestroy()
{
if (Application.isPlaying) return;
if (ik == null) return;
if (bones.Length == 0) bones = ik.transform.GetComponentsInChildren<Transform>();
if (defaultPose != null && defaultPose.poseStored && bones.Length != 0) defaultPose.Restore(bones);
ik.GetIKSolver().executedInEditor = false;
}
public void StoreDefaultPose()
{
bones = ik.transform.GetComponentsInChildren<Transform>();
defaultPose.Store(bones);
}
public bool Initiate()
{
if (defaultPose == null) return false;
if (!defaultPose.poseStored) return false;
if (bones.Length == 0) return false;
if (ik == null) ik = GetComponent<IK>();
if (ik == null)
{
Debug.LogError("EditorIK can not find an IK component.", transform);
return false;
}
defaultPose.Restore(bones);
ik.GetIKSolver().executedInEditor = false;
ik.GetIKSolver().Initiate(ik.transform);
ik.GetIKSolver().executedInEditor = true;
return true;
}
public void Update()
{
if (Application.isPlaying) return;
if (ik == null) return;
if (!ik.enabled) return;
if (!ik.GetIKSolver().executedInEditor) return;
if (bones.Length == 0) bones = ik.transform.GetComponentsInChildren<Transform>();
if (bones.Length == 0) return;
if (!defaultPose.Restore(bones)) return;
ik.GetIKSolver().executedInEditor = false;
if (!ik.GetIKSolver().initiated) ik.GetIKSolver().Initiate(ik.transform);
if (!ik.GetIKSolver().initiated) return;
ik.GetIKSolver().executedInEditor = true;
if (animator != null && animator.runtimeAnimatorController != null) animator.Update(Time.deltaTime);
ik.GetIKSolver().Update();
}
}
}