Esempio n. 1
0
 private void SetStateTransitions(AnimatorStateTransition transition)
 {
     if (transition.conditions.Length == 0)
     {
         transition.hasExitTime      = true;
         transition.exitTime         = 1;
         transition.hasFixedDuration = false;
         transition.duration         = 0;
         return;
     }
     foreach (var condition in transition.conditions)
     {
         if (condition.parameter == "Init")
         {
             transition.hasExitTime      = false;
             transition.exitTime         = 0;
             transition.hasFixedDuration = false;
             transition.duration         = 0;
             return;
         }
     }
     transition.hasExitTime      = this.transition.exitTime > 0;
     transition.exitTime         = this.transition.exitTime > 0 ? this.transition.exitTime : 0;
     transition.hasFixedDuration = false;
     transition.duration         = this.transition.duration;
 }
        void ConnectBlendTrees(int offset, AnimatorState[] blendTrees, int layer)
        {
            int c = blendTrees.Length;

            for (int i = 0; i < c; i++)
            {
                for (int j = 0; j < c; j++)
                {
                    if (i == j)
                    {
                        continue;
                    }
                    AnimatorStateTransition exit = blendTrees[i].AddTransition(blendTrees[j]);
                    //exit.AddCondition(AnimatorConditionMode.Equals, i, CustomAnimator.sActiveLoop);
                    exit.AddCondition(AnimatorConditionMode.Equals, j + offset, CustomAnimator.activeLoopParamStrings[layer]);

                    exit.canTransitionToSelf = false;                             // false;// true;
                    exit.interruptionSource  = TransitionInterruptionSource.None; // TransitionInterruptionSource.Destination;
                    exit.hasExitTime         = false;
                    // exit.exitTime = exit_time;
                    exit.hasFixedDuration = true;
                    exit.duration         = exitTransitionDuration;
                }
            }
        }
Esempio n. 3
0
        static AnimatorState AddState(AnimatorController control, string clipName, bool loop = false, bool addParam = false, bool defaultState = false)
        {
            AnimatorStateMachine rootStateMachine = control.layers[0].stateMachine;
            AnimatorState        tempState        = rootStateMachine.AddState(clipName);
            AnimationClip        tempClip         = new AnimationClip()
            {
                name = clipName
            };

            tempState.motion = tempClip;
            if (defaultState)
            {
                rootStateMachine.defaultState = tempState;
            }
            if (addParam)
            {
                AddParam(control, clipName);
                AnimatorStateTransition tempTransition = rootStateMachine.AddAnyStateTransition(tempState);
                tempTransition.AddCondition(AnimatorConditionMode.If, 0, clipName);
                tempTransition.duration = 0;
            }
            AssetDatabase.AddObjectToAsset(tempClip, control);
            AssetDatabase.ImportAsset(AssetDatabase.GetAssetPath(tempClip));
            return(tempState);
        }
        public Transition AnimatorTransitionToCodeTransition(AnimatorStateTransition animatorStateTransition)
        {
            var dstAnimatorState = animatorStateTransition.destinationState;
            var transition       = (Transition)Enum.Parse(typeof(Transition), string.Format("To{0}", dstAnimatorState.name));

            return(transition);
        }
Esempio n. 5
0
    /// <summary>
    /// 创建动画控制器
    /// </summary>
    /// <param name="obj"></param>
    /// <param name="path"></param>
    /// <returns></returns>
    private static AnimatorController CreateAnimatorController(Object obj, string path)
    {
        string        assetPath     = AssetDatabase.GetAssetPath(obj);
        AnimationClip animationClip = AssetDatabase.LoadAssetAtPath <AnimationClip>(assetPath);

        AnimatorController animatorController = AnimatorController.CreateAnimatorControllerAtPath(path + "/" + obj.name + ".controller");

        animatorController.AddParameter("isLoop", AnimatorControllerParameterType.Bool);

        AnimatorControllerLayer animatorControllerLayer = animatorController.layers[0];
        AnimatorStateMachine    animatorStateMachine    = animatorControllerLayer.stateMachine;

        AnimatorState animatorState = animatorStateMachine.AddState(animationClip.name);

        animatorState.motion = animationClip;

        AnimatorState emptyState = animatorStateMachine.AddState("Empty", new Vector3(animatorStateMachine.entryPosition.x + 400,
                                                                                      animatorStateMachine.entryPosition.y + 400, 0));

        AnimatorStateTransition animatorStateTransition = animatorState.AddTransition(emptyState);

        animatorStateTransition.hasExitTime = true;

        animatorStateTransition = emptyState.AddTransition(animatorState);
        animatorStateTransition.AddCondition(AnimatorConditionMode.If, 1, "isLoop");

        return(animatorController);
    }
