示例#1
0
        public static AnimatorStateTransition GetTransitionTo(FPlayAnimationEvent animEvt)
        {
            FAnimationTrack animTrack = (FAnimationTrack)animEvt.Track;

            if (animTrack.AnimatorController == null)
            {
                return(null);
            }

            AnimatorController controller = (AnimatorController)animTrack.AnimatorController;

            AnimatorState animState = null;

            AnimatorControllerLayer layer = FindLayer(controller, ((FAnimationTrack)animEvt.Track).LayerName);

            if (layer == null)
            {
                return(null);
            }

            if (layer.stateMachine.stateMachines.Length == 0)
            {
                return(null);
            }

            ChildAnimatorStateMachine fluxSM = layer.stateMachine.stateMachines[0];

            AnimatorStateMachine stateMachine = fluxSM.stateMachine;

            for (int i = 0; i != stateMachine.states.Length; ++i)
            {
                if (stateMachine.states[i].state.nameHash == animEvt._stateHash)
                {
                    animState = stateMachine.states[i].state;
                    break;
                }
            }

            if (animState == null)
            {
                //				Debug.LogError("Couldn't find state " + animEvt._animationClip );
                return(null);
            }

            for (int i = 0; i != stateMachine.states.Length; ++i)
            {
                AnimatorState state = stateMachine.states[i].state;

                AnimatorStateTransition[] transitions = state.transitions;
                for (int j = 0; j != transitions.Length; ++j)
                {
                    if (transitions[j].destinationState == animState)
                    {
                        return(transitions[j]);
                    }
                }
            }

            return(null);
        }
示例#2
0
        /// <summary>
        /// Generates the code to recreate the motions within the specified state machine.
        /// </summary>
        /// <param name="childStateMachine">The state machine used to search for motions.</param>
        /// <param name="motionSet">The list of motions which have been already generated.</param>
        /// <param name="generatedCode">The final generated code.</param>
        private static void GenerateMotions(ChildAnimatorStateMachine childStateMachine, HashSet <UnityEngine.Motion> motionSet, StringBuilder generatedCode)
        {
            var stateMachine = childStateMachine.stateMachine;

            if (stateMachine.states.Length > 0)
            {
                for (int i = 0; i < stateMachine.states.Length; ++i)
                {
                    var motion = stateMachine.states[i].state.motion;
                    if (motion is BlendTree)
                    {
                        // Blend trees can contain other blend trees so recursion is necessary.
                        GenerateBlendTreeMotions(motion as BlendTree, motionSet, generatedCode);
                    }
                    else
                    {
                        if (motion != null)
                        {
                            GenerateMotion(motion, motionSet, generatedCode);
                        }
                    }
                }
            }

            // Search deeper for any motions.
            for (int i = 0; i < stateMachine.stateMachines.Length; ++i)
            {
                GenerateMotions(stateMachine.stateMachines[i], motionSet, generatedCode);
            }
        }
示例#3
0
 public Node FindNode(AnimatorStateMachine stateMachine)
 {
     if (stateMachine == null)
     {
         return(null);
     }
     if (stateMachine == this.activeStateMachine)
     {
         return(null);
     }
     if (this.m_StateMachineNodeLookup.ContainsKey(stateMachine))
     {
         return(this.m_StateMachineNodeLookup[stateMachine]);
     }
     ChildAnimatorStateMachine[] stateMachines = this.activeStateMachine.stateMachines;
     for (int i = 0; i < stateMachines.Length; i++)
     {
         ChildAnimatorStateMachine childAnimatorStateMachine = stateMachines[i];
         if (this.HasStateMachine(childAnimatorStateMachine.stateMachine, stateMachine, true))
         {
             return(this.m_StateMachineNodeLookup[childAnimatorStateMachine.stateMachine]);
         }
     }
     if (this.parentStateMachine)
     {
         return(this.m_StateMachineNodeLookup[this.parentStateMachine]);
     }
     return(null);
 }
