PO/Library/PackageCache/com.unity.2d.animation@5.0.7/IK/Runtime/IKManager2D.cs

117 lines
3.0 KiB
C#

using System;
using System.Collections.Generic;
using UnityEngine.Scripting.APIUpdating;
namespace UnityEngine.U2D.IK
{
/// <summary>
/// Component to manager 2D IK Solvers.
/// </summary>
[DefaultExecutionOrder(-2)]
[MovedFrom("UnityEngine.Experimental.U2D.IK")]
public partial class IKManager2D : MonoBehaviour
{
[SerializeField]
private List<Solver2D> m_Solvers = new List<Solver2D>();
[SerializeField][Range(0f, 1f)]
private float m_Weight = 1f;
/// <summary>
/// Get and Set the weight for solvers.
/// </summary>
public float weight
{
get { return m_Weight; }
set { m_Weight = Mathf.Clamp01(value); }
}
/// <summary>
/// Get the Solvers that are managed by this manager.
/// </summary>
public List<Solver2D> solvers
{
get { return m_Solvers; }
}
private void OnValidate()
{
m_Weight = Mathf.Clamp01(m_Weight);
OnEditorDataValidate();
}
private void OnEnable()
{
}
private void Reset()
{
FindChildSolvers();
OnEditorDataValidate();
}
private void FindChildSolvers()
{
m_Solvers.Clear();
List<Solver2D> solvers = new List<Solver2D>();
transform.GetComponentsInChildren<Solver2D>(true, solvers);
foreach (Solver2D solver in solvers)
{
if (solver.GetComponentInParent<IKManager2D>() == this)
AddSolver(solver);
}
}
/// <summary>
/// Add Solver to the manager.
/// </summary>
/// <param name="solver">Solver to add.</param>
public void AddSolver(Solver2D solver)
{
if (!m_Solvers.Contains(solver))
{
m_Solvers.Add(solver);
AddSolverEditorData();
}
}
/// <summary>
/// Remove Solver from the manager.
/// </summary>
/// <param name="solver">Solver to remove.</param>
public void RemoveSolver(Solver2D solver)
{
RemoveSolverEditorData(solver);
m_Solvers.Remove(solver);
}
/// <summary>
/// Updates the Solvers in this manager.
/// </summary>
public void UpdateManager()
{
foreach (var solver in m_Solvers)
{
if (solver == null || !solver.isActiveAndEnabled)
continue;
if (!solver.isValid)
solver.Initialize();
solver.UpdateIK(weight);
}
}
private void LateUpdate()
{
UpdateManager();
}
#if UNITY_EDITOR
internal static Events.UnityEvent onDrawGizmos = new Events.UnityEvent();
private void OnDrawGizmos() { onDrawGizmos.Invoke(); }
#endif
}
}