Esempio n. 6
0
    public static void autioBuildController()
    {
        AnimatorController      animatorController = AnimatorController.CreateAnimatorControllerAtPath("Assets/animation.controller");
        AnimatorControllerLayer layer = animatorController.layers[0];

        //clip文件名
        List <string> list = new List <string>();

        list.Add("AccountToRoot");
        list.Add("root");


        for (int i = 0; i < list.Count; i++)
        {
            //文件路径
            string        path = string.Format("Assets/Res/Ani/cam/{0}.anim", list[i]);
            AnimationClip clip = AssetDatabase.LoadAssetAtPath <AnimationClip>(path);
            if (clip != null)
            {
                AnimatorStateMachine stateMachine = layer.stateMachine;
                AnimatorState        state        = stateMachine.AddState(clip.name);
                state.motion = clip;
                //相当于 AnimatorController 中的连线
                AnimatorStateTransition transition = stateMachine.AddAnyStateTransition(state);
            }
            else
            {
                Debug.Log("路径找不到 animation clip文件 ");
            }
        }
        AssetDatabase.SaveAssets();
    }
Esempio n. 7
0
    protected AnimatorStateTransition CreateAnyTransition(AnimatorState state,
                                                          float duration = 0.1f, bool allowTransitToSelf = true)
    {
        var any = stateMachine.anyStateTransitions;
        AnimatorStateTransition transition = null;

        foreach (var t in any)
        {
            if (t.name == state.name)
            {
                transition = t;
                break;
            }
        }

        if (transition == null)
        {
            CreateTriggerParameter(state.name);
            transition      = stateMachine.AddAnyStateTransition(state);
            transition.name = state.name;
            transition.AddCondition(AnimatorConditionMode.If, 0, state.name);
        }
        transition.duration            = duration;
        transition.canTransitionToSelf = allowTransitToSelf;
        // LogUtil.Debug("cantransitoself " + allowTransitToSelf.ToString());

        return(transition);
    }
    void Create()
    {
        AnimatorController controller = AnimatorController.CreateAnimatorControllerAtPath("Assets/" + target.name + ".controller");

        // Adds a float parameter called Speed
        controller.AddParameter("Speed", AnimatorControllerParameterType.Float);

        //Add states
        AnimatorState idleState = controller.layers[0].stateMachine.AddState("Idle");

        idleState.motion = idleAnim;

        //Blend tree creation
        BlendTree     blendTree;
        AnimatorState moveState = controller.CreateBlendTreeInController("Move", out blendTree);

        //BlendTree setup
        blendTree.blendType      = BlendTreeType.Simple1D;
        blendTree.blendParameter = "Speed";
        blendTree.AddChild(walkAnim);
        blendTree.AddChild(runAnim);

        AnimatorStateTransition LeaveIdle = idleState.AddTransition(moveState);
        AnimatorStateTransition leaveMove = moveState.AddTransition(idleState);

        LeaveIdle.AddCondition(AnimatorConditionMode.Greater, 0.01f, "Speed");
        leaveMove.AddCondition(AnimatorConditionMode.Less, 0.01f, "Speed");

        target.GetComponent <Animator>().runtimeAnimatorController = controller;
    }
Esempio n. 9
0
        //创建默认状态
        private AnimatorState CreateDefaultState(AnimatorStateMachine stateMachine, List <AnimationClip> clips, string stateName, AnimatorState idleState = null, int stateIndex = 0)
        {
            float         posX         = stateIndex == 0 ? stateMachine.entryPosition.x       : stateMachine.entryPosition.x + 300;
            float         posY         = stateIndex == 0 ? stateMachine.entryPosition.y - 200 : stateMachine.entryPosition.y - 200 + 50 * stateIndex;
            Vector2       statePos     = new Vector2(posX, posY);
            AnimatorState defaultState = stateMachine.AddState(stateName, statePos);

            foreach (var item in clips)
            {
                if (item.name.Contains(stateName))
                {
                    defaultState.motion = item;
                    break;
                }
            }


            if (idleState == null)
            {
                ConnectAnyState(stateMachine, defaultState, stateName);
            }
            else
            {
                //都要连Idle
                AnimatorStateTransition stateTransition = ConnectAnyStateByTrigger(stateMachine, defaultState, stateName + "_state");
                stateTransition.AddCondition(AnimatorConditionMode.If, 0, stateName);
                ConnectIdleStateByBool(defaultState, idleState, stateName + "_state");
            }
            return(defaultState);
        }
