关闭

Unity5.0新特性 StateMachineBehaviours

标签: Unity
524人阅读 评论(0) 收藏 举报
分类:

无意中发现了这个新特性,都怪自己没有仔细看unity的更新文档。

首先贴上StateMachineBehaviour类的代码。


#region 程序集 UnityEngine, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null
// E:\Unity Folder\Projects\LoadingDemo\Library\UnityAssemblies\UnityEngine.dll
#endregion

using UnityEngine.Experimental.Director;
using UnityEngine.Scripting;

namespace UnityEngine
{
    //
    // 摘要:
    //     ///
    //     StateMachineBehaviour is a component that can be added to a state machine state.
    //     It's the base class every script on a state derives from.
    //     ///
    [RequiredByNativeCodeAttribute]
    public abstract class StateMachineBehaviour : ScriptableObject
    {
        protected StateMachineBehaviour();

        public virtual void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex);
        public virtual void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex, AnimatorControllerPlayable controller);
        public virtual void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex);
        public virtual void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex, AnimatorControllerPlayable controller);
        public virtual void OnStateIK(Animator animator, AnimatorStateInfo stateInfo, int layerIndex);
        public virtual void OnStateIK(Animator animator, AnimatorStateInfo stateInfo, int layerIndex, AnimatorControllerPlayable controller);
        //
        // 摘要:
        //     ///
        //     Called on the first Update frame when making a transition to a StateMachine.
        //     This is not called when making a transition into a StateMachine sub-state.
        //     ///
        //
        // 参数:
        //   animator:
        //     The Animator playing this state machine.
        //
        //   stateMachinePathHash:
        //     The full path hash for this state machine.
        public virtual void OnStateMachineEnter(Animator animator, int stateMachinePathHash);
        public virtual void OnStateMachineEnter(Animator animator, int stateMachinePathHash, AnimatorControllerPlayable controller);
        //
        // 摘要:
        //     ///
        //     Called on the last Update frame when making a transition out of a StateMachine.
        //     This is not called when making a transition into a StateMachine sub-state.
        //     ///
        //
        // 参数:
        //   animator:
        //     The Animator playing this state machine.
        //
        //   stateMachinePathHash:
        //     The full path hash for this state machine.
        public virtual void OnStateMachineExit(Animator animator, int stateMachinePathHash);
        public virtual void OnStateMachineExit(Animator animator, int stateMachinePathHash, AnimatorControllerPlayable controller);
        public virtual void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex);
        public virtual void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex, AnimatorControllerPlayable controller);
        public virtual void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex);
        public virtual void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex, AnimatorControllerPlayable controller);
    }
}

那我们要怎样使用呢?

首先我们要选中AnimatorController中的某一个状态,


OK,图上的SMBExample脚本继承自StateMachineBehaviour类并重写了部分方法,贴上代码


using UnityEngine;
using System.Collections;

public class SMBExample : StateMachineBehaviour
{

    public override void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        base.OnStateEnter(animator, stateInfo, layerIndex);
        Debug.Log("OnStateEnter");
    }

    public override void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        base.OnStateExit(animator, stateInfo, layerIndex);
        Debug.Log("OnStateExit");
    }

    public override void OnStateIK(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        base.OnStateIK(animator, stateInfo, layerIndex);
        Debug.Log("OnStateIK");
    }

    public override void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        base.OnStateMove(animator, stateInfo, layerIndex);
        Debug.Log("OnStateMove");
    }

    public override void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
    {
        base.OnStateUpdate(animator, stateInfo, layerIndex);
        Debug.Log("OnStateUpdate");
    }

    //Animator animator, AnimatorStateInfo stateInfo, int layerIndex, AnimatorControllerPlayable controller

    //OnStateMachineEnter
    //OnStateMachineExit

}


随着 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 从一个子状态机过渡的最后一帧上被调用。




其中这些方法中的三个参数含义为:


Animator 动画参数是特定的animator ,是这个状态机行为的引用。例如,这可以用于设置 动画参数的值只能在此状态下,例如,用于blend tree混合树。

