动画控制器 (Animator Controller) 通过具有状态机(由参数控制)的层来控制动画。
using UnityEngine; using UnityEditor; using UnityEditor.Animations; using System.Collections;
// Create a menu item that causes a new controller and statemachine to be created.
public class SM : MonoBehaviour { [MenuItem("MyMenu/Create Controller")] static void CreateController() { // Creates the controller var controller = UnityEditor.Animations.AnimatorController.CreateAnimatorControllerAtPath("Assets/Mecanim/StateMachineTransitions.controller");
// Add parameters controller.AddParameter("TransitionNow", AnimatorControllerParameterType.Trigger); controller.AddParameter("Reset", AnimatorControllerParameterType.Trigger); controller.AddParameter("GotoB1", AnimatorControllerParameterType.Trigger); controller.AddParameter("GotoC", AnimatorControllerParameterType.Trigger);
// Add StateMachines var rootStateMachine = controller.layers[0].stateMachine; var stateMachineA = rootStateMachine.AddStateMachine("smA"); var stateMachineB = rootStateMachine.AddStateMachine("smB"); var stateMachineC = stateMachineB.AddStateMachine("smC");
// Add States var stateA1 = stateMachineA.AddState("stateA1"); var stateB1 = stateMachineB.AddState("stateB1"); var stateB2 = stateMachineB.AddState("stateB2"); stateMachineC.AddState("stateC1"); var stateC2 = stateMachineC.AddState("stateC2"); // don’t add an entry transition, should entry to state by default
// Add Transitions var exitTransition = stateA1.AddExitTransition(); exitTransition.AddCondition(UnityEditor.Animations.AnimatorConditionMode.If, 0, "TransitionNow"); exitTransition.duration = 0;
var resetTransition = stateMachineA.AddAnyStateTransition(stateA1); resetTransition.AddCondition(UnityEditor.Animations.AnimatorConditionMode.If, 0, "Reset"); resetTransition.duration = 0;
var transitionB1 = stateMachineB.AddEntryTransition(stateB1); transitionB1.AddCondition(UnityEditor.Animations.AnimatorConditionMode.If, 0, "GotoB1"); stateMachineB.AddEntryTransition(stateB2); stateMachineC.defaultState = stateC2; var exitTransitionC2 = stateC2.AddExitTransition(); exitTransitionC2.AddCondition(UnityEditor.Animations.AnimatorConditionMode.If, 0, "TransitionNow"); exitTransitionC2.duration = 0;
var stateMachineTransition = rootStateMachine.AddStateMachineTransition(stateMachineA, stateMachineC); stateMachineTransition.AddCondition(UnityEditor.Animations.AnimatorConditionMode.If, 0, "GotoC"); rootStateMachine.AddStateMachineTransition(stateMachineA, stateMachineB); } }
layers | 控制器中的层。 |
parameters | 用于在脚本和控制器之间通信的参数。例如,它们用于驱动过渡和混合树。 |
AnimatorController | 构造函数。 |
AddEffectiveStateMachineBehaviour | 为层 layerIndex 向 AnimatorState 添加 stateMachineBehaviourType 类型的状态机行为类。在处理同步层并且要在同步层添加状态机行为时应使用此函数。C# 用户可以使用通用版本。 |
AddLayer | Utility 函数,用于向控制器添加一个层。 |
AddMotion | Utility 函数,用其中的运动创建一个新状态。 |
AddParameter | Utility 函数,用于向控制器添加一个参数。 |
CreateBlendTreeInController | 在新 AnimatorState 中创建一个 BlendTree。 |
GetBehaviours | 返回所有与类型 T 匹配或派生自 T 的 StateMachineBehaviour。 |
GetStateEffectiveBehaviours | 获取 AnimatorState 的有效状态机行为列表。行为或者存储在 AnimatorStateMachine 中,或者存储在 AnimatorLayer 的重载中。使用此函数可获取有效使用的 Behaviour 列表。 |
GetStateEffectiveMotion | 获取 AnimatorState 的有效 Motion。Motion 或者存储在 AnimatorStateMachine 中,或者存储在 AnimatorLayer 的重载中。使用此函数可获取有效使用的 Motion。 |
MakeUniqueLayerName | 为层创建唯一名称。 |
MakeUniqueParameterName | 为参数创建唯一名称。 |
RemoveLayer | Utility 函数,用于从控制器删除一个层。 |
RemoveParameter | Utility 函数,用于从控制器删除一个参数。 |
SetStateEffectiveBehaviours | 为 AnimatorState 设置有效的状态机 Behaviour 列表。Behaviour 列表或者存储在 AnimatorStateMachine 中,或者存储在 AnimatorLayer 的重载中。使用此函数可设置有效使用的 Behaviour 列表。 |
SetStateEffectiveMotion | 设置 AnimatorState 的有效 Motion。Motion 或者存储在 AnimatorStateMachine 中,或者存储在 AnimatorLayer 的重载中。使用此函数可设置有效使用的 Motion。 |
CreateAnimatorControllerAtPath | 在给定路径处创建一个 AnimatorController。 |
CreateAnimatorControllerAtPathWithClip | 在给定路径处创建一个 AnimatorController,并自动创建一个带有 AnimatorStateMachine 的 AnimatorLayer,该状态机使用其中的 AnimationClip 添加一个 State。 |
CreateStateMachineBehaviour | 此函数将根据此脚本中的类定义创建一个 StateMachineBehaviour 实例。 |
FindStateMachineBehaviourContext | 使用此函数可检索行为的所有者。 |