Unity | 渡鸦避难所-6 | 有限状态机控制角色行为逻辑

这篇具有很好参考价值的文章主要介绍了Unity | 渡鸦避难所-6 | 有限状态机控制角色行为逻辑。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Unity | 渡鸦避难所-6 | 有限状态机控制角色行为逻辑,unity,游戏引擎,状态模式

1 有限状态机简介

有限状态机(英语:finite-state machine,缩写:FSM),简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学计算模型

在游戏开发中应用有限状态机,能够将复杂的行为逻辑分解为一组简单的状态和转换规则,每个状态都可以独立地处理其逻辑,使代码更加结构化和组织化。同时可以方便的添加新的状态和转换规则,以适应游戏的需求。而且避免了在每帧中检查所有可能的行为,只需要处理当前状态的逻辑

Unity 中的 Animator Controller 使用状态机来管理各种动画状态和它们之间的过渡。但角色处于不同的状态时,除了播放对应的动画外,也会执行相关的逻辑,使用状态机来控制角色的行为也会为开发带来很大的便利

2 动画状态机

1 动画工作流程

Unity 的动画系统基于动画剪辑的概念;动画剪辑包含某些对象应如何随时间改变其位置、旋转或其他属性的相关信息。每个剪辑可视为单个线性录制。来自外部的动画剪辑由美术师或动画师使用第三方工具(例如 Autodesk® 3ds Max® 或 Autodesk® Maya®)创建而成,或者来自动作捕捉工作室或其他来源

然后,动画剪辑将编入称为 Animator Controller 的一个类似于流程图的结构化系统中。Animator Controller 充当状态机,负责跟踪当前应该播放哪个剪辑以及动画应该何时改变或混合在一起

Unity | 渡鸦避难所-6 | 有限状态机控制角色行为逻辑,unity,游戏引擎,状态模式

2 动画状态机

角色或其他动画游戏对象通常具有若干不同的动画,这些动画对应于该角色或对象可在游戏中执行的不同动作。例如,角色可以在空闲时轻微呼吸或摇摆,在得到指令时行走,以及从平台上跌落时恐慌地抬起手臂。Mecanim 使用类似于流程图的可视化布局系统来表示状态机,从而控制需要在角色或对象上使用的动画剪辑并对这些动画剪辑排序

状态机的基本思想是使角色在某一给定时刻进行一个特定的动作。动作类型可因游戏类型的不同而不同,常用的动作包括空闲、行走、跑步、跳跃等,其中每一个动作被称为一种状态。在某种意义上,角色处于行走、空闲或者其它的状态中。一般来说,角色从一个状态立即切换到另一个状态是需要一定的限制条件的。比如角色只能从跑步状态切换到跑跳状态,而不能直接由静止状态切换到跑跳状态。角色从当前状态进入下一个状态的选项被称为状态过渡条件。状态集合、状态过渡条件以及记录当前状态的变量放在一起,形成了一个状态机

状态及其过渡条件可以通过图形来表达,其中的节点表示状态,而弧线(节点间的箭头)表示状态过渡。可以将当前状态视为放置在节点之一上的标记或亮点,然后只能沿箭头之一跳转到另一个节点

Unity | 渡鸦避难所-6 | 有限状态机控制角色行为逻辑,unity,游戏引擎,状态模式

状态机对于动画的重要意义在于用户可以通过很少的代码对状态机进行设计和升级。每一个状态有一个与之关联的运动,只要状态机处于此状态,就会播放此运动。从而让动画师或设计师方便地定义动作顺序,而不必去关心底层代码的实现

Unity 的动画状态机提供了一种纵览角色所有动画剪辑的方法,并且允许通过游戏中的各种事件(如用户输入)来触发不同的动画效果

动画状态机可以通过 Animator Controller 窗口来创建,这些状态机如下所示:

Unity | 渡鸦避难所-6 | 有限状态机控制角色行为逻辑,unity,游戏引擎,状态模式

动画状态机包括动画状态、动画过渡和动画事件,而复杂的状态机还可以含有简单的子状态机,更多信息请参阅文档「https://docs.unity3d.com/cn/2021.2/Manual/AnimationOverview.html」

3 Animator Controller

1 创建资源

Animator Controller 资源是在 Unity 内创建的,可以为角色或对象维护一组动画,更多信息请参阅:「https://docs.unity3d.com/cn/2021.2/Manual/Animator.html」

Unity | 渡鸦避难所-6 | 有限状态机控制角色行为逻辑,unity,游戏引擎,状态模式

