Пример #1
0
        public void setTransition()
        {
            if (tran == null)
            {
                tran                     = targetController.layers[0].stateMachine.AddAnyStateTransition(state);
                tran.duration            = 0;
                tran.hasFixedDuration    = false;
                tran.hasExitTime         = false;
                tran.canTransitionToSelf = false;
            }

            AnimatorCondition animatorCondition = new AnimatorCondition();

            animatorCondition.mode      = AnimatorConditionMode.Equals;
            animatorCondition.parameter = "WeaponNumber";
            animatorCondition.threshold = weaponNumber;

            var cons = tran.conditions;

            for (int i = 0; i < cons.Length; i++)
            {
                tran.RemoveCondition(cons[i]);
            }
            tran.AddCondition(AnimatorConditionMode.Equals, weaponNumber, "WeaponNumber");
            tran.AddCondition(AnimatorConditionMode.Equals, comboCount, "ComboCount");
            tran.AddCondition(AnimatorConditionMode.Equals, stateNumber, "State");
            if (oneShot)
            {
                tran.canTransitionToSelf = true;
                tran.AddCondition(AnimatorConditionMode.If, 0, "OneShot");
            }
        }
Пример #2
0
    private static void ImportTransitions(AnimatorStateMachine stateMachine, ChildAnimatorState[] states)
    {
        var transitionEquality = new TransitionEqualityComparer();

        foreach (var state in states)
        {
            foreach (var transition in state.state.transitions)
            {
                var fromState = FindStateByName(stateMachine, state.state.name);
                var toState   = FindStateByName(stateMachine, transition.destinationState.name);

                AnimatorStateTransition newTransition = new AnimatorStateTransition();
                newTransition.destinationState = toState;

                var originalCondition = transition.conditions[0];
                var conditionCopy     = new AnimatorCondition();
                conditionCopy.mode      = originalCondition.mode;
                conditionCopy.parameter = originalCondition.parameter;
                conditionCopy.threshold = originalCondition.threshold;

                newTransition.conditions = new AnimatorCondition[]
                {
                    conditionCopy
                };

                if (!fromState.transitions.Contains(newTransition, transitionEquality))
                {
                    fromState.AddTransition(newTransition);
                }
            }
        }
    }
Пример #3
0
        private void ChangeGestureCondition(AnimatorController controller, int layerToModify, int newGesture)
        {           // helper function: change gesture condition, in all transitions of 1 layer of controller
            AnimatorStateMachine stateMachine = controller.layers[layerToModify].stateMachine;

            ChildAnimatorState[]           states      = stateMachine.states;
            List <AnimatorStateTransition> transitions = new List <AnimatorStateTransition>();

            for (int i = 0; i < states.Length; i++)
            {
                transitions.AddRange(states[i].state.transitions);
            }
            AnimatorCondition[] conditions;
            for (int i = 0; i < transitions.Count; i++)
            {
                conditions = transitions[i].conditions;
                for (int j = 0; j < conditions.Length; j++)
                {
                    if (conditions[j].parameter.Contains("Gesture"))
                    {
                        AnimatorCondition conditionToRemove = conditions[j];
                        transitions[i].RemoveCondition(conditionToRemove);
                        transitions[i].AddCondition(conditionToRemove.mode, newGesture, conditionToRemove.parameter);
                        break;                         // in my case, only one condition per transition includes GestureLeft / GestureRight
                    }
                }
            }
        }
        protected AnimatorTransitionBase(AssetLayout layout, AssetInfo assetInfo, BaseParameters parameters) :
            base(layout)
        {
            AssetInfo       = assetInfo;
            ObjectHideFlags = HideFlags.HideInHierarchy;

            List <AnimatorCondition> conditionList = new List <AnimatorCondition>(parameters.ConditionConstants.Count);

            for (int i = 0; i < parameters.ConditionConstants.Count; i++)
            {
                ConditionConstant conditionConstant = parameters.ConditionConstants[i].Instance;
                if (conditionConstant.ConditionMode != AnimatorConditionMode.ExitTime)
                {
                    AnimatorCondition condition = new AnimatorCondition(conditionConstant, parameters.TOS);
                    conditionList.Add(condition);
                }
            }
            Conditions = conditionList.ToArray();

            AnimatorState state = parameters.GetDestinationState();

            DstStateMachine = default;

            DstState = state == null ? default : state.File.CreatePPtr(state);

                       Name   = parameters.Name;
                       Solo   = false;
                       Mute   = false;
                       IsExit = parameters.IsExit;
        }