示例#4
0
        private static void GenerateStateMachineStateTransitions(ChildAnimatorStateMachine childStateMachine, StringBuilder generatedCode)
        {
            var stateMachine = childStateMachine.stateMachine;

            // Add all of the state transitions.
            if (stateMachine.states.Length > 0)
            {
                generatedCode.AppendLine("\t\t\t// State Transitions.");
                for (int i = 0; i < stateMachine.states.Length; ++i)
                {
                    var state           = stateMachine.states[i].state;
                    var uniqueStateName = UniqueName(stateMachine.states[i].state);
                    for (int j = 0; j < state.transitions.Length; ++j)
                    {
                        GenerateTransition(uniqueStateName, state.transitions[j], true, false, generatedCode);
                        generatedCode.AppendLine();
                    }
                }
            }

            // Add all of the state machines.
            for (int i = 0; i < stateMachine.stateMachines.Length; ++i)
            {
                GenerateStateMachineStateTransitions(stateMachine.stateMachines[i], generatedCode);
            }
        }
示例#5
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);
        }
示例#6
0
        /// <summary>
        /// TODO: 子ステートマシンをディープコピーして欲しい。
        /// </summary>
        public static ChildAnimatorStateMachine DeepcopyChildStatemachine(ChildAnimatorStateMachine old)
        {
            ChildAnimatorStateMachine n = new ChildAnimatorStateMachine();

            n.position     = old.position;
            n.stateMachine = AconDeepcopy.DeepcopyStatemachine(old.stateMachine);
            return(n);
        }
示例#7
0
        private static ChildAnimatorStateMachine CloneChildStateMachine(ChildAnimatorStateMachine old)
        {
            var n = new ChildAnimatorStateMachine
            {
                position     = old.position,
                stateMachine = CloneStateMachine(old.stateMachine)
            };

            return(n);
        }
示例#8
0
        private void CreateNodeFromStateMachine(ChildAnimatorStateMachine subStateMachine)
        {
            StateMachineNode stateMachineNode = this.CreateAndAddNode <StateMachineNode>(string.Empty, subStateMachine.position);

            stateMachineNode.stateMachine = subStateMachine.stateMachine;
            stateMachineNode.style        = "node hex";
            if (this.rootStateMachine.defaultState && this.HasState(subStateMachine.stateMachine, this.rootStateMachine.defaultState, true))
            {
                stateMachineNode.color = Styles.Color.Orange;
            }
            this.m_StateMachineNodeLookup.Add(subStateMachine.stateMachine, stateMachineNode);
        }
示例#9
0
        /// <summary>
        /// TODO: 子ステートマシンをディープコピーして欲しい。
        /// </summary>
        public static ChildAnimatorStateMachine[] DeepcopyChildStatemachine(ChildAnimatorStateMachine[] oldItems)
        {
            ChildAnimatorStateMachine[] nItems = new ChildAnimatorStateMachine[oldItems.Length];
            int i = 0;

            foreach (ChildAnimatorStateMachine old in oldItems)
            {
                nItems[i] = DeepcopyChildStatemachine(old);
                i++;
            }
            return(nItems);
        }
示例#10
0
        private void CreateNodeFromStateMachine(ChildAnimatorStateMachine subStateMachine)
        {
            StateMachineNode node = this.CreateAndAddNode <StateMachineNode>("", subStateMachine.position);

            node.stateMachine = subStateMachine.stateMachine;
            node.style        = "node hex";
            if ((this.rootStateMachine.defaultState != null) && this.HasState(subStateMachine.stateMachine, this.rootStateMachine.defaultState, true))
            {
                node.color = UnityEditor.Graphs.Styles.Color.Orange;
            }
            this.m_StateMachineNodeLookup.Add(subStateMachine.stateMachine, node);
        }
