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); } }
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); }
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>(); } }
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); }
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); }