Пример #5
0
 AddCondition(
     this AnimatorTransitionBase transition,
     AnimatorCondition condition)
 {
     AnimatorCondition[] temp = transition.conditions;
     ArrayUtility.Add(ref temp, condition);
     transition.conditions = temp;
 }
Пример #6
0
        public static bool HasCondition(this AnimatorStateTransition obj, string parameter, AnimatorConditionMode mode, float threshold)
        {
            var condition = new AnimatorCondition {
                parameter = parameter, mode = mode, threshold = threshold
            };

            return(obj.HasCondition(condition));
        }
Пример #7
0
 public ConditionDefinition(IAnimationDefinition parent, AnimatorCondition condition)
 {
     AnimatorCondition = condition;
     Name      = condition.parameter;
     Parent    = parent;
     Mode      = condition.mode;
     Threshold = condition.threshold;
     AddParameter(true, Name);
 }
Пример #8
0
    protected static AnimatorCondition getAnimatorCondition(string destinationStateName, float stateId)
    {
        AnimatorCondition condition = new AnimatorCondition();

        condition.mode      = AnimatorConditionMode.Equals;
        condition.parameter = "State";
        condition.threshold = stateId;
        return(condition);
    }
Пример #9
0
        /// <param name="condition"></param>
        /// <param name="lNum">レイヤー番号</param>
        /// <param name="smNum">ステートマシン番号</param>
        /// <param name="sNum">ステート番号</param>
        /// <param name="tNum">トランジション番号</param>
        /// <param name="cNum">コンディション番号</param>
        /// <returns></returns>
        public override bool OnCondition(AnimatorCondition condition, int lNum, int smNum, int sNum, int tNum, int cNum)
        {
            ConditionRecord conditionRecord = new ConditionRecord(
                lNum,
                smNum,
                sNum,
                tNum,
                cNum,
                condition);

            AconDocument.conditions.Add(conditionRecord); return(true);
        }
Пример #10
0
        void AddBitKeySwitch(int index, AnimatorControllerLayer layer, AnimatorController controller)
        {
            string trueSwitchName  = string.Format(BitKeySwitchName, "True", index);
            string falseSwitchName = string.Format(BitKeySwitchName, "False", index);

            AnimatorState falseState = layer.stateMachine.AddState(falseSwitchName);

            falseState.motion = _clipsFalse[index];
            falseState.speed  = 1;

            AnimatorCondition falseCondition = new AnimatorCondition
            {
                mode      = AnimatorConditionMode.IfNot,
                parameter = _avaCryptKeyNames[index],
                threshold = 0
            };

            AnimatorStateTransition falseTransition = layer.stateMachine.AddAnyStateTransition(falseState);

            falseTransition.canTransitionToSelf = false;
            falseTransition.duration            = 0;
            falseTransition.conditions          = new[] { falseCondition };

            AnimatorState trueState = layer.stateMachine.AddState(trueSwitchName);

            trueState.motion = _clipsTrue[index];
            trueState.speed  = 1;

            AnimatorCondition trueCondition = new AnimatorCondition
            {
                mode      = AnimatorConditionMode.If,
                parameter = _avaCryptKeyNames[index],
            };

            AnimatorStateTransition trueTransition = layer.stateMachine.AddAnyStateTransition(trueState);

            trueTransition.canTransitionToSelf = false;
            trueTransition.duration            = 0;
            trueTransition.conditions          = new[] { trueCondition };

            AssetDatabase.SaveAssets();
        }
