StateMachineBehaviour 是一个可以添加到状态机状态的组件。它是状态上任何脚本必须派生的基类。
状态机可以同时具有多达三个不同的活动状态:当前状态、下一个状态和中断状态。
状态机始终具有当前状态。当状态机过渡到新状态时,会添加“下一个状态”。过渡完成后,当前状态将终止,下一个状态将成为新的当前状态。
如果正在进行的过渡被过渡到新状态中断,则下一个状态将成为中断状态,而由新过渡目标的状态现在将成为下一个状态。当前状态将保持不变,直到所有中断的过渡完成。一旦最后一个过渡完成并且不再有中断,当前状态和中断状态将终止,下一个状态将成为新的当前状态。
StateMachineBehaviour 有一些预定义的与状态相关的消息,您可以实现这些消息:OnStateEnter、OnStateExit、OnStateIK、OnStateMove、OnStateUpdate。
在适当的情况下,这些消息将按以下顺序针对上面提到的活动状态调用:当前状态,然后是中断状态,然后是下一个状态。
有关更多信息,请参阅每条消息的说明。
StateMachineBehaviour 还有一些与进出状态机的过渡相关的预定义消息
OnStateMachineEnter、OnStateMachineExit。
每当进行状态机过渡时,都会调用这些消息。
层级注意事项:
如果 AnimatorController 包含同步层级,则消息可能会为单个状态调用多次。在这种情况下,消息将针对包含该状态的每个同步层级调用一次,按升序排列。
其他注意事项:
默认情况下,Animator 会实例化控制器中定义的每个行为的新实例。如果您希望共享行为实例,请使用类属性 SharedBetweenAnimatorsAttribute 来控制行为的实例化方式。
using UnityEngine;
public class AttackBehaviour : StateMachineBehaviour { public GameObject particle; public float radius; public float power;
protected GameObject clone;
override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { clone = Instantiate(particle, animator.rootPosition, Quaternion.identity) as GameObject; Rigidbody rb = clone.GetComponent<Rigidbody>(); rb.AddExplosionForce(power, animator.rootPosition, radius, 3.0f); }
override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { Destroy(clone); }
override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { Debug.Log("On Attack Update "); }
override public void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { Debug.Log("On Attack Move "); }
override public void OnStateIK(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { Debug.Log("On Attack IK "); } }
OnStateMachineEnter | 在进入状态机的过渡时,在第一个更新帧上调用。实现此消息以影响进入子状态机的过渡。 |
OnStateMachineExit | 在离开状态机的过渡时,在最后一个更新帧上调用。实现此消息以影响退出子状态机的过渡 |
OnStateEnter | 当状态机评估此状态时,在第一个更新帧上调用。实现此消息以对新状态开始做出反应。 |
OnStateExit | 当状态机评估此状态时,在最后一个更新帧上调用。实现此消息以对状态结束做出反应。 |
OnStateIK | 在 Animator IK 传递期间调用。实现此消息以在逐状态基础上评估状态机后修改动画结果。 |
OnStateMove | 在 Animator 根运动传递期间调用。实现此消息以在逐状态基础上修改动画根运动的结果。 |
OnStateUpdate | 除第一帧和最后一帧之外,在每个更新帧上调用。实现此消息以在逐状态基础上执行自定义逻辑。 |
GetInstanceID | 获取对象的实例 ID。 |
ToString | 返回对象的名称。 |
Destroy | 删除 GameObject、组件或资源。 |
DestroyImmediate | 立即销毁对象 obj。强烈建议您使用 Destroy 代替。 |
DontDestroyOnLoad | 加载新场景时不要销毁目标对象。 |
FindAnyObjectByType | 检索任何活动加载的类型为 type 的对象。 |
FindFirstObjectByType | 检索第一个活动加载的类型为 type 的对象。 |
FindObjectsByType | 检索类型为 type 的所有加载对象的列表。 |
Instantiate | 克隆对象 original 并返回克隆。 |
InstantiateAsync | 捕获原始对象(必须与某个 GameObject 相关联)的快照并返回 AsyncInstantiateOperation。 |
CreateInstance | 创建可脚本化对象的实例。 |
bool | 对象是否存在? |
operator != | 比较两个对象是否引用不同的对象。 |
operator == | 比较两个对象引用以查看它们是否引用同一个对象。 |