示例#11
0
        private void CreateEdges()
        {
            this.m_ConnectedSlotsCache.Clear();
            List <ChildAnimatorState> statesRecursive = this.rootStateMachine.statesRecursive;

            foreach (ChildAnimatorState state in statesRecursive)
            {
                AnimatorState             sourceState = state.state;
                AnimatorStateTransition[] transitions = sourceState.transitions;
                foreach (AnimatorStateTransition transition in transitions)
                {
                    if (transition != null)
                    {
                        this.CreateStateEdges(sourceState, transition);
                    }
                }
            }
            AnimatorStateTransition[] anyStateTransitions = this.rootStateMachine.anyStateTransitions;
            foreach (AnimatorStateTransition transition2 in anyStateTransitions)
            {
                if (transition2 != null)
                {
                    this.CreateAnyStateEdges(transition2);
                }
            }
            List <ChildAnimatorStateMachine> stateMachinesRecursive = this.rootStateMachine.stateMachinesRecursive;
            ChildAnimatorStateMachine        item = new ChildAnimatorStateMachine {
                stateMachine = this.rootStateMachine
            };

            stateMachinesRecursive.Add(item);
            foreach (ChildAnimatorStateMachine machine2 in stateMachinesRecursive)
            {
                ChildAnimatorStateMachine[] stateMachines = machine2.stateMachine.stateMachines;
                foreach (ChildAnimatorStateMachine machine3 in stateMachines)
                {
                    AnimatorTransition[] stateMachineTransitions = machine2.stateMachine.GetStateMachineTransitions(machine3.stateMachine);
                    foreach (AnimatorTransition transition3 in stateMachineTransitions)
                    {
                        this.CreateSelectorEdges(transition3, machine2.stateMachine, machine3.stateMachine);
                    }
                }
            }
            AnimatorTransition[] entryTransitions = this.activeStateMachine.entryTransitions;
            foreach (AnimatorTransition transition4 in entryTransitions)
            {
                this.CreateEntryEdges(transition4, this.activeStateMachine);
            }
            this.CreateDefaultStateEdge(this.activeStateMachine.defaultState, this.activeStateMachine);
        }
示例#12
0
 private void FillStateMachineLookupFromStateMachine(AnimatorStateMachine stateMachine)
 {
     ChildAnimatorStateMachine[] stateMachines = stateMachine.stateMachines;
     for (int i = 0; i < stateMachines.Length; i++)
     {
         ChildAnimatorStateMachine childAnimatorStateMachine = stateMachines[i];
         this.FillStateMachineLookupFromStateMachine(childAnimatorStateMachine.stateMachine);
         this.m_StateMachineLookup.Add(childAnimatorStateMachine.stateMachine, stateMachine);
     }
     ChildAnimatorState[] states = stateMachine.states;
     for (int j = 0; j < states.Length; j++)
     {
         ChildAnimatorState childAnimatorState = states[j];
         this.m_StateMachineProxyLookup.Add(childAnimatorState.state, stateMachine);
     }
 }