Пример #11
0
    private static AnimatorStateTransition[] getOptimizedAnimatorStateTransition(AnimatorStateTransition[] originalTransitions, GameObject prefab, Dictionary <UnityEngine.Object, UnityEngine.Object> originalToOptObjectReferences, string animationClipsFolder)
    {
        var optTransitions = new AnimatorStateTransition[originalTransitions.Length];

        for (int i = 0; i < originalTransitions.Length; i++)
        {
            var originalTransition = originalTransitions[i];
            var newTransition      = new AnimatorStateTransition();

            newTransition.canTransitionToSelf = originalTransition.canTransitionToSelf;
            var optConditions = new AnimatorCondition[originalTransition.conditions.Length];
            for (int j = 0; j < originalTransition.conditions.Length; j++)
            {
                var newCondition      = new AnimatorCondition();
                var originalCondition = originalTransition.conditions[j];

                newCondition.mode      = originalCondition.mode;
                newCondition.parameter = originalCondition.parameter;
                newCondition.threshold = originalCondition.threshold;

                optConditions[j] = newCondition;
            }
            newTransition.conditions              = optConditions;
            newTransition.destinationState        = getOptReference(originalTransition.destinationState, prefab, originalToOptObjectReferences, animationClipsFolder);
            newTransition.destinationStateMachine = getOptReference(originalTransition.destinationStateMachine, prefab, originalToOptObjectReferences, animationClipsFolder);
            newTransition.exitTime           = originalTransition.exitTime;
            newTransition.hasExitTime        = originalTransition.hasExitTime;
            newTransition.hasFixedDuration   = originalTransition.hasFixedDuration;
            newTransition.hideFlags          = originalTransition.hideFlags;
            newTransition.interruptionSource = originalTransition.interruptionSource;
            newTransition.isExit             = originalTransition.isExit;
            newTransition.mute   = originalTransition.mute;
            newTransition.name   = originalTransition.name;
            newTransition.offset = originalTransition.offset;
            newTransition.orderedInterruption = originalTransition.orderedInterruption;
            newTransition.solo = originalTransition.solo;

            optTransitions[i] = newTransition;
        }

        return(optTransitions);
    }
Пример #12
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="condition"></param>
 /// <returns>下位を検索するなら真</returns>
 public virtual bool OnCondition(AnimatorCondition condition, int lNum, int smNum, int sNum, int tNum, int cNum)
 {
     return(false);
 }
Пример #13
0
        private void DrawAnimatorTransition(AnimatorTransitionBase transition, string source = null, CombinedAnimatorState sourceState = null, bool foldout = true)
        {
            // This is ugly. Apparently you can't modify the collection directly.
            // The only way I found that worked was to remove conditions and readd
            // on modification. There must be a better way to do it.
            // TODO: Do this the right way.
            List <AnimatorCondition> conditions = new List <AnimatorCondition>();
            bool modified = false;

            string label = GetTransitionLabel(transition, sourceState, source);

            GUILayout.BeginHorizontal();
            {
                if (foldout)
                {
                    foldouts[transition] = EditorGUILayout.Foldout(CollectionUtil.GetOrAdd(foldouts, transition, false), label);
                }
                else
                {
                    GUILayout.Label(label);
                }
                if (!foldout || foldouts[transition])
                {
                    GUILayout.FlexibleSpace();
                    if (GUILayout.Button("+", InspectorStyles.NoPaddingButtonStyle, GUILayout.Width(16), GUILayout.Height(16)))
                    {
                        AnimatorCondition condition = new AnimatorCondition();
                        condition.parameter = parameterNames[0];
                        conditions.Add(condition);
                        modified = true;
                    }
                }
            }
            GUILayout.EndHorizontal();

            if (!foldout || foldouts[transition])
            {
                for (int i = 0; i < transition.conditions.Length; i++)
                {
                    var  condition = transition.conditions[i];
                    bool remove;
                    if (DrawAnimatorCondition(ref condition, out remove))
                    {
                        if (!remove)
                        {
                            conditions.Add(condition);
                        }
                        modified = true;
                    }
                    else
                    {
                        conditions.Add(transition.conditions[i]);
                    }
                }

                if (modified)
                {
                    while (transition.conditions.Length > 0)
                    {
                        transition.RemoveCondition(transition.conditions[0]);
                    }

                    foreach (AnimatorCondition condition in conditions)
                    {
                        transition.AddCondition(condition.mode, condition.threshold, condition.parameter);
                    }
                }
            }
        }
