IKManager2D.cs 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. using System;
  2. using System.Collections.Generic;
  3. using UnityEngine.Scripting.APIUpdating;
  4. namespace UnityEngine.U2D.IK
  5. {
  6. /// <summary>
  7. /// Component to manager 2D IK Solvers.
  8. /// </summary>
  9. [DefaultExecutionOrder(-2)]
  10. [MovedFrom("UnityEngine.Experimental.U2D.IK")]
  11. public partial class IKManager2D : MonoBehaviour
  12. {
  13. [SerializeField]
  14. private List<Solver2D> m_Solvers = new List<Solver2D>();
  15. [SerializeField][Range(0f, 1f)]
  16. private float m_Weight = 1f;
  17. /// <summary>
  18. /// Get and Set the weight for solvers.
  19. /// </summary>
  20. public float weight
  21. {
  22. get { return m_Weight; }
  23. set { m_Weight = Mathf.Clamp01(value); }
  24. }
  25. /// <summary>
  26. /// Get the Solvers that are managed by this manager.
  27. /// </summary>
  28. public List<Solver2D> solvers
  29. {
  30. get { return m_Solvers; }
  31. }
  32. private void OnValidate()
  33. {
  34. m_Weight = Mathf.Clamp01(m_Weight);
  35. OnEditorDataValidate();
  36. }
  37. private void OnEnable()
  38. {
  39. }
  40. private void Reset()
  41. {
  42. FindChildSolvers();
  43. OnEditorDataValidate();
  44. }
  45. private void FindChildSolvers()
  46. {
  47. m_Solvers.Clear();
  48. List<Solver2D> solvers = new List<Solver2D>();
  49. transform.GetComponentsInChildren<Solver2D>(true, solvers);
  50. foreach (Solver2D solver in solvers)
  51. {
  52. if (solver.GetComponentInParent<IKManager2D>() == this)
  53. AddSolver(solver);
  54. }
  55. }
  56. /// <summary>
  57. /// Add Solver to the manager.
  58. /// </summary>
  59. /// <param name="solver">Solver to add.</param>
  60. public void AddSolver(Solver2D solver)
  61. {
  62. if (!m_Solvers.Contains(solver))
  63. {
  64. m_Solvers.Add(solver);
  65. AddSolverEditorData();
  66. }
  67. }
  68. /// <summary>
  69. /// Remove Solver from the manager.
  70. /// </summary>
  71. /// <param name="solver">Solver to remove.</param>
  72. public void RemoveSolver(Solver2D solver)
  73. {
  74. RemoveSolverEditorData(solver);
  75. m_Solvers.Remove(solver);
  76. }
  77. /// <summary>
  78. /// Updates the Solvers in this manager.
  79. /// </summary>
  80. public void UpdateManager()
  81. {
  82. foreach (var solver in m_Solvers)
  83. {
  84. if (solver == null || !solver.isActiveAndEnabled)
  85. continue;
  86. if (!solver.isValid)
  87. solver.Initialize();
  88. solver.UpdateIK(weight);
  89. }
  90. }
  91. private void LateUpdate()
  92. {
  93. UpdateManager();
  94. }
  95. #if UNITY_EDITOR
  96. internal static Events.UnityEvent onDrawGizmos = new Events.UnityEvent();
  97. private void OnDrawGizmos() { onDrawGizmos.Invoke(); }
  98. #endif
  99. }
  100. }