可通过以下方式创建 Animator Controller:

  • 从 Project 视图中,选择 Create > Animator Controller

  • 在 Project 视图中右键单击并选择 Create > Animator Controller

  • 从 Assets 菜单中,选择 Assets > Create > Animator Controller

2 查看视图

在 Animator 窗口中可创建、查看和修改 Animator Controller 资源,视图内使用鼠标中键或按住 Alt/Option 键拖拽可平移视图,更多信息请参阅文档:「https://docs.unity3d.com/cn/2021.2/Manual/AnimatorWindow.html」

Unity | 渡鸦避难所-6 | 有限状态机控制角色行为逻辑,unity,游戏引擎,状态模式

可通过以下方式查看 Animator Controller 视图:

  • 从 Assets 菜单中,选择 Window > Animation > Animator

  • 双击 Animator Controller 资源

    Unity | 渡鸦避难所-6 | 有限状态机控制角色行为逻辑,unity,游戏引擎,状态模式

3 整理状态

双击角色的 Animator Controller,可以看到对应的状态机,当前状态机会把所有的动作依次执行一遍

Unity | 渡鸦避难所-6 | 有限状态机控制角色行为逻辑,unity,游戏引擎,状态模式

游戏中暂时需要的状态包括: idle、move、attack、define、skill、die,可以整理已经存在的状态,也可以新建状态

  • 整理状态:断开转换,选中状态或者箭头,点击-号

Unity | 渡鸦避难所-6 | 有限状态机控制角色行为逻辑,unity,游戏引擎,状态模式

Unity | 渡鸦避难所-6 | 有限状态机控制角色行为逻辑,unity,游戏引擎,状态模式

  • 新建状态:拖动动画资源到窗口,自动创建状态

    Unity | 渡鸦避难所-6 | 有限状态机控制角色行为逻辑,unity,游戏引擎,状态模式

整理后的状态机:

Unity | 渡鸦避难所-6 | 有限状态机控制角色行为逻辑,unity,游戏引擎,状态模式

3 行为状态机

在 Animator Controller 中可以看到,每个状态机包含多个状态节点,每个状态节点包含一个状态及多个转换:

Unity | 渡鸦避难所-6 | 有限状态机控制角色行为逻辑,unity,游戏引擎,状态模式

选中转换,查看转换信息,每个转换包含多个过渡条件,同时转换需要有来源及目标,即从什么状态转换到什么状态

Unity | 渡鸦避难所-6 | 有限状态机控制角色行为逻辑,unity,游戏引擎,状态模式

了解 Unity 的动画状态机后,根据这些基本要素,构建行为状态机

1 过渡条件

从当前状态进入下一个状态的选项被称为状态过渡条件,因此,条件类中需要一个有返回值的函数的委托,来判定是否进入目标状态

public class Condition
{
    private Func<bool> _func { get; }

    public Condition(Func<bool> func)
    {
        _func = func;
    }

    public bool Evaluate() => _func.Invoke();
}
2 转换

转换中包含目标状态及过渡条件

public class Transition<TEnum> where TEnum : Enum
{
    public TEnum To { get; }
    public Condition Condition { get; }

    public Transition(TEnum to, Condition condition)
    {
        To = to;
        Condition = condition;
    }
}
3 状态

状态中包含进入、更新、退出等事件,为了与角色调用方便,额外增加状态所属者

public class State<TOwner> where TOwner : class
{
    public readonly TOwner Owner;

    public State(TOwner owner)
    {
        Owner = owner;
    }

    public virtual void OnEnter()
    {
    }

    public virtual void OnUpdate()
    {
    }

    public virtual void OnFixedUpdate()
    {
    }

    public virtual void OnExit()
    {
    }
}
4 状态节点

状态及其对应的转换构成一个状态节点

public class StateNode<TEnum, TOwner> where TEnum : Enum where TOwner : class
{
    public TEnum Key { get; }
    public State<TOwner> State { get; }
    public HashSet<Transition<TEnum>> Transitions { get; }

    public StateNode(TEnum key, State<TOwner> state)
    {
        Key = key;
        State = state;
        Transitions = new HashSet<Transition<TEnum>>();
    }

    public void AddTransition(TEnum to, Condition condition)
    {
        Transitions.Add(new Transition<TEnum>(to, condition));
    }
}
5 状态机

状态集合、状态过渡条件以及记录当前状态的变量放在一起,形成了一个状态机文章来源地址https://www.toymoban.com/news/detail-794583.html

