【unity游戏开发入门到精通——动画篇】Animator状态机行为脚本

考虑到每个人基础可能不一样,且并不是所有人都有同时做2D、3D开发的需求,所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇

  • 【C#篇】:主要讲解C#的基础语法,包括变量、数据类型、运算符、流程控制、面向对象等,适合没有编程基础的同学入门。
  • 【unity通用篇】:主要讲解unity的基础通用的知识,包括unity界面、unity脚本、unity资源管理、unity动画、unity摄像机等,适合unity初学者入门。
  • 【unity3D篇】:主要讲解unity3D的知识,unity3D角色、unity3D物理系统、unity3D光照等,适合只想做2D游戏的开发者学习。
  • 【unity2D篇】unity2D篇:主要讲解unity2D的知识,包括unity2D角色、unity2D物理系统、unity2D光照等,适合只想做3D游戏的开发者学习。

这样方便大家按需选择性的去学习,比如有编程基础的大概率可以直接从unity通用篇开始入门,没有编程基础的建议从C#篇开始学习。只想做2D游戏的话,可以直接从unity2D篇开始学习,3D篇大概率就不需要看了,节约学习时间成本。

一、状态机行为脚本是什么

状态机行为脚本是一类特殊的脚本,继承指定的基类,主要用于关联到状态机中的状态矩形上。状态机行为脚本相对动画事件来说更准确,但是使用起来稍微麻烦一些。根据实际需求选择使用。

我们可以按照一定规则编写脚本,在进入、退出、保持在某一个特定状态时进行逻辑处理。

简单解释就是为 Animator Controller 状态机窗口中的某一个状态添加一个脚本,利用这个脚本我们可以做一些特殊功能,比如:

  • 进入或退出某一状态时播放声音
  • 仅在某些状态下检测一些逻辑,比如是否接触地面等等
  • 激活和控制某些状态相关的特效

二、如何使用状态机脚本

通过Animator动作添加或者新建一个脚本继承 StateMachineBehaviour 基类。
在这里插入图片描述
在这里插入图片描述

实现其中的特定方法进行状态行为监听

  • OnStateEnter: 进入状态时,第一个 Update 中调用
  • OnStateExit: 退出状态时,最后一个 Update 中调用
  • OnStateIK: OnAnimatorIK 后调用
  • OnStateMove: OnAnimatorMove 后调用
  • OnStateUpdate: 除第一帧和最后一帧,每个 Update 上调用
  • OnStateMachineEnter: 子状态机进入时调用,第一个 Update 中调用
  • OnStateMachineExit: 子状态机退出时调用,最后一个 Update 中调用

代码相关:

// 重写该函数,当进入指定状态时调用
public override void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
    
    
    // 当前状态名称与所需状态名称相同时输出日志
    if (stateInfo.IsName(stateName))
        Debug.Log("进入HumanoidIdle状态");
}

// 重写该函数,当退出指定状态时调用
public override void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
    
    
    // 当前状态名称与指定名称相同时输出日志
    if (stateInfo.IsName("HumanoidIdle"))
        Debug.Log("退出HumanoidIdle状态");
}

// 重写该函数,当进行动画 IK 计算时调用
public override void OnStateIK(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
    
    
    base.OnStateIK(animator, stateInfo, layerIndex);
}

// 重写该函数,当进行动画更新时每帧调用
public override void OnStateMove(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
    
    
    base.OnStateMove(animator, stateInfo, layerIndex);
}

// 重写该函数,当进行动画更新时每帧调用
public override void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex)
{
    
    
    base.OnStateUpdate(animator, stateInfo, layerIndex);
    // 当前状态名称为指定名称时输出日志
    if (stateInfo.IsName("HumanoidIdle"))
        Debug.Log("处于HumanoidIdle状态");
}

// 重写该函数,当进入状态机时调用
public override void OnStateMachineEnter(Animator animator, int stateMachinePathHash)
{
    
    
    base.OnStateMachineEnter(animator, stateMachinePathHash);
}

// 重写该函数,当退出状态机时调用
public override void OnStateMachineExit(Animator animator, int stateMachinePathHash)
{
    
    
    base.OnStateMachineExit(animator, stateMachinePathHash);
}

可以添加变量在外面配置,注意在动画播放到特殊时期时处理逻辑

三、实战

参考:


专栏推荐

地址
【零基础入门unity游戏开发——C#篇】
【零基础入门unity游戏开发——unity通用篇】
【零基础入门unity游戏开发——unity3D篇】
【零基础入门unity游戏开发——unity2D篇】
【制作100个Unity游戏】
【推荐100个unity插件】
【实现100个unity特效】
【unity框架/工具集开发】

完结

好了,我是向宇,博客地址:https://xiangyu.blog.csdn.net,如果学习过程中遇到任何问题,也欢迎你评论私信找我。

赠人玫瑰,手有余香!如果文章内容对你有所帮助,请不要吝啬你的点赞评论和关注,你的每一次支持都是我不断创作的最大动力。当然如果你发现了文章中存在错误或者有更好的解决方法,也欢迎评论私信告诉我哦!
在这里插入图片描述