EditorIK.cs 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. using UnityEngine;
  2. using System.Collections;
  3. namespace RootMotion.FinalIK
  4. {
  5. /// <summary>
  6. /// Updates any Final IK component in Editor mode
  7. /// </summary>
  8. [ExecuteInEditMode]
  9. public class EditorIK : MonoBehaviour
  10. {
  11. [Tooltip("If slot assigned, will update Animator before IK.")] public Animator animator;
  12. [Tooltip("Create/Final IK/Editor IK Pose")] public EditorIKPose defaultPose;
  13. [HideInInspector] public Transform[] bones = new Transform[0];
  14. public IK ik { get; private set; }
  15. private void OnEnable()
  16. {
  17. if (Application.isPlaying) return;
  18. if (ik == null) ik = GetComponent<IK>();
  19. if (ik == null)
  20. {
  21. Debug.LogError("EditorIK needs to have an IK component on the same GameObject.", transform);
  22. return;
  23. }
  24. if (bones.Length == 0) bones = ik.transform.GetComponentsInChildren<Transform>();
  25. }
  26. private void OnDisable()
  27. {
  28. if (Application.isPlaying) return;
  29. if (defaultPose != null && defaultPose.poseStored) defaultPose.Restore(bones);
  30. if (ik != null) ik.GetIKSolver().executedInEditor = false;
  31. }
  32. private void OnDestroy()
  33. {
  34. if (Application.isPlaying) return;
  35. if (ik == null) return;
  36. if (bones.Length == 0) bones = ik.transform.GetComponentsInChildren<Transform>();
  37. if (defaultPose != null && defaultPose.poseStored && bones.Length != 0) defaultPose.Restore(bones);
  38. ik.GetIKSolver().executedInEditor = false;
  39. }
  40. public void StoreDefaultPose()
  41. {
  42. bones = ik.transform.GetComponentsInChildren<Transform>();
  43. defaultPose.Store(bones);
  44. }
  45. public bool Initiate()
  46. {
  47. if (defaultPose == null) return false;
  48. if (!defaultPose.poseStored) return false;
  49. if (bones.Length == 0) return false;
  50. if (ik == null) ik = GetComponent<IK>();
  51. if (ik == null)
  52. {
  53. Debug.LogError("EditorIK can not find an IK component.", transform);
  54. return false;
  55. }
  56. defaultPose.Restore(bones);
  57. ik.GetIKSolver().executedInEditor = false;
  58. ik.GetIKSolver().Initiate(ik.transform);
  59. ik.GetIKSolver().executedInEditor = true;
  60. return true;
  61. }
  62. public void Update()
  63. {
  64. if (Application.isPlaying) return;
  65. if (ik == null) return;
  66. if (!ik.enabled) return;
  67. if (!ik.GetIKSolver().executedInEditor) return;
  68. if (bones.Length == 0) bones = ik.transform.GetComponentsInChildren<Transform>();
  69. if (bones.Length == 0) return;
  70. if (!defaultPose.Restore(bones)) return;
  71. ik.GetIKSolver().executedInEditor = false;
  72. if (!ik.GetIKSolver().initiated) ik.GetIKSolver().Initiate(ik.transform);
  73. if (!ik.GetIKSolver().initiated) return;
  74. ik.GetIKSolver().executedInEditor = true;
  75. if (animator != null && animator.runtimeAnimatorController != null) animator.Update(Time.deltaTime);
  76. ik.GetIKSolver().Update();
  77. }
  78. }
  79. }