AnimatorStateInfo 是状态机的行为是对state 的当前信息。它是相当于writing animator.GetCurrentStateInfo(layerIndex);  这可以涉及该clip剪辑的正常的时间的操作很有用。

LayerIndex 是状态机行为状态的layer 层。例如,0为基底图层,1用于第一个 等等。


参考博客: http://blog.csdn.net/u010019717/article/details/44760683

https://segmentfault.com/a/1190000003739237


更加详细的深入该类请查看第二个网址的文章。

博主只尝试了最简单的方法,还没有更加深入的运用,下次继续编辑这文章吧,哈哈。




0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

Unity3D AnimatorController

官方的潜行游戏模型资源
  • AWNUXCVBN
  • AWNUXCVBN
  • 2014-11-07 10:45
  • 13904

(三)Unity5.0新特性------动画的StateMachineBehaviours

State machine behaviours are scripts that can be attached to animator states or sub-state machines i...
  • u010019717
  • u010019717
  • 2015-03-31 09:32
  • 7530

【Unity】Unity 5.0 中酷炫的新动画功能详—— StateMachineBehaviour、StateMachineTransitions和RootMotionAuthoring

Unity 动画团队一直在努力工作、同心协力,使 Unity 5.0 具有令人印象深刻的功能集。敬请期待新动画功能,下面是有关新动画功能的简要概述,希望可以对Unity 的用户们有所帮助!State ...
  • RICKShaozhiheng
  • RICKShaozhiheng
  • 2016-12-15 14:00
  • 1272

StateMachineBehaviour状态机行为

StateMachineBehaviour和MonoBehavior一样是一个特殊的类,Monobehavior挂在Gameobject下,而StateMachineBehaviour挂在状态控制器下...
  • u014345526
  • u014345526
  • 2016-01-17 22:21
  • 1506

Unity5.0新特性------动画的StateMachineBehaviours

出处:http://blog.csdn.net/u010019717 author:孙广东      时间:2015.3.31       (State machine behaviour...
  • hany3000
  • hany3000
  • 2015-04-08 05:04
  • 786

Unity3D StateMachine扩展优化

1.Unity3D StateMachine正常的状态下是每个动做结束后没有回调,所以有时候我们要判断当前不是哪一个动作是要做什么的,如下: public class TestJS : MonoBeh...
  • u014761712
  • u014761712
  • 2017-02-05 16:51
  • 596

(二)Unity5.0新特性------unity内部:内存 和 性能(以及Unity5的升级优化)

我们的脚本代码里经常会需要访问gameObject引用或者某个组件的引用,最好的方式当然是在脚本Awake的时候就把这些可能访问的东西都缓存下来;如果需要访问临时gameObject实例的某属性或者临...
  • u010019717
  • u010019717
  • 2015-03-30 22:17
  • 4362

基于Unity5.0系统的新打包方式 [第一讲]

前言 在使用新的Unity3d 5.0后,我们发现在Inspector面板上多了一个东西 这里主要有两个可以设置的选项AssetBundle和Variant  AssetBundle  在...
  • cen616899547
  • cen616899547
  • 2015-06-19 15:25
  • 9427

(十一)Unity5新特性----实战2D游戏

在本教程中,将了解到U5新功能,你通过本教程,您将了解以下内容:Changes in Component AccessPhysics EffectorsAdding Constant ForceAud...
  • u010019717
  • u010019717
  • 2015-07-12 09:37
  • 6546

(六)Unity5.0新特性------新动画功能

unity 5.0 中的新动画功能这里是你可以期待的新动画功能快速概述 !State Machine Behaviours状态机行为在Unity 5 中,你会能够将StateMachineBeha...
  • u010019717
  • u010019717
  • 2015-04-01 09:00
  • 2677
    个人资料
    • 访问:9300次
    • 积分:84
    • 等级:
    • 排名:千里之外
    • 原创:6篇
    • 转载:11篇
    • 译文:0篇
    • 评论:2条
    文章分类
    最新评论