Пример #14
0
    public override void OnInspectorGUI()
    {
        var graph = asset.Settings;

        if (GUILayout.Button("Import Mecanim Controller"))
        {
            ExportAnimations.CreateAsset(asset, (UnityEditor.Animations.AnimatorController)asset.controller);

            EditorUtility.SetDirty(asset);
            AssetDatabase.Refresh();
        }

        if (graph != null && graph.layers != null)
        {
            int layerCount = graph.layers.Length;
            if (layerCount > 0)
            {
                string[] layerNames = new string[layerCount];
                for (int l = 0; l < layerCount; l++)
                {
                    layerNames[l] = graph.layers[l].name;
                }
                selectedLayer = GUILayout.Toolbar(selectedLayer, layerNames);
                AnimatorLayer layer = graph.layers[selectedLayer];

                if (layer != null)
                {
                    int stateCount = layer.states.Length;

                    if (stateCount > 0)
                    {
                        string[] stateNames = new string[stateCount];
                        for (int s = 0; s < stateCount; s++)
                        {
                            stateNames[s] = layer.states[s].name;
                        }
                        selectedState = GUILayout.Toolbar(selectedState, stateNames);
                        AnimatorState state = layer.states[selectedState];

                        if (state != null)
                        {
                            EditorGUILayout.BeginVertical("box");

                            EditorGUILayout.LabelField("State");
                            EditorGUILayout.LabelField(state.name);
                            EditorGUILayout.LabelField(string.Format("Is Default: {0}", state.isDefault));
                            if (state.motion != null)
                            {
                                EditorGUILayout.LabelField(string.Format("Is Blend Tree: {0}", state.motion.isTree));

                                if (!state.motion.isTree)
                                {
                                    AnimatorClip motion = state.motion as AnimatorClip;
                                    AnimationClipGui(motion);
                                }
                                else
                                {
                                    AnimatorBlendTree motion = state.motion as AnimatorBlendTree;
                                    string[]          blends = new string[motion.motionCount];
                                    for (int b = 0; b < motion.motionCount; b++)
                                    {
                                        blends[b] = motion.motions[b].name;
                                    }
                                    selectedBlend = SelectionField(blends, selectedBlend, 2);

                                    AnimatorClip clip = motion.motions[selectedBlend] as AnimatorClip;
                                    AnimationClipGui(clip);
                                }
                            }
                            else
                            {
                                EditorGUILayout.LabelField("No Motion Set");
                            }

                            EditorGUILayout.Space();
                            EditorGUILayout.LabelField("Transitions");
                            int transitionCount = state.transitions.Length;
                            for (int t = 0; t < transitionCount; t++)
                            {
                                EditorGUILayout.BeginVertical("Box");

                                AnimatorTransition transition = state.transitions[t];

                                EditorGUILayout.LabelField(string.Format("{0}. {1}", transition.index, transition.name));
                                EditorGUILayout.LabelField(string.Format("Duration: {0} sec", transition.duration.AsFloat));
                                EditorGUILayout.LabelField(string.Format("Has Exit Time: {0}", transition.hasExitTime));
                                EditorGUILayout.LabelField(string.Format("Exit Time: {0} sec", transition.exitTime.AsFloat));
                                EditorGUILayout.LabelField(string.Format("Destination State (Hash): {0} ({1})", transition.destinationStateName, transition.destinationStateId));
                                EditorGUILayout.LabelField(string.Format("Offset: {0} sec", transition.offset.AsFloat));

                                int conditionCount = transition.conditions.Length;
                                for (int c = 0; c < conditionCount; c++)
                                {
                                    EditorGUILayout.BeginVertical("Box");
                                    AnimatorCondition condition = transition.conditions[c];
                                    AnimatorVariable  variable  = graph.variables[graph.VariableIndex(condition.variableName)];

                                    string conditionMode = "";
                                    switch (condition.mode)
                                    {
                                    case AnimatorCondition.Modes.Equals:
                                        conditionMode = "==";
                                        break;

                                    case AnimatorCondition.Modes.Greater:
                                        conditionMode = ">";
                                        break;

                                    case AnimatorCondition.Modes.If:
                                        conditionMode = "is true";
                                        break;

                                    case AnimatorCondition.Modes.IfNot:
                                        conditionMode = "is false";
                                        break;

                                    case AnimatorCondition.Modes.Less:
                                        conditionMode = "<";
                                        break;

                                    case AnimatorCondition.Modes.NotEqual:
                                        conditionMode = "!=";
                                        break;
                                    }

                                    string threshold = "";
                                    switch (variable.type)
                                    {
                                    case AnimatorVariable.VariableType.FP:
                                        threshold = condition.thresholdFp.AsFloat.ToString();
                                        break;

                                    case AnimatorVariable.VariableType.Int:
                                        threshold = condition.thresholdInt.ToString();
                                        break;
                                    }

                                    EditorGUILayout.LabelField(string.Format("\"{0}\" - {1} - {2}", condition.variableName, conditionMode, threshold));

                                    EditorGUILayout.EndVertical();
                                }

                                EditorGUILayout.EndVertical();
                            }

                            EditorGUILayout.EndVertical();
                        }
                    }
                }
            }
        }

        base.OnInspectorGUI();
    }
