(三)Unity5.0新特性------State Machine Behaviours
出处:http://blog.csdn.net/u010019717
author:孙广东 时间:2015.3.31
(State machine behaviours)状态机的行为在Animator Controller的脚本中是可以附加到动画状态或子状态机。每当你进入一种状态,就可以对其添加各种各样的状态依赖例如播放声音等行为,他们甚至可以独立于动画animation。而用于(logic state machines )逻辑状态机。要添加(State machine behaviours)状态机行为到状态或子状态机,请单击inspector中的Add Behaviour按钮。
从这里你可以选择从现有存在的 (State machine behaviours)状态机行为,或创建一个新的。
新的(state machine behaviours )状态机行为被创建在C#语言中.
所有(state machine behaviours )状态机行为从同一个基类继承,StateMachineBehaviour。因为他们可以支持继承,如果您希望添加多个类,当然这个功能可以轻易的实现。有关继承的更多信息,请参阅下面链接的信息。
StateMachineBehaviour 函数
(state machine behaviours )状态机行为的核心是 5 个函数:在(animator state )动画状态中自动被调用的 和 2个函数 :在一个子状态机中被自动调用的。它们在创建时,添加到新的(state machine behaviours )状态机的行为中 会注释掉一些超出版本的这些函数 。这些函数是 OnStateEnter、 OnStateUpdate、 OnStateExit、 OnStateMove 和 OnStateIK。附加功能的子状态机转换(transitions )是 OnStateMachineEnter 和 OnStateMachineExit。
所有的这些函数有三个参数传递给他们: Animator, AnimatorStateInfo和 layer 索引。
override public void OnStateEnter (Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { }
· (Animator parameter )动画参数是特定的animator ,是这个状态机行为的引用。例如,这可以用于设置 动画参数的值只能在此状态下,例如,用于blend tree混合树。
· AnimatorStateInfo 是状态机的行为是对state 的当前信息。它是相当于writing animator.GetCurrentStateInfo(layerIndex); 这可以涉及该clip剪辑的正常的时间的操作很有用。
· LayerIndex 是状态机行为状态的layer 层。例如,0为基底图层,1用于第一个 等等。
随着 MonoBehaviours, StateMachineBehaviour 函数在特定情况下被调用。
OnStateEnter 正在played的状态的第一帧被调用。
OnStateUpdate MonoBehaviour Updates 更新后被调用,每一帧animator 是playing 时这个行为的状态。
OnStateExit 转换到另一个状态的最后一帧 被调用。
OnStateMove 在OnAnimatorMove之前被调用 ,将在MonoBehaviours 调用之前的每个帧的state playing 。当调用 OnStateMove 时,它将停止 MonoBehaviours 调用 OnAnimatorMove。
OnStateIK is called after OnAnimatorIK on MonoBehaviours for every frame the while the state is being played. It is important to note that OnStateIK will only be called if the state is on a layer that has an IK pass. By default, layers do not have an IK pass and so this function will not be called. For more information on IK see the information linked below.
OnStateMachineEnter 在 animator plays 的内容的一个子状态机的第一帧上被调用。
OnStateMachineExit 从一个子状态机过渡的最后一帧上被调用。
使用(State Machine Behaviours)状态机行为的示例
考虑了beat’em up风格的游戏 在当你执行特殊动作,你想要播放粒子系统particle systems 和 攻击的你死我活。此脚本可以用含有特殊的move’s 动画的动画状态。
override public void OnStateEnter (Animator animator, AnimatorStateInfo stateInfo, int layerIndex) { player = GameObject.Find(“Player”); }
(State machine behaviours)状态机行为他们的创建方式不像MonoBehaviours 。当MonoBehaviours 实例被创建并被添加到一个游戏对象上因此成为场景对象,StateMachineBehaviour 类派生自 ScriptableObject。因此,状态机行为是 assets,不是场景对象。 这意味着状态机行为要想存在在一个场景中,状态机行为在运行时自动创建实例 ,在Animator’s 的内部Awake 调用。这意味着在 MonoBehaviour 的 Awake 函数期间 找到 对它们的引用是不建议,因为它将产生不可预知的结果。
在MonoBehaviour中 要获得对 StateMachineBehaviour 的引用 ,可以使用任何 animator.GetBehaviour<>() 或者 animator.GetBehaviours<>(). GetComponent<>() and GetComponents<>().的功能类似 。GetBehaviour 将在animator上找到的第一个实例 返回指定的 StateMachineBehaviour 。GetBehaviours 将返回找到的指定类型的所有 StateMachineBehaviours 的数组。由于不能保证状态机行为已在Awake中实例化,应在Start 函数值红 调用这些函数。
这里是单一的 StateMachineBehaviour 和 MonoBehaviour 之间的查找 引用一个短的例子。
using UnityEngine; public class ExampleMonoBehaviour : MonoBehaviour { private Animator animator; // Reference to the Animator component on this gameobject. private ExampleStateMachineBehaviour exampleSmb; // Reference to a single StateMachineBehaviour. void Awake () { // Find a reference to the Animator component in Awake since it exists in the scene. animator = GetComponent <Animator> (); } void Start () { // Find a reference to the ExampleStateMachineBehaviour in Start since it might not exist yet in Awake. exampleSmb = animator.GetBehaviour <ExampleStateMachineBehaviour> (); // Set the StateMachineBehaviour‘s reference to an ExampleMonoBehaviour to this. exampleSmb.exampleMb = this; } }
using UnityEngine; public class ExampleStateMachineBehaviour : StateMachineBehaviour { public ExampleMonoBehaviour exampleMb; }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。