Esempio n. 10
0
 /// <summary>
 /// 添加状态之间的连线
 /// </summary>
 /// <param name="stateM">状态</param>
 /// <param name="ani_name"></param>
 /// <param name="ani_des"></param>
 /// <param name="flag"></param>
 static void AddTransition(AnimatorStateMachine stateM, string ani_name, string ani_des, int flag)
 {
     foreach (var item in stateM.states)
     {
         if (item.state.name == ani_name)
         {
             foreach (var des in stateM.states)
             {
                 if (des.state.name == ani_des)
                 {
                     AnimatorStateTransition transition = item.state.AddTransition(des.state); //添加连线
                     transition.hasExitTime = true;
                     transition.exitTime    = 0.8f;
                     if (flag == 1)
                     {
                         transition.AddCondition(AnimatorConditionMode.If, flag, ani_des); //添加连线状态
                     }
                     else
                     {
                         transition.AddCondition(AnimatorConditionMode.IfNot, flag, ani_name);
                     }
                 }
             }
         }
     }
     Resources.UnloadUnusedAssets(); //卸载资源
 }
Esempio n. 11
0
    /// <summary>
    /// 给预制体添加动画
    /// </summary>
    /// <param name="obj"></param>
    /// <param name="modelPath"></param>
    /// <param name="animatorControllerPath"></param>
    /// <param name="name"></param>
    public static void SetAnimatorController(GameObject obj, string modelPath, string animatorControllerPath, string name)
    {
        Animator anim = obj.GetComponent <Animator>();

        if (anim)
        {
            AnimatorController controller = AnimatorController.CreateAnimatorControllerAtPath(animatorControllerPath + name + ".controller");
            AnimatorController.SetAnimatorController(anim, controller);
            AnimatorControllerLayer layer   = controller.layers[0];
            AnimatorStateMachine    machine = layer.stateMachine;

            controller.AddParameter("e", AnimatorControllerParameterType.Bool);

            AnimatorState IdleState = machine.AddState("Idle", new Vector3(300, 0, 0));
            machine.defaultState = IdleState;
            AnimatorState behaviorState = machine.AddState("behavior", new Vector3(550, 0, 0));
            behaviorState.motion = GetAnimationClip(modelPath);

            AnimatorStateTransition behaviorTrue = IdleState.AddTransition(behaviorState);
            behaviorTrue.AddCondition(AnimatorConditionMode.If, 1f, "e");
            AnimatorStateTransition behaviorFlas = behaviorState.AddTransition(IdleState);
            behaviorFlas.AddCondition(AnimatorConditionMode.IfNot, 1F, "e");
        }
        else
        {
            Debug.Log(obj.name + "没有挂载动画状态机组件");
        }
    }
Esempio n. 12
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");
            }
        }
        private void AddDefaultState(AnimatorController ac, int i)
        {
            AnimatorControllerLayer layer        = ac.layers[i];
            AnimatorStateMachine    stateMachine = layer.stateMachine;

            layer.defaultWeight = 1.0f;

            string strEmptyNameParam = "Empty" + i;

            //每层必须先加一个空状态
            AnimatorState stateEmpty = stateMachine.AddState(strEmptyNameParam, new Vector3(stateMachine.entryPosition.x + 300, stateMachine.entryPosition.y, 0));

            //添加trigger参数
            ac.AddParameter(strEmptyNameParam, AnimatorControllerParameterType.Trigger);

            //添加速度修正参数
            AnimatorControllerParameter acpEmpty = new AnimatorControllerParameter();
            string strSpeedParamEmpty            = strEmptyNameParam + "speed";

            acpEmpty.name         = strSpeedParamEmpty;
            acpEmpty.defaultFloat = 1.0f;
            acpEmpty.type         = AnimatorControllerParameterType.Float;
            ac.AddParameter(acpEmpty);

            //添加Any到Empty的transition
            AnimatorStateTransition ToEmptyTransition = stateMachine.AddAnyStateTransition(stateEmpty);

            ToEmptyTransition.AddCondition(AnimatorConditionMode.If, 0, strEmptyNameParam);
            ToEmptyTransition.duration = 0f;
            ToEmptyTransition.name     = strEmptyNameParam;

            m_LayerDefaultState.Add(i, stateEmpty);
        }