Пример #15
0
        public static bool HasCondition(this AnimatorStateTransition obj, AnimatorCondition condition)
        {
            var conditions = obj.conditions;

            return(conditions.Any(w => condition.Equals(w)));
        }
Пример #16
0
        private bool DrawAnimatorCondition(ref AnimatorCondition condition, out bool remove)
        {
            bool modified = false;

            remove = false;
            EditorGUILayout.BeginHorizontal();
            {
                if (!nameToParameter.ContainsKey(condition.parameter))
                {
                    string name = EditorGUILayout.TextField(condition.parameter);
                    if (name != condition.parameter)
                    {
                        condition.parameter = name;
                        modified            = true;
                    }
                    AnimatorConditionMode mode = (AnimatorConditionMode)EditorGUILayout.EnumPopup(condition.mode);
                    if (mode != condition.mode)
                    {
                        condition.mode = mode;
                        modified       = true;
                    }
                    string result = EditorGUILayout.TextField("" + condition.threshold);
                    float  resultValue;
                    if (float.TryParse(result, out resultValue) && resultValue != condition.threshold)
                    {
                        condition.threshold = resultValue;
                        modified            = true;
                    }
                }
                else
                {
                    int parameterIndex = nameToParameterIndex[condition.parameter];
                    int index          = EditorGUILayout.Popup(parameterIndex, parameterNames);
                    AnimatorControllerParameter parameter = parameters[index];
                    if (index != parameterIndex)
                    {
                        condition.parameter = parameter.name;
                        modified            = true;
                    }
                    if (parameter.type == AnimatorControllerParameterType.Bool)
                    {
                        int selectedCondition = Math.Max(0, System.Array.IndexOf(boolConditions, condition.mode));
                        int conditionIdx      = EditorGUILayout.Popup(selectedCondition, boolConditionNames);
                        if (conditionIdx != selectedCondition)
                        {
                            condition.mode = boolConditions[conditionIdx];
                            modified       = true;
                        }
                    }
                    else if (parameter.type != AnimatorControllerParameterType.Trigger)
                    {
                        int selectedCondition = System.Array.IndexOf(conditionModes, condition.mode);
                        int conditionIdx      = EditorGUILayout.Popup(selectedCondition, conditionModeNames);
                        if (conditionIdx != selectedCondition)
                        {
                            condition.mode = conditionModes[conditionIdx];
                            modified       = true;
                        }

                        AnimationStateSet set = null;
                        if (parameter.name.EndsWith("ItemID"))
                        {
                            set = stateCollection.ItemIds;
                        }
                        else if (parameter.name.EndsWith("StateIndex"))
                        {
                            set = stateCollection.ItemStateIndexes;
                        }
                        else if (parameter.name.EndsWith("AbilityIndex"))
                        {
                            set = stateCollection.AbilityIndexes;
                        }
                        else
                        {
                            string result = EditorGUILayout.TextField("" + condition.threshold);
                            float  resultValue;
                            if (float.TryParse(result, out resultValue) && resultValue != condition.threshold)
                            {
                                condition.threshold = resultValue;
                                modified            = true;
                            }
                        }
                        if (null != set)
                        {
                            int id = set.DrawStateSet((int)condition.threshold);
                            if (id != condition.threshold)
                            {
                                condition.threshold = id;
                                modified            = true;
                            }
                        }
                    }
                }

                if (GUILayout.Button(InspectorStyles.DeleteIcon, InspectorStyles.NoPaddingButtonStyle, GUILayout.Width(16), GUILayout.Height(16)))
                {
                    remove   = true;
                    modified = true;
                }
            }
            EditorGUILayout.EndHorizontal();
            return(modified);
        }