到了这里,关于Unity | 渡鸦避难所-6 | 有限状态机控制角色行为逻辑的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Unity进阶开发-FSM有限状态机

    # Unity进阶开发-FSM有限状态机 我们在进行开发时,到了一定程度上,会遇到数十种状态,继续使用Unity的Animator控制器会出现大量的bool,float类型的变量,而这些错综复杂的变量与Animatator控制器如同迷宫版连线相结合会变得极其的复杂且无法良好维护扩展,出现一个BUG会导致

    2024年02月08日
    浏览(44)
  • unity有限状态机和模糊状态机(怪物AI、自动寻路)

    自动寻路步骤: 1、把场景中不同的物体勾选static 2、烘培寻路网格 3、添加NavMeshAgent组件 4、给需要寻路的物体添加脚本 游戏中有限状态机的体现:小怪的巡逻和追逐功能 模糊状态机的体现:当玩家离小怪比较近时,小怪会追逐玩家,当玩家离小怪比较远时小怪会停止追逐玩

    2024年02月04日
    浏览(54)
  • Unity中的AI算法和实现2-有限状态机FSM(上)

    在上一篇文章中, 我们基于 Waypoint 构建了一个最简单的AI怪物, 这个怪物可以在几个点之间巡逻. 本篇文章会在此基础之上, 添加怪物在巡逻过程中发现玩家并追逐玩家, 并且在距离玩家一定距离之后脱离追逐然后继续进行巡逻. 在添加两个状态之前, 我们先介绍什么是 有限状态

    2024年02月01日
    浏览(41)
  • Unity通用有限状态机的从零搭建手册(一):阵前磨枪

    前言 本文的创作目的是总结工作中累积的经验和成果,并通过写教学文章的方式进行巩固和查漏补缺,在不足之处加以改进,工作时由于时间原因没有实现的一些设计也会借这次机会进行补完。我会在写文章的过程中和读者一起从新开始搭建和优化一个状态机系统以及一个应

    2024年02月02日
    浏览(46)
  • 面对根据角色和单子状态如何有效的进行按钮权限的控制

    当阁下看到这个按钮权限控制时,该如何应对 问题1: 举个🌰,对于【待分配】这个工单状态的申请撤回按钮进行解析 问题2:举2个🌰对于【科室待接受】这个节点的申请撤回按钮进行解析 问题3:有些按钮 在多个节点要显示,比如【申请撤回、追加信息、催办】,像这种

    2024年01月19日
    浏览(42)
  • Unity - 角色控制

    角色控制 创建一个3D对象作为角色,添加 “CharacterController” 组件来控制角色移动,绑定脚本\\\"PlayerControl\\\"。 重力组件 阻力 :受到的空气阻力 角阻力 : 旋转时受到的阻力 使用重力 : (不勾选)只是不会再受重力影响但还会受其他力影响,效果类似于在太空 Is Kinematic :(

    2024年01月24日
    浏览(39)
  • Unity【角色/摄像机移动控制】【2.角色跟随鼠标转向】

    本章代码实现基于本系列的【1.角色移动】 在前面的基础上,我们在PlayerController脚本中添加如下函数,随后在update方法中调用即可: 其中mouseSensitivity是前面自定义的一个float变量,用来调节对鼠标转向速度,至此,当我们转动鼠标,角色也会跟着转动

    2024年02月22日
    浏览(57)
  • Unity 使用按键控制角色运动

    创建角色 创建一个脚本PlayerController 创建控制器,使用boolean值        脚本 然后我们运行时还是会感觉有一点过渡衔接不自然,我们可以更改动画器参数里的设置    当然设为0的话是没有过渡的动画,类似于硬直,所以按照自己的意愿来调试。

    2024年02月12日
    浏览(43)
  • Unity【角色/摄像机移动控制】【3.摄像机跟随角色】

    本章代码基于前两章。 1. 我们新建CameraController脚本,将其挂载到Camera上 2. 在角色Player下新建一个空物体,命名为cameraTargetPoint,并将该物体挂载至CameraController脚本中【注意代码中的这行:public Transform cameraTargetPoint;】,将该空物体放在人物头部附近位置 3.将PlayerController脚本

    2024年02月22日
    浏览(52)
  • 【unity】制作一个角色的初始状态(左右跳二段跳)【2D横板动作游戏】

            hi~ 大家好!欢迎大家来到我的全新unity学习记录系列。现在我想在2d横板游戏中,实现一个角色的初始状态-闲置状态、移动状态、空中状态。并且是利用 状态机 进行实现的。         本系列是跟着视频教程走的,所写也是作者个人的学习记录笔记。如有错误请联系

    2024年02月04日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包