Esempio n. 14
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);
                }
            }
        }
    }
 static void SetupAnimatorStateTransition(AnimatorStateTransition transition, float duration, bool hasExitTime, float exitTime, bool canTransitionToSelf)
 {
     transition.duration            = duration;
     transition.hasExitTime         = hasExitTime;
     transition.exitTime            = exitTime;
     transition.canTransitionToSelf = canTransitionToSelf;
 }
    public void AddTransition(EditorAnimationItem Anim, AnimatorConditionMode mode, float v, string parameter, bool hasExitTime = true)
    {
        AnimatorStateTransition st = state.AddTransition(Anim.state);

        st.AddCondition(mode, v, parameter);
        st.hasExitTime = hasExitTime;
    }
Esempio n. 17
0
        private void CreateEdges()
        {
            this.m_ConnectedSlotsCache.Clear();
            List <ChildAnimatorState> statesRecursive = this.rootStateMachine.statesRecursive;

            foreach (ChildAnimatorState current in statesRecursive)
            {
                AnimatorState             state       = current.state;
                AnimatorStateTransition[] transitions = state.transitions;
                AnimatorStateTransition[] array       = transitions;
                for (int i = 0; i < array.Length; i++)
                {
                    AnimatorStateTransition animatorStateTransition = array[i];
                    if (animatorStateTransition != null)
                    {
                        this.CreateStateEdges(state, animatorStateTransition);
                    }
                }
            }
            List <AnimatorStateTransition> anyStateTransitionsRecursive = this.rootStateMachine.anyStateTransitionsRecursive;

            foreach (AnimatorStateTransition current2 in anyStateTransitionsRecursive)
            {
                if (current2 != null)
                {
                    this.CreateAnyStateEdges(current2);
                }
            }
            List <ChildAnimatorStateMachine> stateMachinesRecursive = this.rootStateMachine.stateMachinesRecursive;

            stateMachinesRecursive.Add(new ChildAnimatorStateMachine
            {
                stateMachine = this.rootStateMachine
            });
            foreach (ChildAnimatorStateMachine current3 in stateMachinesRecursive)
            {
                ChildAnimatorStateMachine[] stateMachines = current3.stateMachine.stateMachines;
                ChildAnimatorStateMachine[] array2        = stateMachines;
                for (int j = 0; j < array2.Length; j++)
                {
                    ChildAnimatorStateMachine childAnimatorStateMachine = array2[j];
                    AnimatorTransition[]      stateMachineTransitions   = current3.stateMachine.GetStateMachineTransitions(childAnimatorStateMachine.stateMachine);
                    AnimatorTransition[]      array3 = stateMachineTransitions;
                    for (int k = 0; k < array3.Length; k++)
                    {
                        AnimatorTransition transition = array3[k];
                        this.CreateSelectorEdges(transition, current3.stateMachine, childAnimatorStateMachine.stateMachine);
                    }
                }
            }
            AnimatorTransition[] entryTransitions = this.activeStateMachine.entryTransitions;
            AnimatorTransition[] array4           = entryTransitions;
            for (int l = 0; l < array4.Length; l++)
            {
                AnimatorTransition transition2 = array4[l];
                this.CreateEntryEdges(transition2, this.activeStateMachine);
            }
            this.CreateDefaultStateEdge(this.activeStateMachine.defaultState, this.activeStateMachine);
        }