示例#13
0
        public static void GenericMenuForStateMachineNode(StateMachineNode toStateMachineNode, bool showStateMachine, GenericMenu.MenuFunction2 func)
        {
            AnimatorStateMachine             parentStateMachine = null;
            List <ChildAnimatorState>        stateList          = new List <ChildAnimatorState>();
            List <ChildAnimatorStateMachine> stateMachineList   = new List <ChildAnimatorStateMachine>();

            PopulateSubNodeList(toStateMachineNode, ref stateList, ref stateMachineList, ref parentStateMachine);
            if ((stateList.Count == 0) && (stateMachineList.Count == 1))
            {
                ChildAnimatorStateMachine machine2 = stateMachineList[0];
                func(machine2.stateMachine);
            }
            else
            {
                GenericMenu menu = new GenericMenu();
                foreach (ChildAnimatorState state in stateList)
                {
示例#14
0
        private AnimatorStateMachine AddStateMachine(StateMachine stateMachine)
        {
            AnimatorStateMachine controllerStateMachine;

            if (stateMachine.overrideExistingStateMachine)
            {
                List <ChildAnimatorState>        newStates        = new List <ChildAnimatorState>();
                List <ChildAnimatorStateMachine> newStateMachines = new List <ChildAnimatorStateMachine>();
                controllerStateMachine = stateMachine.controllerStateMachine != null
                                        ? stateMachine.controllerStateMachine
                                        : new AnimatorStateMachine();
                stateMachine.controllerStateMachine = controllerStateMachine;
                controllerStateMachine.name         = stateMachine.Name;
                foreach (var state in stateMachine.states)
                {
                    switch (state.type)
                    {
                    case StateType.State: {
                        var temp = new ChildAnimatorState();
                        temp.state        = new UnityEditor.Animations.AnimatorState();
                        temp.state.motion = state.state.motion;
                        temp.state.name   = state.state.Name;
                        newStates.Add(temp);
                        break;
                    }

                    case StateType.StateMachine:
                    default: {
                        var temp = new ChildAnimatorStateMachine();
                        temp.stateMachine = AddStateMachine(state.stateMachine);
                        newStateMachines.Add(temp);
                        break;
                    }
                    }
                }

                controllerStateMachine.stateMachines = newStateMachines.ToArray();
                controllerStateMachine.states        = newStates.ToArray();
            }
            else
            {
                controllerStateMachine = stateMachine.controllerStateMachine;
            }

            return(controllerStateMachine);
        }
示例#15
0
 /// <summary>
 /// Collects all fields that will be serialized.
 /// </summary>
 /// <param name="obj"></param>
 /// <param name="info"></param>
 /// <param name="context"></param>
 public override void GetObjectData(object obj, SerializationInfo info, StreamingContext context)
 {
     if (obj == null)
     {
         return;
     }
     if (obj is ChildAnimatorStateMachine)
     {
         ChildAnimatorStateMachine fsm = (ChildAnimatorStateMachine)obj;
         info.AddValue("position", (object)fsm.position);
         info.AddValue("stateMachine", (object)fsm.stateMachine);
     }
     else if (obj is ChildAnimatorState)
     {
         ChildAnimatorState state = (ChildAnimatorState)obj;
         info.AddValue("position", (object)state.position);
         info.AddValue("state", (object)state.state);
     }
 }
示例#16
0
        private static void PopulateSubNodeList(StateMachineNode toStateMachineNode, ref List <ChildAnimatorState> stateList, ref List <ChildAnimatorStateMachine> stateMachineList, ref AnimatorStateMachine parentStateMachine)
        {
            if (toStateMachineNode.stateMachine == AnimatorControllerTool.tool.stateMachineGraph.parentStateMachine)
            {
                stateList = AnimatorControllerTool.tool.stateMachineGraph.rootStateMachine.statesRecursive;
                stateList.RemoveAll((ChildAnimatorState s) => AnimatorControllerTool.tool.stateMachineGraph.activeStateMachine.HasState(s.state));
                stateMachineList = AnimatorControllerTool.tool.stateMachineGraph.rootStateMachine.stateMachinesRecursive;
                stateMachineList.RemoveAll((ChildAnimatorStateMachine s) => AnimatorControllerTool.tool.stateMachineGraph.activeStateMachine.HasStateMachine(s.stateMachine) || AnimatorControllerTool.tool.stateMachineGraph.activeStateMachine == s.stateMachine);
                parentStateMachine = AnimatorControllerTool.tool.stateMachineGraph.rootStateMachine;
            }
            else
            {
                parentStateMachine = toStateMachineNode.stateMachine;
                stateList          = toStateMachineNode.stateMachine.statesRecursive;
                stateMachineList   = parentStateMachine.stateMachinesRecursive;
            }
            ChildAnimatorStateMachine item = default(ChildAnimatorStateMachine);

            item.stateMachine = parentStateMachine;
            stateMachineList.Add(item);
        }
示例#17
0
 private void CreateNodes()
 {
     this.m_StateNodeLookup.Clear();
     this.m_StateMachineNodeLookup.Clear();
     ChildAnimatorState[] states = this.activeStateMachine.states;
     for (int i = 0; i < states.Length; i++)
     {
         ChildAnimatorState state = states[i];
         this.CreateNodeFromState(state);
     }
     ChildAnimatorStateMachine[] stateMachines = this.activeStateMachine.stateMachines;
     for (int j = 0; j < stateMachines.Length; j++)
     {
         ChildAnimatorStateMachine subStateMachine = stateMachines[j];
         this.CreateNodeFromStateMachine(subStateMachine);
     }
     this.CreateAnyStateNode();
     this.CreateEntryExitNodes();
     if (this.parentStateMachine)
     {
         this.CreateParentStateMachineNode();
     }
 }
示例#18
0
 private static IEnumerable <ChildAnimatorState> AllChildStates(ChildAnimatorStateMachine casm)
 {
     return(casm.stateMachine.states.Concat(casm.stateMachine.stateMachines.SelectMany(AllChildStates)));
 }
示例#19
0
        /// <summary>
        /// Register all the state machines
        /// </summary>
        /// <param name="stateMachine"></param>
        /// <param name="parentState"></param>
        private void RegisterAnimatorStates(AnimatorStateMachine stateMachine, string parentState)
        {
            if (m_stateNameHash == null)
            {
                m_stateNameHash = new Dictionary <string, int>();
            }
            if (m_stateHashName == null)
            {
                m_stateHashName = new Dictionary <int, string>();
            }

            foreach (ChildAnimatorState childState in stateMachine.states) //for each state
            {
                string stateName     = childState.state.name;
                string fullPathName  = parentState + "." + stateName;
                int    shortNameHash = Animator.StringToHash(stateName);
                int    fullPathHash  = Animator.StringToHash(fullPathName);


                //  Fullpath hash
                if (m_stateNameHash.ContainsKey(fullPathName))
                {
                    m_stateNameHash[fullPathName] = fullPathHash;
                }
                else
                {
                    m_stateNameHash.Add(fullPathName, fullPathHash);
                }
                //  Shortpath hash
                if (m_stateNameHash.ContainsKey(stateName))
                {
                    m_stateNameHash[stateName] = shortNameHash;
                }
                else
                {
                    m_stateNameHash.Add(stateName, shortNameHash);
                }


                //  Fullpath name
                if (m_stateHashName.ContainsKey(fullPathHash))
                {
                    m_stateHashName[fullPathHash] = fullPathName;
                }
                else
                {
                    m_stateHashName.Add(fullPathHash, fullPathName);
                }
                //  Shortpath name
                if (m_stateHashName.ContainsKey(shortNameHash))
                {
                    m_stateHashName[shortNameHash] = stateName;
                }
                else
                {
                    m_stateHashName.Add(shortNameHash, stateName);
                }



                m_stateCount++;
            }

            //foreach (ChildAnimatorStateMachine sm in stateMachine.stateMachines) //for each state
            //{
            //    string path = parentState + "." + sm.stateMachine.name;
            //    RegisterAnimatorStates(sm.stateMachine, path);
            //}

            for (int i = 0; i < stateMachine.stateMachines.Length; i++)
            {
                ChildAnimatorStateMachine sm = stateMachine.stateMachines[i];
                string path = parentState + "." + sm.stateMachine.name;
                RegisterAnimatorStates(sm.stateMachine, path);
            }
        }
示例#20
0
        public static AnimatorStateMachine CloneMachine(this AnimatorStateMachine machine)
        {
            AnimatorStateMachine output = new AnimatorStateMachine();

            //All Serializable Fields (ex. Primitives)
            EditorUtility.CopySerialized(machine, output);

            //State Machines
            ChildAnimatorStateMachine[] outMachines = new ChildAnimatorStateMachine[machine.stateMachines.Length];
            for (int i = 0; i < outMachines.Length; i++)
            {
                outMachines[i] = new ChildAnimatorStateMachine
                {
                    position     = machine.stateMachines[i].position,
                    stateMachine = CloneMachine(machine.stateMachines[i].stateMachine)
                };
            }
            output.stateMachines = outMachines;

            //States
            ChildAnimatorState[] outStates = new ChildAnimatorState[machine.states.Length];
            for (int i = 0; i < outStates.Length; i++)
            {
                outStates[i] = new ChildAnimatorState
                {
                    position = machine.states[i].position,
                    state    = CloneState(machine.states[i].state)
                };
            }

            //State Transitions
            for (int i = 0; i < outStates.Length; i++)
            {
                AnimatorStateTransition[] outTransitions = new AnimatorStateTransition[machine.states[i].state.transitions.Length];
                for (int j = 0; j < outTransitions.Length; j++)
                {
                    outTransitions[j] = (AnimatorStateTransition)CloneTransition(machine.states[i].state.transitions[j], outStates);
                }
                outStates[i].state.transitions = outTransitions;
            }
            output.states = outStates;

            //Any Transitions
            AnimatorStateTransition[] outAnyTransitions = new AnimatorStateTransition[machine.anyStateTransitions.Length];
            for (int i = 0; i < outAnyTransitions.Length; i++)
            {
                outAnyTransitions[i] = (AnimatorStateTransition)CloneTransition(machine.anyStateTransitions[i], outStates);
            }
            output.anyStateTransitions = outAnyTransitions;

            //Entry Transitions
            AnimatorTransition[] outEntryTransitions = new AnimatorTransition[machine.entryTransitions.Length];
            for (int i = 0; i < outEntryTransitions.Length; i++)
            {
                outEntryTransitions[i] = (AnimatorTransition)CloneTransition(machine.entryTransitions[i], outStates);
            }
            output.entryTransitions = outEntryTransitions;

            //Behaviors
            StateMachineBehaviour[] outBehaviors = new StateMachineBehaviour[machine.behaviours.Length];
            for (int i = 0; i < outBehaviors.Length; i++)
            {
                outBehaviors[i] = CloneBehavior(machine.behaviours[i]);
            }
            output.behaviours = outBehaviors;

            //Default State
            foreach (ChildAnimatorState childState in outStates)
            {
                if (childState.state.name == machine.defaultState.name)
                {
                    output.defaultState = childState.state;
                    break;
                }
            }

            return(output);
        }
示例#21
0
        private AnimatorStateMachine(AssetInfo assetInfo, AnimatorController controller, int stateMachineIndex) :
            base(assetInfo, HideFlags.HideInHierarchy)
        {
            VirtualSerializedFile virtualFile = (VirtualSerializedFile)assetInfo.File;

            LayerConstant layer = controller.Controller.GetLayerByStateMachineIndex(stateMachineIndex);

            Name = controller.TOS[layer.Binding];

            StateMachineConstant stateMachine = controller.Controller.StateMachineArray[stateMachineIndex].Instance;

            int stateCount        = stateMachine.StateConstantArray.Count;
            int stateMachineCount = 0;
            int count             = stateCount + stateMachineCount;
            int side = (int)Math.Ceiling(Math.Sqrt(count));

            List <AnimatorState> states = new List <AnimatorState>();

            m_childStates = new ChildAnimatorState[stateCount];
            for (int y = 0, stateIndex = 0; y < side && stateIndex < stateCount; y++)
            {
                for (int x = 0; x < side && stateIndex < stateCount; x++, stateIndex++)
                {
                    Vector3f           position   = new Vector3f(x * StateOffset, y * StateOffset, 0.0f);
                    AnimatorState      state      = AnimatorState.CreateVirtualInstance(virtualFile, controller, stateMachineIndex, stateIndex, position);
                    ChildAnimatorState childState = new ChildAnimatorState(state, position);
                    m_childStates[stateIndex] = childState;
                    states.Add(state);
                }
            }
#warning TODO: child StateMachines
            m_childStateMachines = new ChildAnimatorStateMachine[stateMachineCount];

            // set destination state for transitions here because all states has become valid only now
            for (int i = 0; i < stateMachine.StateConstantArray.Count; i++)
            {
                AnimatorState state         = states[i];
                StateConstant stateConstant = stateMachine.StateConstantArray[i].Instance;
                PPtr <AnimatorStateTransition>[] transitions = new PPtr <AnimatorStateTransition> [stateConstant.TransitionConstantArray.Count];
                for (int j = 0; j < stateConstant.TransitionConstantArray.Count; j++)
                {
                    TransitionConstant transitionConstant         = stateConstant.TransitionConstantArray[j].Instance;
                    AnimatorStateTransition.Parameters parameters = new AnimatorStateTransition.Parameters
                    {
                        StateMachine = stateMachine,
                        States       = states,
                        TOS          = controller.TOS,
                        Transition   = transitionConstant,
                        Version      = controller.File.Version,
                    };
                    AnimatorStateTransition transition = AnimatorStateTransition.CreateVirtualInstance(virtualFile, parameters);
                    transitions[j] = transition.File.CreatePPtr(transition);
                }
                state.Transitions = transitions;
            }

            m_anyStateTransitions = new PPtr <AnimatorStateTransition> [stateMachine.AnyStateTransitionConstantArray.Count];
            for (int i = 0; i < stateMachine.AnyStateTransitionConstantArray.Count; i++)
            {
                TransitionConstant transitionConstant         = stateMachine.AnyStateTransitionConstantArray[i].Instance;
                AnimatorStateTransition.Parameters parameters = new AnimatorStateTransition.Parameters
                {
                    StateMachine = stateMachine,
                    States       = states,
                    TOS          = controller.TOS,
                    Transition   = transitionConstant,
                    Version      = controller.File.Version,
                };
                AnimatorStateTransition transition = AnimatorStateTransition.CreateVirtualInstance(virtualFile, parameters);
                m_anyStateTransitions[i] = transition.File.CreatePPtr(transition);
            }

            StateMachineConstant.Parameters stateParameters = new StateMachineConstant.Parameters
            {
                ID      = layer.Binding,
                States  = states,
                TOS     = controller.TOS,
                Version = controller.File.Version,
            };
            m_entryTransitions       = stateMachine.CreateEntryTransitions(virtualFile, stateParameters);
            m_stateMachineBehaviours = Array.Empty <PPtr <MonoBehaviour> >();

            AnyStatePosition           = new Vector3f(0.0f, -StateOffset, 0.0f);
            EntryPosition              = new Vector3f(StateOffset, -StateOffset, 0.0f);
            ExitPosition               = new Vector3f(2.0f * StateOffset, -StateOffset, 0.0f);
            ParentStateMachinePosition = new Vector3f(0.0f, -2.0f * StateOffset, 0.0f);

            DefaultState = ChildStates.Count > 0 ? ChildStates[stateMachine.DefaultState].State : default;
        }
示例#22
0
        /// <summary>
        /// Generates the code to recreate the specified state machine.
        /// </summary>
        /// <param name="parentStateMachineName">The name of the parent state machine variable.</param>
        /// <param name="childStateMachine">The state machine to generate the code of.</param>
        /// <param name="generatedCode">The final generated code.</param>
        private static void GenerateStateMachine(string parentStateMachineName, ChildAnimatorStateMachine childStateMachine, StringBuilder generatedCode)
        {
            var stateMachine = childStateMachine.stateMachine;

            generatedCode.AppendLine("\t\t\t// State Machine.");
            var uniqueStateMachineName = UniqueName(stateMachine);

            generatedCode.AppendLine("\t\t\tvar " + uniqueStateMachineName + " = " + parentStateMachineName + ".AddStateMachine(\"" +
                                     stateMachine.name + "\", " + Vector3String(childStateMachine.position) + ");");
            generatedCode.AppendLine();

            // Add all the states.
            if (stateMachine.states.Length > 0)
            {
                generatedCode.AppendLine("\t\t\t// States.");
                for (int i = 0; i < stateMachine.states.Length; ++i)
                {
                    var state           = stateMachine.states[i].state;
                    var uniqueStateName = UniqueName(state);
                    generatedCode.AppendLine("\t\t\tvar " + uniqueStateName + " = " + uniqueStateMachineName + ".AddState(\"" + state.name + "\", " +
                                             Vector3String(stateMachine.states[i].position) + ");");
                    if (state.motion is BlendTree)
                    {
                        var blendTree     = state.motion as BlendTree;
                        var blendTreeName = uniqueStateName + UniqueName(blendTree);
                        GenerateBlendTree(blendTreeName, blendTree, generatedCode, 3);
                        generatedCode.AppendLine("\t\t\t" + uniqueStateName + ".motion = " + blendTreeName + ";");
                    }
                    else if (state.motion != null)
                    {
                        generatedCode.AppendLine("\t\t\t" + uniqueStateName + ".motion = " + UniqueName(state.motion) + ";");
                    }
                    generatedCode.AppendLine("\t\t\t" + uniqueStateName + ".cycleOffset = " + state.cycleOffset + "f;");
                    if (!string.IsNullOrEmpty(state.cycleOffsetParameter))
                    {
                        generatedCode.AppendLine("\t\t\t" + uniqueStateName + ".cycleOffsetParameter = \"" + state.cycleOffsetParameter + "\";");
                    }
                    generatedCode.AppendLine("\t\t\t" + uniqueStateName + ".cycleOffsetParameterActive = " + BoolString(state.cycleOffsetParameterActive) + ";");
                    generatedCode.AppendLine("\t\t\t" + uniqueStateName + ".iKOnFeet = " + BoolString(state.iKOnFeet) + ";");
                    generatedCode.AppendLine("\t\t\t" + uniqueStateName + ".mirror = " + BoolString(state.mirror) + ";");
                    if (!string.IsNullOrEmpty(state.mirrorParameter))
                    {
                        generatedCode.AppendLine("\t\t\t" + uniqueStateName + ".mirrorParameter = \"" + state.mirrorParameter + "\";");
                    }
                    generatedCode.AppendLine("\t\t\t" + uniqueStateName + ".mirrorParameterActive = " + BoolString(state.mirrorParameterActive) + ";");
                    generatedCode.AppendLine("\t\t\t" + uniqueStateName + ".speed = " + state.speed + "f;");
                    if (!string.IsNullOrEmpty(state.speedParameter))
                    {
                        generatedCode.AppendLine("\t\t\t" + uniqueStateName + ".speedParameter = \"" + state.speedParameter + "\";");
                    }
                    generatedCode.AppendLine("\t\t\t" + uniqueStateName + ".speedParameterActive = " + BoolString(state.speedParameterActive) + ";");
                    if (!string.IsNullOrEmpty(state.tag))
                    {
                        generatedCode.AppendLine("\t\t\t" + uniqueStateName + ".tag = \"" + state.tag + "\";");
                    }
                    generatedCode.AppendLine("\t\t\t" + uniqueStateName + ".writeDefaultValues = " + BoolString(state.writeDefaultValues) + ";");
                    generatedCode.AppendLine();
                }
            }

            // Add all of the any state transitions.
            if (stateMachine.anyStateTransitions.Length > 0)
            {
                generatedCode.AppendLine("\t\t\t// Any State Transitions.");
                for (int i = 0; i < stateMachine.anyStateTransitions.Length; ++i)
                {
                    GenerateTransition(uniqueStateMachineName, stateMachine.anyStateTransitions[i], false, true, generatedCode);
                    generatedCode.AppendLine();
                }
            }

            // Add all of the entry transitions.
            if (stateMachine.entryTransitions.Length > 0)
            {
                generatedCode.AppendLine("\t\t\t// Entry Transitions.");
                for (int i = 0; i < stateMachine.entryTransitions.Length; ++i)
                {
                    GenerateTransition(uniqueStateMachineName, stateMachine.entryTransitions[i], false, false, generatedCode);
                    generatedCode.AppendLine();
                }
            }

            // Add all of the state machines.
            for (int i = 0; i < stateMachine.stateMachines.Length; ++i)
            {
                GenerateStateMachine(uniqueStateMachineName, stateMachine.stateMachines[i], generatedCode);
            }

            // Add the state machine defaults.
            generatedCode.AppendLine("\t\t\t// State Machine Defaults.");
            generatedCode.AppendLine("\t\t\t" + uniqueStateMachineName + ".anyStatePosition = " + Vector3String(stateMachine.anyStatePosition) + ";");
            generatedCode.AppendLine("\t\t\t" + uniqueStateMachineName + ".defaultState = " + UniqueName(stateMachine.defaultState) + ";");
            generatedCode.AppendLine("\t\t\t" + uniqueStateMachineName + ".entryPosition = " + Vector3String(stateMachine.entryPosition) + ";");
            generatedCode.AppendLine("\t\t\t" + uniqueStateMachineName + ".exitPosition = " + Vector3String(stateMachine.exitPosition) + ";");
            generatedCode.AppendLine("\t\t\t" + uniqueStateMachineName + ".parentStateMachinePosition = " + Vector3String(stateMachine.parentStateMachinePosition) + ";");
            generatedCode.AppendLine();
        }