void OnEnable()
        {
            m_Weight = serializedObject.FindProperty("m_Weight");
            m_SourceObjectsToggle = serializedObject.FindProperty("m_SourceObjectsGUIToggle");
            m_SettingsToggle      = serializedObject.FindProperty("m_SettingsGUIToggle");

            var data = serializedObject.FindProperty("m_Data");

            m_ConstrainedObject = data.FindPropertyRelative("m_ConstrainedObject");
            m_AimAxis           = data.FindPropertyRelative("m_AimAxis");
            m_UpAxis            = data.FindPropertyRelative("m_UpAxis");
            m_WorldUpType       = data.FindPropertyRelative("m_WorldUpType");
            m_WorldUpAxis       = data.FindPropertyRelative("m_WorldUpAxis");
            m_WorldUpObject     = data.FindPropertyRelative("m_WorldUpObject");
            m_SourceObjects     = data.FindPropertyRelative("m_SourceObjects");
            m_MaintainOffset    = data.FindPropertyRelative("m_MaintainOffset");
            m_Offset            = data.FindPropertyRelative("m_Offset");
            m_ConstrainedAxes   = data.FindPropertyRelative("m_ConstrainedAxes");
            m_MinLimit          = data.FindPropertyRelative("m_MinLimit");
            m_MaxLimit          = data.FindPropertyRelative("m_MaxLimit");

            m_Constraint         = (MultiAimConstraint)serializedObject.targetObject;
            m_SourceObjectsArray = m_Constraint.data.sourceObjects;

            var dataType  = m_Constraint.data.GetType();
            var fieldInfo = dataType.GetField("m_SourceObjects", BindingFlags.NonPublic | BindingFlags.Instance);
            var range     = fieldInfo.GetCustomAttribute <RangeAttribute>();

            if (m_SourceObjectsArray.Count == 0)
            {
                m_SourceObjectsArray.Add(WeightedTransform.Default(1f));
                m_Constraint.data.sourceObjects = m_SourceObjectsArray;
            }

            m_ReorderableList = WeightedTransformHelper.CreateReorderableList(m_SourceObjects, ref m_SourceObjectsArray, range);

            m_ReorderableList.onChangedCallback = (ReorderableList reorderableList) =>
            {
                Undo.RegisterCompleteObjectUndo(m_Constraint, "Edit MultiAim");
                m_Constraint.data.sourceObjects = (WeightedTransformArray)reorderableList.list;
                if (PrefabUtility.IsPartOfPrefabInstance(m_Constraint))
                {
                    EditorUtility.SetDirty(m_Constraint);
                }
            };

            Undo.undoRedoPerformed += () =>
            {
                m_ReorderableList.list = m_Constraint.data.sourceObjects;
            };
        }
        public static Vector3 GetRotAxis(MultiAimConstraint multiAimConstraint)
        {
            if (multiAimConstraint == null)
            {
                return(Vector3.zero);
            }

            var xAxis = multiAimConstraint.data.constrainedXAxis;
            var yAxis = multiAimConstraint.data.constrainedYAxis;
            var zAxis = multiAimConstraint.data.constrainedZAxis;

            int count = 0;

            count += xAxis ? 1 : 0;
            count += yAxis ? 1 : 0;
            count += zAxis ? 1 : 0;

            if (count != 1)
            {
                return(Vector3.zero);
            }

            if (xAxis)
            {
                return(Vector3.right);
            }

            if (yAxis)
            {
                return(Vector3.up);
            }

            if (zAxis)
            {
                return(Vector3.forward);
            }

            return(Vector3.zero);
        }
        void OnEnable()
        {
            m_Weight = serializedObject.FindProperty("m_Weight");
            m_SourceObjectsToggle = serializedObject.FindProperty("m_SourceObjectsGUIToggle");
            m_SettingsToggle      = serializedObject.FindProperty("m_SettingsGUIToggle");

            var data = serializedObject.FindProperty("m_Data");

            m_ConstrainedObject = data.FindPropertyRelative("m_ConstrainedObject");
            m_AimAxis           = data.FindPropertyRelative("m_AimAxis");
            m_SourceObjects     = data.FindPropertyRelative("m_SourceObjects");
            m_MaintainOffset    = data.FindPropertyRelative("m_MaintainOffset");
            m_Offset            = data.FindPropertyRelative("m_Offset");
            m_ConstrainedAxes   = data.FindPropertyRelative("m_ConstrainedAxes");
            m_MinLimit          = data.FindPropertyRelative("m_MinLimit");
            m_MaxLimit          = data.FindPropertyRelative("m_MaxLimit");

            m_Constraint         = (MultiAimConstraint)serializedObject.targetObject;
            m_SourceObjectsArray = m_Constraint.data.sourceObjects;

            var dataType  = m_Constraint.data.GetType();
            var fieldInfo = dataType.GetField("m_SourceObjects", BindingFlags.NonPublic | BindingFlags.Instance);
            var range     = fieldInfo.GetCustomAttribute <RangeAttribute>();

            if (m_SourceObjectsArray.Count == 0)
            {
                m_SourceObjectsArray.Add(WeightedTransform.Default(1f));
                m_Constraint.data.sourceObjects = m_SourceObjectsArray;
            }

            m_ReorderableList = WeightedTransformHelper.CreateReorderableList(m_SourceObjects, ref m_SourceObjectsArray, range);

            m_ReorderableList.onChangedCallback = (ReorderableList reorderableList) =>
            {
                m_Constraint.data.sourceObjects = (WeightedTransformArray)reorderableList.list;
            };
        }
 public MultiAimInverseConstraint(MultiAimConstraint baseConstraint) : base(baseConstraint)
 {
 }