Пример #17
0
            // [SerializeField] public float threshold;

            public ConditionJson(AnimatorCondition animatorCondition, Urho3DEngine engine, PrefabContext prefabContext)
            {
                this.mode      = animatorCondition.mode;
                this.parameter = animatorCondition.parameter;
                // this.threshold = animatorCondition.threshold;
            }
Пример #18
0
 public ConditionDefinition AddCondition(AnimatorCondition condition)
 {
     return(Children.AddChild(new ConditionDefinition(this, condition)));
 }
Пример #19
0
 public static bool Equals(this AnimatorCondition obj1, AnimatorCondition obj2)
 {
     return(obj1.parameter == obj2.parameter && obj1.mode == obj2.mode && Math.Abs(obj1.threshold - obj2.threshold) == 0);
 }
Пример #20
0
    AnimatorStateTransition[] ProcessTransitions(AnimatorStateTransition[] transitions)
    {
        List <AnimatorStateTransition> transitionsToAdd = new List <AnimatorStateTransition>();

        for (int t = 0; t < transitions.Length; t++)
        {
            List <AnimatorCondition> conditionsToAdd = new List <AnimatorCondition>();

            // Debug.Log(transitions[t].conditions.Length + " conditions");

            for (int c = 0; c < transitions[t].conditions.Length; c++)
            {
                AnimatorCondition condition = transitions[t].conditions[c];

                // Debug.Log("CHECK " + condition.parameter + " " + condition.mode + " " + condition.threshold);

                // TODO: Use switch
                if (condition.mode == AnimatorConditionMode.Equals)
                {
                    if (condition.parameter == "GestureLeft" || condition.parameter == "GestureRight")
                    {
                        float chilloutGestureNumber = GetChilloutGestureNumberForVrchatGestureNumber(condition.threshold);

                        AnimatorCondition newConditionLessThan = new AnimatorCondition();
                        newConditionLessThan.parameter = condition.parameter;
                        newConditionLessThan.mode      = AnimatorConditionMode.Less;
                        newConditionLessThan.threshold = (float)(chilloutGestureNumber + 0.1);

                        conditionsToAdd.Add(newConditionLessThan);

                        AnimatorCondition newConditionGreaterThan = new AnimatorCondition();
                        newConditionGreaterThan.parameter = condition.parameter;
                        newConditionGreaterThan.mode      = AnimatorConditionMode.Greater;
                        newConditionGreaterThan.threshold = (float)(chilloutGestureNumber - 0.1);

                        conditionsToAdd.Add(newConditionGreaterThan);
                    }
                    else
                    {
                        AnimatorCondition newConditionLessThan = new AnimatorCondition();
                        newConditionLessThan.parameter = condition.parameter;
                        newConditionLessThan.mode      = AnimatorConditionMode.Less;
                        newConditionLessThan.threshold = (float)(condition.threshold + 0.1);

                        conditionsToAdd.Add(newConditionLessThan);

                        AnimatorCondition newConditionGreaterThan = new AnimatorCondition();
                        newConditionGreaterThan.parameter = condition.parameter;
                        newConditionGreaterThan.mode      = AnimatorConditionMode.Greater;
                        newConditionGreaterThan.threshold = (float)(condition.threshold - 0.1);

                        conditionsToAdd.Add(newConditionGreaterThan);
                    }
                }
                else if (condition.mode == AnimatorConditionMode.NotEqual)
                {
                    if (condition.parameter == "GestureLeft" || condition.parameter == "GestureRight")
                    {
                        float chilloutGestureNumber = GetChilloutGestureNumberForVrchatGestureNumber(condition.threshold);

                        AnimatorCondition newConditionLessThan = new AnimatorCondition();
                        newConditionLessThan.parameter = condition.parameter;
                        newConditionLessThan.mode      = AnimatorConditionMode.Less;
                        newConditionLessThan.threshold = (float)(chilloutGestureNumber - 0.1);

                        conditionsToAdd.Add(newConditionLessThan);
                    }
                    else
                    {
                        AnimatorCondition newConditionLessThan = new AnimatorCondition();
                        newConditionLessThan.parameter = condition.parameter;
                        newConditionLessThan.mode      = AnimatorConditionMode.Less;
                        newConditionLessThan.threshold = (float)(condition.threshold - 0.1);

                        conditionsToAdd.Add(newConditionLessThan);

                        AnimatorStateTransition newTransition = AnimatorStateTransition.Instantiate(transitions[t]);
                        newTransition.conditions = new AnimatorCondition[] {
                            new AnimatorCondition()
                            {
                                parameter = condition.parameter,
                                mode      = AnimatorConditionMode.Greater,
                                threshold = (float)(condition.threshold + 0.1)
                            }
                        };

                        transitionsToAdd.Add(newTransition);
                    }
                }
                else if (condition.mode == AnimatorConditionMode.If)
                {
                    AnimatorCondition newConditionLessThan = new AnimatorCondition();
                    newConditionLessThan.parameter = condition.parameter;
                    newConditionLessThan.mode      = AnimatorConditionMode.Less;
                    newConditionLessThan.threshold = (float)1.1;

                    conditionsToAdd.Add(newConditionLessThan);

                    AnimatorCondition newConditionGreaterThan = new AnimatorCondition();
                    newConditionGreaterThan.parameter = condition.parameter;
                    newConditionGreaterThan.mode      = AnimatorConditionMode.Greater;
                    newConditionGreaterThan.threshold = (float)0.5;

                    conditionsToAdd.Add(newConditionGreaterThan);
                }
                else if (condition.mode == AnimatorConditionMode.IfNot)
                {
                    AnimatorCondition newConditionLessThan = new AnimatorCondition();
                    newConditionLessThan.parameter = condition.parameter;
                    newConditionLessThan.mode      = AnimatorConditionMode.Less;
                    newConditionLessThan.threshold = (float)0.49;

                    conditionsToAdd.Add(newConditionLessThan);

                    AnimatorCondition newConditionGreaterThan = new AnimatorCondition();
                    newConditionGreaterThan.parameter = condition.parameter;
                    newConditionGreaterThan.mode      = AnimatorConditionMode.Greater;
                    newConditionGreaterThan.threshold = (float)-0.1;

                    conditionsToAdd.Add(newConditionGreaterThan);
                }
                else if (condition.mode == AnimatorConditionMode.Greater)
                {
                    AnimatorCondition newCondition = new AnimatorCondition();
                    newCondition.parameter = condition.parameter;
                    newCondition.mode      = AnimatorConditionMode.Greater;
                    newCondition.threshold = condition.threshold;

                    conditionsToAdd.Add(newCondition);
                }
                else if (condition.mode == AnimatorConditionMode.Less)
                {
                    AnimatorCondition newCondition = new AnimatorCondition();
                    newCondition.parameter = condition.parameter;
                    newCondition.mode      = AnimatorConditionMode.Less;
                    newCondition.threshold = condition.threshold;

                    conditionsToAdd.Add(newCondition);
                }
            }

            transitions[t].conditions = conditionsToAdd.ToArray();
        }

        AnimatorStateTransition[] newTransitions = new AnimatorStateTransition[transitions.Length + transitionsToAdd.Count];

        transitions.CopyTo(newTransitions, 0);
        transitionsToAdd.ToArray().CopyTo(newTransitions, transitions.Length);

        return(newTransitions);
    }