Esempio n. 18
0
        public void Build()
        {
            var expName    = _expressionInfo.ExpressionName;
            var controller = _expressionInfo.Controller;

            AnimatorControllerLayer layer = AnimUtility.AddLayer(controller, expName, _dirtyAssets);

            controller.AddParameter(expName, AnimatorControllerParameterType.Bool);

            AnimatorStateMachine stateMachine = layer.stateMachine;
            var empty = AnimUtility.AddState(stateMachine, "Empty", true, _dirtyAssets);

            AnimatorState toggleState = AnimUtility.AddState(stateMachine, expName, false, _dirtyAssets);

            var animationClip = AnimUtility.CreateAnimation(_expressionInfo.AnimationsFolder.GetPath(), expName, _dirtyAssets);

            toggleState.motion = animationClip;

            foreach (var obj in GetObjects())
            {
                switch (obj.Type)
                {
                case AdvancedToggleObjectMode.GameObject:
                    AddToggleKeyframes(animationClip, obj.Target as Transform, obj.ToggleState, _dirtyAssets);
                    break;

                case AdvancedToggleObjectMode.Material:
                    AnimUtility.SetObjectReferenceKeyframe(animationClip, obj.Target, $"m_Materials.Array.data[{obj.MaterialSlot}]", obj.NewMaterial, _dirtyAssets);
                    break;
                }
            }

            AnimatorStateTransition anyStateTransition = stateMachine.AddAnyStateTransition(toggleState);

            anyStateTransition.AddCondition(AnimatorConditionMode.If, 1, expName);

            AnimatorStateTransition exitTransition = toggleState.AddExitTransition(false);

            exitTransition.AddCondition(AnimatorConditionMode.IfNot, 0, expName);

            AnimUtility.AddVRCExpressionsParameter(_expressionInfo.AvatarDescriptor, VRCExpressionParameters.ValueType.Bool, expName, _dirtyAssets);
            if (_expressionInfo.Menu != null)
            {
                AnimUtility.AddVRCExpressionsMenuControl(_expressionInfo.Menu, ControlType.Toggle, expName, _dirtyAssets);
            }

            _dirtyAssets.SetDirty();
            controller.AddObjectsToAsset(stateMachine, toggleState, anyStateTransition, exitTransition, empty);
            AssetDatabase.SaveAssets();

            _dirtyAssets.Clear();
            foreach (ObjectData obj in GetObjects().Where(o => o.Type == AdvancedToggleObjectMode.Parameter))
            {
                AnimUtility.AddVRCParameterDriver(toggleState, obj.ParameterName, obj.ParameterValue, _dirtyAssets);
            }
            _dirtyAssets.SetDirty();
            AssetDatabase.SaveAssets();
            AssetDatabase.Refresh();
        }
 internal static void SetupCommonTransition(AnimatorStateTransition transition)
 {
     transition.hasExitTime        = false;
     transition.exitTime           = 0;
     transition.hasFixedDuration   = true;
     transition.offset             = 0;
     transition.interruptionSource = TransitionInterruptionSource.None;
 }
Esempio n. 20
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));
        }
        internal static void SetupDefaultTransition(AnimatorStateTransition transition)
        {
            SetupCommonTransition(transition);

            transition.duration            = 0.1f; // There seems to be a quirk if the duration is 0 when using DisableExpressions, so use 0.1f instead
            transition.orderedInterruption = true;
            transition.canTransitionToSelf = false;
        }
 private void SetGestureTransitionDefaults(AnimatorStateTransition transition)
 {
     transition.hasExitTime         = false;
     transition.hasFixedDuration    = false;
     transition.duration            = .01f;
     transition.interruptionSource  = TransitionInterruptionSource.Destination;
     transition.canTransitionToSelf = false;
 }
