RoboticArms/Library/PackageCache/com.unity.animation.rigging@68167b505d2b/Runtime/AnimationRig/Constraints/MultiReferentialConstraint.cs
2025-11-17 15:16:36 +07:00

92 lines
3.0 KiB
C#

using System.Collections.Generic;
namespace UnityEngine.Animations.Rigging
{
/// <summary>
/// The MultiReferential constraint data.
/// </summary>
[System.Serializable]
public struct MultiReferentialConstraintData : IAnimationJobData, IMultiReferentialConstraintData
{
[SyncSceneToStream, SerializeField] int m_Driver;
[SyncSceneToStream, SerializeField] List<Transform> m_SourceObjects;
/// <summary>The driver index. This is a value in between 0 and the number of sourceObjects.</summary>
public int driver
{
get => m_Driver;
set => m_Driver = Mathf.Clamp(value, 0, m_SourceObjects.Count - 1);
}
/// <summary>The list of Transforms that are affected by the specified driver.</summary>
public List<Transform> sourceObjects
{
get
{
if (m_SourceObjects == null)
m_SourceObjects = new List<Transform>();
return m_SourceObjects;
}
set
{
m_SourceObjects = value;
m_Driver = Mathf.Clamp(m_Driver, 0, m_SourceObjects.Count - 1);
}
}
/// <inheritdoc />
Transform[] IMultiReferentialConstraintData.sourceObjects => m_SourceObjects.ToArray();
/// <inheritdoc />
int IMultiReferentialConstraintData.driverValue => m_Driver;
/// <inheritdoc />
string IMultiReferentialConstraintData.driverIntProperty => ConstraintsUtils.ConstructConstraintDataPropertyName(nameof(m_Driver));
/// <inheritdoc />
bool IAnimationJobData.IsValid()
{
if (m_SourceObjects.Count < 2)
return false;
foreach (var src in m_SourceObjects)
if (src == null)
return false;
return true;
}
/// <inheritdoc />
void IAnimationJobData.SetDefaultValues()
{
m_Driver = 0;
m_SourceObjects = new List<Transform>();
}
/// <summary>
/// Updates the driver index to match the number of source objects.
/// </summary>
public void UpdateDriver() =>
m_Driver = Mathf.Clamp(m_Driver, 0, m_SourceObjects != null ? m_SourceObjects.Count - 1 : 0);
}
/// <summary>
/// MultiReferential constraint.
/// </summary>
[DisallowMultipleComponent, AddComponentMenu("Animation Rigging/Multi-Referential Constraint")]
[HelpURL("https://docs.unity3d.com/Packages/com.unity.animation.rigging@1.3/manual/constraints/MultiReferentialConstraint.html")]
public class MultiReferentialConstraint : RigConstraint<
MultiReferentialConstraintJob,
MultiReferentialConstraintData,
MultiReferentialConstraintJobBinder<MultiReferentialConstraintData>
>
{
/// <inheritdoc />
protected override void OnValidate()
{
base.OnValidate();
m_Data.UpdateDriver();
}
}
}