namespace UnityEngine.Animations.Rigging { /// /// The MultiParent constraint data. /// [System.Serializable] public struct MultiParentConstraintData : IAnimationJobData, IMultiParentConstraintData { [SerializeField] Transform m_ConstrainedObject; [SerializeField, SyncSceneToStream, WeightRange(0f, 1f)] WeightedTransformArray m_SourceObjects; [NotKeyable, SerializeField] Vector3Bool m_ConstrainedPositionAxes; [NotKeyable, SerializeField] Vector3Bool m_ConstrainedRotationAxes; [NotKeyable, SerializeField] bool m_MaintainPositionOffset; [NotKeyable, SerializeField] bool m_MaintainRotationOffset; /// public Transform constrainedObject { get => m_ConstrainedObject; set => m_ConstrainedObject = value; } /// public WeightedTransformArray sourceObjects { get => m_SourceObjects; set => m_SourceObjects = value; } /// public bool maintainPositionOffset { get => m_MaintainPositionOffset; set => m_MaintainPositionOffset = value; } /// public bool maintainRotationOffset { get => m_MaintainRotationOffset; set => m_MaintainRotationOffset = value; } /// public bool constrainedPositionXAxis { get => m_ConstrainedPositionAxes.x; set => m_ConstrainedPositionAxes.x = value; } /// public bool constrainedPositionYAxis { get => m_ConstrainedPositionAxes.y; set => m_ConstrainedPositionAxes.y = value; } /// public bool constrainedPositionZAxis { get => m_ConstrainedPositionAxes.z; set => m_ConstrainedPositionAxes.z = value; } /// public bool constrainedRotationXAxis { get => m_ConstrainedRotationAxes.x; set => m_ConstrainedRotationAxes.x = value; } /// public bool constrainedRotationYAxis { get => m_ConstrainedRotationAxes.y; set => m_ConstrainedRotationAxes.y = value; } /// public bool constrainedRotationZAxis { get => m_ConstrainedRotationAxes.z; set => m_ConstrainedRotationAxes.z = value; } /// string IMultiParentConstraintData.sourceObjectsProperty => ConstraintsUtils.ConstructConstraintDataPropertyName(nameof(m_SourceObjects)); /// bool IAnimationJobData.IsValid() { if (m_ConstrainedObject == null || m_SourceObjects.Count == 0) return false; foreach (var src in m_SourceObjects) if (src.transform == null) return false; return true; } /// void IAnimationJobData.SetDefaultValues() { m_ConstrainedObject = null; m_ConstrainedPositionAxes = new Vector3Bool(true); m_ConstrainedRotationAxes = new Vector3Bool(true); m_SourceObjects.Clear(); m_MaintainPositionOffset = false; m_MaintainRotationOffset = false; } } /// /// MultiParent constraint /// [DisallowMultipleComponent, AddComponentMenu("Animation Rigging/Multi-Parent Constraint")] [HelpURL("https://docs.unity3d.com/Packages/com.unity.animation.rigging@1.3/manual/constraints/MultiParentConstraint.html")] public class MultiParentConstraint : RigConstraint< MultiParentConstraintJob, MultiParentConstraintData, MultiParentConstraintJobBinder > { /// protected override void OnValidate() { base.OnValidate(); var weights = m_Data.sourceObjects; WeightedTransformArray.OnValidate(ref weights); m_Data.sourceObjects = weights; } } }