using System.Collections.Generic; namespace UnityEngine.Animations.Rigging { /// /// The MultiReferential constraint data. /// [System.Serializable] public struct MultiReferentialConstraintData : IAnimationJobData, IMultiReferentialConstraintData { [SyncSceneToStream, SerializeField] int m_Driver; [SyncSceneToStream, SerializeField] List m_SourceObjects; /// The driver index. This is a value in between 0 and the number of sourceObjects. public int driver { get => m_Driver; set => m_Driver = Mathf.Clamp(value, 0, m_SourceObjects.Count - 1); } /// The list of Transforms that are affected by the specified driver. public List sourceObjects { get { if (m_SourceObjects == null) m_SourceObjects = new List(); return m_SourceObjects; } set { m_SourceObjects = value; m_Driver = Mathf.Clamp(m_Driver, 0, m_SourceObjects.Count - 1); } } /// Transform[] IMultiReferentialConstraintData.sourceObjects => m_SourceObjects.ToArray(); /// int IMultiReferentialConstraintData.driverValue => m_Driver; /// string IMultiReferentialConstraintData.driverIntProperty => ConstraintsUtils.ConstructConstraintDataPropertyName(nameof(m_Driver)); /// bool IAnimationJobData.IsValid() { if (m_SourceObjects.Count < 2) return false; foreach (var src in m_SourceObjects) if (src == null) return false; return true; } /// void IAnimationJobData.SetDefaultValues() { m_Driver = 0; m_SourceObjects = new List(); } /// /// Updates the driver index to match the number of source objects. /// public void UpdateDriver() => m_Driver = Mathf.Clamp(m_Driver, 0, m_SourceObjects != null ? m_SourceObjects.Count - 1 : 0); } /// /// MultiReferential constraint. /// [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 > { /// protected override void OnValidate() { base.OnValidate(); m_Data.UpdateDriver(); } } }