Esempio n. 23
0
    public static void ConvertTransitionToContinue()
    {
        Hashtable            stateConditionTable = new Hashtable();
        AnimatorStateMachine stateMachine        = null;

        setHashTable(out stateConditionTable);

        List <string> nameOfStates = new List <string>();
        List <AnimatorStateTransition> animatorStateTransitionList = new List <AnimatorStateTransition>();

        foreach (Object obj in Selection.objects)
        {
            if (obj.GetType() == typeof(AnimatorStateMachine))
            {
                stateMachine = (obj as AnimatorStateMachine);

                foreach (ChildAnimatorState state in stateMachine.states)
                {
                    if (animatorStateTransitionList.Count > 0)
                    {
                        animatorStateTransitionList.RemoveRange(0, animatorStateTransitionList.Count);
                    }

                    if (nameOfStates.Count > 0)
                    {
                        nameOfStates.RemoveRange(0, nameOfStates.Count);
                    }

                    foreach (AnimatorStateTransition stateTransition in state.state.transitions)
                    {
                        nameOfStates.Add(stateTransition.destinationState.name);
                        setTransition(stateTransition,
                                      (float)stateConditionTable[stateTransition.destinationState.name.ToLower()]);
                        animatorStateTransitionList.Add(stateTransition);
                    }
                    foreach (ChildAnimatorState _state in stateMachine.states)
                    {
                        if (_state.state.name.CompareTo(state.state.name) != 0 && !nameOfStates.Contains(_state.state.name))
                        {
                            AnimatorStateTransition newState = new AnimatorStateTransition();
                            newState.destinationState = _state.state;
                            animatorStateTransitionList.Add(newState);
                            setTransition(newState, (float)stateConditionTable[_state.state.name.ToLower()]);
                            if (AssetDatabase.GetAssetPath(stateMachine) != "")
                            {
                                AssetDatabase.AddObjectToAsset(newState, AssetDatabase.GetAssetPath(stateMachine));
                            }
                        }
                    }
                    state.state.transitions = animatorStateTransitionList.ToArray();
                    AssetDatabase.SaveAssets();
                    AssetDatabase.Refresh();
                }
            }
        }
        AssetDatabase.SaveAssets();
        AssetDatabase.Refresh();
    }
Esempio n. 24
0
 private void CopyTransitionForPreview(AnimatorStateTransition src, ref AnimatorStateTransition dst)
 {
     if (src != null)
     {
         dst.duration = src.duration;
         dst.offset   = src.offset;
         dst.exitTime = src.exitTime;
     }
 }
        public void Build()
        {
            var expName    = _expressionInfo.ExpressionName;
            var controller = _expressionInfo.Controller;

            AnimatorControllerLayer layer = AnimUtility.AddLayer(controller, expName, _dirtyAssets);

            controller.AddParameter(expName, AnimatorControllerParameterType.Float);

            AnimatorStateMachine stateMachine = layer.stateMachine;
            var           empty = AnimUtility.AddState(stateMachine, "Empty", true, _dirtyAssets);
            AnimatorState state = AnimUtility.AddState(stateMachine, expName, false, _dirtyAssets);

            var blendTree = new BlendTree
            {
                name           = "BlendTree",
                blendParameter = expName,
            };

            state.motion = blendTree;
            _dirtyAssets.Add(blendTree);

            var materials = GetMaterials().ToList();

            var directory = $"{_expressionInfo.AnimationsFolder.GetPath()}/{expName}";
            var emptyClip = AnimUtility.CreateAnimation(directory, $"{expName}_{empty}", _dirtyAssets);

            blendTree.AddChild(emptyClip);

            for (var i = 0; i < materials.Count; i++)
            {
                Material material      = materials[i];
                var      animationClip = AnimUtility.CreateAnimation(directory, $"{expName} [{i}] {material.name}", _dirtyAssets);
                AnimUtility.SetObjectReferenceKeyframe(animationClip, _renderer, $"m_Materials.Array.data[{_materialSlot}]", material, _dirtyAssets);
                blendTree.AddChild(animationClip);
                _dirtyAssets.Add(animationClip);
            }

            AnimatorStateTransition anyStateTransition = stateMachine.AddAnyStateTransition(state);

            anyStateTransition.AddCondition(AnimatorConditionMode.Greater, 0.01f, expName);

            AnimatorStateTransition exitTransition = state.AddExitTransition(false);

            exitTransition.AddCondition(AnimatorConditionMode.Less, 0.01f, expName);

            AnimUtility.AddVRCExpressionsParameter(_expressionInfo.AvatarDescriptor, VRCExpressionParameters.ValueType.Float, expName, _dirtyAssets);
            if (_expressionInfo.Menu != null)
            {
                AnimUtility.AddVRCExpressionsMenuControl(_expressionInfo.Menu, ControlType.RadialPuppet, expName, _dirtyAssets);
            }

            _dirtyAssets.SetDirty();
            controller.AddObjectsToAsset(stateMachine, empty, state, anyStateTransition, exitTransition, blendTree);
            AssetDatabase.SaveAssets();
            AssetDatabase.Refresh();
        }
