Example #1
0
    protected void PasteAsNew()
    {
        if (AnimatorStateEventBehaviourCopier.copiedBehaviours == null)
        {
            return;
        }

        StateMachineBehaviourContext[] contexts = AnimatorController.FindStateMachineBehaviourContext(this);
        if (contexts == null)
        {
            return;
        }

        StateMachineBehaviour copiedTarget = null;

        AnimatorState state = contexts[0].animatorObject as AnimatorState;

        if (state != null)
        {
            copiedTarget = state.AddStateMachineBehaviour(AnimatorStateEventBehaviourCopier.copiedBehaviours.GetType());
        }
        else
        {
            AnimatorStateMachine subMachine = contexts[0].animatorObject as AnimatorStateMachine;
            if (subMachine != null)
            {
                copiedTarget = subMachine.AddStateMachineBehaviour(AnimatorStateEventBehaviourCopier.copiedBehaviours.GetType());
            }
        }

        if (copiedTarget != null)
        {
            EditorUtility.CopySerialized(AnimatorStateEventBehaviourCopier.copiedBehaviours, copiedTarget);
        }
    }
Example #2
0
        private static AnimatorStateMachine CloneStateMachine(AnimatorStateMachine old)
        {
            var n = new AnimatorStateMachine
            {
                anyStatePosition           = old.anyStatePosition,
                entryPosition              = old.entryPosition,
                exitPosition               = old.exitPosition,
                hideFlags                  = old.hideFlags,
                name                       = old.name,
                parentStateMachinePosition = old.parentStateMachinePosition,
                stateMachines              = old.stateMachines.Select(x => CloneChildStateMachine(x)).ToArray(),
                states                     = old.states.Select(x => CloneChildAnimatorState(x)).ToArray()
            };

            AssetDatabase.AddObjectToAsset(n, _assetPath);
            n.defaultState = n.states.Where(x => x.state.nameHash == old.defaultState?.nameHash)
                             .Select(x => x.state).FirstOrDefault();

            foreach (var oldb in old.behaviours)
            {
                var behaviour = n.AddStateMachineBehaviour(old.GetType());
                CloneBehaviourParameters(oldb, behaviour);
            }
            return(n);
        }
Example #3
0
    private static void CheckHaveBehaviour(AnimatorStateMachine sm)
    {
        bool needAddBehaviours = true;

        foreach (StateMachineBehaviour node in sm.behaviours.Where(node => node.GetType() == typeof(CommonStateMachineBehaviour)))
        {
            needAddBehaviours = false;
        }
        if (needAddBehaviours)
        {
            sm.AddStateMachineBehaviour <CommonStateMachineBehaviour>();
        }
    }
Example #4
0
        private static AnimatorStateMachine DuplicateStateMachine(AnimatorStateMachine srcStateMachine)
        {
            var dstStateMachine = new AnimatorStateMachine
            {
                anyStatePosition           = srcStateMachine.anyStatePosition,
                entryPosition              = srcStateMachine.entryPosition,
                exitPosition               = srcStateMachine.exitPosition,
                hideFlags                  = srcStateMachine.hideFlags,
                name                       = srcStateMachine.name,
                parentStateMachinePosition = srcStateMachine.parentStateMachinePosition,
                stateMachines              = srcStateMachine.stateMachines
                                             .Select(cs =>
                                                     new ChildAnimatorStateMachine
                {
                    position     = cs.position,
                    stateMachine = DuplicateStateMachine(cs.stateMachine)
                })
                                             .ToArray(),
                states = DuplicateChildStates(srcStateMachine.states),
            };

            // behaivoursを設定
            foreach (var srcBehaivour in srcStateMachine.behaviours)
            {
                var behaivour = dstStateMachine.AddStateMachineBehaviour(srcBehaivour.GetType());
                CopyBehaivourParameters(srcBehaivour, behaivour);
            }

            // defaultStateの設定
            if (srcStateMachine.defaultState != null)
            {
                var defaultStateIndex = srcStateMachine.states
                                        .Select((value, index) => new { Value = value.state, Index = index })
                                        .Where(s => s.Value == srcStateMachine.defaultState)
                                        .Select(s => s.Index).SingleOrDefault();
                dstStateMachine.defaultState = dstStateMachine.states[defaultStateIndex].state;
            }

            return(dstStateMachine);
        }
Example #5
0
        public static AnimatorStateMachine CloneDeep(this AnimatorStateMachine source)
        {
            var dest = new AnimatorStateMachine
            {
                defaultState               = InstanceCaches <AnimatorState> .FindOrCreate(source.defaultState, w => w.CloneDeep()),
                anyStatePosition           = source.anyStatePosition,
                entryPosition              = source.entryPosition,
                exitPosition               = source.exitPosition,
                parentStateMachinePosition = source.parentStateMachinePosition,
                hideFlags = source.hideFlags,
                name      = source.name
            };

            foreach (var sourceState in source.states)
            {
                dest.AddState(InstanceCaches <AnimatorState> .FindOrCreate(sourceState.state, w => w.CloneDeep()), sourceState.position);
            }

            foreach (var sourceTransition in source.anyStateTransitions)
            {
                AnimatorStateTransition transition = null;
                if (sourceTransition.destinationStateMachine != null)
                {
                    transition = dest.AddAnyStateTransition(InstanceCaches <AnimatorStateMachine> .FindOrCreate(sourceTransition.destinationStateMachine, CloneDeep));
                }

                if (sourceTransition.destinationState != null)
                {
                    transition = dest.AddAnyStateTransition(InstanceCaches <AnimatorState> .FindOrCreate(sourceTransition.destinationState, w => w.CloneDeep()));
                }

                if (transition == null)
                {
                    throw new ArgumentNullException(nameof(transition));
                }

                sourceTransition.CloneTo(transition);

                // should always false
                if (InstanceCaches <AnimatorStateTransition> .Find(sourceTransition.GetInstanceID()) == null)
                {
                    InstanceCaches <AnimatorStateTransition> .Register(sourceTransition.GetInstanceID(), transition);
                }
            }

            foreach (var sourceTransition in source.entryTransitions)
            {
                AnimatorTransition transition = null;
                if (sourceTransition.destinationStateMachine != null)
                {
                    transition = dest.AddEntryTransition(InstanceCaches <AnimatorStateMachine> .FindOrCreate(sourceTransition.destinationStateMachine, CloneDeep));
                }

                if (sourceTransition.destinationState != null)
                {
                    transition = dest.AddEntryTransition(InstanceCaches <AnimatorState> .FindOrCreate(sourceTransition.destinationState, w => w.CloneDeep()));
                }

                if (transition == null)
                {
                    throw new ArgumentNullException(nameof(transition));
                }

                transition.CloneTo(sourceTransition);

                // should always false
                if (InstanceCaches <AnimatorTransition> .Find(sourceTransition.GetInstanceID()) == null)
                {
                    InstanceCaches <AnimatorTransition> .Register(sourceTransition.GetInstanceID(), transition);
                }
            }

            foreach (var sourceBehaviour in source.behaviours)
            {
                var behaviour = dest.AddStateMachineBehaviour(sourceBehaviour.GetType());
                sourceBehaviour.CloneDeepTo(behaviour);

                // store
                InstanceCaches <StateMachineBehaviour> .Register(behaviour.GetInstanceID(), behaviour);
            }

            foreach (var sourceStateMachine in source.stateMachines)
            {
                dest.AddStateMachine(InstanceCaches <AnimatorStateMachine> .FindOrCreate(sourceStateMachine.stateMachine, CloneDeep), sourceStateMachine.position);
            }

            return(dest);
        }