Пример #21
0
    /// <summary>
    /// 显示过渡条件
    /// </summary>
    /// <param name="state">State.</param>
    /// <param name="transitions">Transitions.</param>
    public void ShowTransitionConditionGUI(AnimatorState state, AnimatorStateTransition[] transitions)
    {
        GUILayout.BeginVertical();
        {
            for (int i = 0; i < transitions.Length; i++)
            {
                AnimatorStateTransition transition = transitions[i];
                GUILayout.BeginHorizontal();
                {
                    GUILayout.Space(50f);
                    GUILayout.Label(state.name + "-> " + transition.destinationState.name);
                    AnimatorCondition[] conditions = transition.conditions;
                    for (int j = 0; j < conditions.Length; j++)
                    {
                        AnimatorCondition condition           = conditions[j];//结构体值拷贝
                        int selectedParameterIndex            = listStrParameter.FindIndex(str => str == condition.parameter);
                        AnimatorControllerParameter parameter = listParameter[selectedParameterIndex];
                        //显示
                        int newSelectedParameterIndex = EditorGUILayout.Popup(selectedParameterIndex, listStrParameter.ToArray());
                        AnimatorConditionMode mode    = condition.mode;
                        float threshold = condition.threshold;
                        ModeAndThresholdPopUp(ref mode, ref threshold, parameter.type);
                        if (j < conditions.Length - 1)
                        {
                            GUILayout.Label("&&");
                        }
                        GUILayout.FlexibleSpace();//使左对齐
                        //保存
                        if (newSelectedParameterIndex != selectedParameterIndex)
                        {
                            condition.parameter = listStrParameter[newSelectedParameterIndex];
                            AnimatorControllerParameter selectedParameter = listParameter[newSelectedParameterIndex];
                            switch (selectedParameter.type)
                            {
                            case AnimatorControllerParameterType.Bool:
                                condition.mode      = AnimatorConditionMode.If;
                                condition.threshold = 0f;
                                break;

                            case AnimatorControllerParameterType.Int:
                                condition.mode      = AnimatorConditionMode.Equals;
                                condition.threshold = (float)selectedParameter.defaultInt;
                                break;

                            case AnimatorControllerParameterType.Float:
                                condition.mode      = AnimatorConditionMode.Greater;
                                condition.threshold = selectedParameter.defaultFloat;
                                break;

                            case AnimatorControllerParameterType.Trigger:
                                condition.mode      = AnimatorConditionMode.If;
                                condition.threshold = 0f;
                                break;
                            }
                            conditions[j]         = condition;
                            transition.conditions = conditions;
                        }
                        else if (mode != condition.mode || threshold > condition.threshold || threshold < condition.threshold)
                        {
                            condition.mode        = mode;
                            condition.threshold   = threshold;
                            conditions[j]         = condition;
                            transition.conditions = conditions;
                        }
                    }
                }
                GUILayout.EndHorizontal();
            }
        }
        GUILayout.EndVertical();
    }