Esempio n. 26
0
        static void AddTransition(AnimatorState start, AnimatorState end, string condition, float _duration = 0)
        {
            AnimatorStateTransition tempTransition = start.AddExitTransition();

            tempTransition.destinationState = end;
            tempTransition.hasExitTime      = false;
            tempTransition.AddCondition(AnimatorConditionMode.If, 0, condition);
            tempTransition.duration = _duration;
        }
Esempio n. 27
0
        static void AddExit(AnimatorState start, AnimatorState end, float _exitTime = 1, float _duration = 0)
        {
            AnimatorStateTransition tempTransition = start.AddExitTransition();

            tempTransition.destinationState = end;
            tempTransition.hasExitTime      = true;
            tempTransition.exitTime         = _exitTime;
            tempTransition.duration         = _duration;
        }
Esempio n. 28
0
        public AnimatorControllerExportCollection(IAssetExporter assetExporter, VirtualSerializedFile virtualFile, AnimatorController asset) :
            base(assetExporter, asset)
        {
            ControllerConstant controller = asset.Controller;
            IReadOnlyList <OffsetPtr <StateMachineConstant> > stateMachinesConst = controller.StateMachineArray;

            StateMachines = new AnimatorStateMachine[stateMachinesConst.Count];
            for (int i = 0; i < stateMachinesConst.Count; i++)
            {
                AnimatorStateMachine stateMachine = AnimatorStateMachine.CreateVirtualInstance(virtualFile, asset, i);
                StateMachines[i] = stateMachine;
            }

            for (int i = 0; i < StateMachines.Length; i++)
            {
                AnimatorStateMachine stateMachine         = StateMachines[i];
                StateMachineConstant stateMachineConstant = asset.Controller.StateMachineArray[i].Instance;
                AddAsset(stateMachine);
                AddBehaviours(asset, stateMachine.StateMachineBehaviours);

                foreach (PPtr <AnimatorStateTransition> transitionPtr in stateMachine.AnyStateTransitions)
                {
                    AnimatorStateTransition transition = transitionPtr.GetAsset(virtualFile);
                    AddAsset(transition);
                }
                foreach (PPtr <AnimatorTransition> transitionPtr in stateMachine.EntryTransitions)
                {
                    AnimatorTransition transition = transitionPtr.GetAsset(virtualFile);
                    AddAsset(transition);
                }

                for (int j = 0; j < stateMachine.ChildStates.Length; j++)
                {
                    PPtr <AnimatorState> statePtr      = stateMachine.ChildStates[j].State;
                    AnimatorState        state         = statePtr.GetAsset(virtualFile);
                    StateConstant        stateConstant = stateMachineConstant.StateConstantArray[j].Instance;
                    AddAsset(state);
                    AddBehaviours(asset, state.StateMachineBehaviours);

                    if (state.Motion.IsVirtual)
                    {
                        Motion motion = state.Motion.GetAsset(virtualFile);
                        AddBlendTree(virtualFile, (BlendTree)motion);
                    }

                    for (int k = 0; k < state.Transitions.Length; k++)
                    {
                        PPtr <AnimatorStateTransition> transitionPtr      = state.Transitions[k];
                        AnimatorStateTransition        transition         = transitionPtr.GetAsset(virtualFile);
                        TransitionConstant             transitionConstant = stateConstant.TransitionConstantArray[k].Instance;

                        AddAsset(transition);
                    }
                }
            }
        }
Esempio n. 29
0
 private static void SetupTransition(AnimatorStateTransition toListening)
 {
     toListening.hasExitTime         = false;
     toListening.exitTime            = 0f;
     toListening.hasFixedDuration    = true;
     toListening.duration            = 0;
     toListening.offset              = 0;
     toListening.interruptionSource  = TransitionInterruptionSource.None;
     toListening.orderedInterruption = true;
 }
Esempio n. 30
0
        protected void AddDirectionTransitionA2BIfNotExist(AnimatorState stateA, AnimatorState stateB, int angle)
        {
            AnimatorStateTransition transition = FindTransitionA2B(stateA, stateB);

            if (transition == null)
            {
                transition = stateA.AddTransition(stateB);
            }
            RemoveAllAndAddCondition(transition, ANGLE_PARAM_NAME, AnimatorConditionMode.Equals, angle);
        }