版本: Unity 6 (6000.0)
语言英语
  • C#

StateMachineBehaviour

UnityEngine 中的类

/

继承自: ScriptableObject

/

实现于: UnityEngine.AnimationModule

建议更改

成功!

感谢您帮助我们提高 Unity 文档的质量。虽然我们无法接受所有提交的内容,但我们会阅读用户提出的每个建议更改,并在适用时进行更新。

关闭

提交失败

由于某种原因,您的建议更改无法提交。请在几分钟后 <a>重试</a>。感谢您抽出时间帮助我们提高 Unity 文档的质量。

关闭

取消

描述

StateMachineBehaviour 是一个可以添加到状态机状态的组件。它是状态上任何脚本必须派生的基类。

状态机可以同时具有多达三个不同的活动状态:当前状态、下一个状态和中断状态。
状态机始终具有当前状态。当状态机过渡到新状态时,会添加“下一个状态”。过渡完成后,当前状态将终止,下一个状态将成为新的当前状态。
如果正在进行的过渡被过渡到新状态中断,则下一个状态将成为中断状态,而由新过渡目标的状态现在将成为下一个状态。当前状态将保持不变,直到所有中断的过渡完成。一旦最后一个过渡完成并且不再有中断,当前状态和中断状态将终止,下一个状态将成为新的当前状态。

StateMachineBehaviour 有一些预定义的与状态相关的消息,您可以实现这些消息:OnStateEnterOnStateExitOnStateIKOnStateMoveOnStateUpdate
在适当的情况下,这些消息将按以下顺序针对上面提到的活动状态调用:当前状态,然后是中断状态,然后是下一个状态。
有关更多信息,请参阅每条消息的说明。

StateMachineBehaviour 还有一些与进出状态机的过渡相关的预定义消息
OnStateMachineEnterOnStateMachineExit
每当进行状态机过渡时,都会调用这些消息。

层级注意事项:
如果 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除第一帧和最后一帧之外,在每个更新帧上调用。实现此消息以在逐状态基础上执行自定义逻辑。

继承的成员

属性

hideFlags对象是否应隐藏、与场景一起保存或可供用户修改?
name对象的名称。

公共方法

GetInstanceID获取对象的实例 ID。
ToString返回对象的名称。

静态方法

Destroy删除 GameObject、组件或资源。
DestroyImmediate立即销毁对象 obj。强烈建议您使用 Destroy 代替。
DontDestroyOnLoad加载新场景时不要销毁目标对象。
FindAnyObjectByType检索任何活动加载的类型为 type 的对象。
FindFirstObjectByType检索第一个活动加载的类型为 type 的对象。
FindObjectsByType检索类型为 type 的所有加载对象的列表。
Instantiate克隆对象 original 并返回克隆。
InstantiateAsync捕获原始对象(必须与某个 GameObject 相关联)的快照并返回 AsyncInstantiateOperation。
CreateInstance创建可脚本化对象的实例。

运算符

bool对象是否存在?
operator !=比较两个对象是否引用不同的对象。
operator ==比较两个对象引用以查看它们是否引用同一个对象。

消息

Awake当创建 ScriptableObject 的实例时调用。
OnDestroy当可脚本化对象将被销毁时,会调用此函数。
OnDisable当可脚本化对象超出范围时,会调用此函数。
OnEnable当对象加载时,会调用此函数。
OnValidate仅在编辑器中,Unity 在脚本加载或 Inspector 中的值更改时调用的函数。
Reset重置为默认值。