Unity编程有限状态机的实现

首先,为了避免浪费一些同学的时间,我对本次博客的内容进行说明。(避免一些同学白花时间没有找到自己想看的东西)

本次我的博客内容有

1、结合我本周所学,根据我自己对有限状态机的学习理解来对有限状态机进行说明概括
2、罗列出本次博客需要用到的UnityAPI并进行说明
3、结合这一个来星期的学习内容,完成一个最简单的矿工和妻子的生活小游戏,游戏内容是:在一个平台上有5个地点分别是家、矿场、酒吧、银行、澡堂,旷工根据生活需要在这四个场景中工作,睡觉,喝酒、在家吃饭;妻子在生活中会打扫卫生,织毛衣,去洗澡堂洗澡,做饭。(当然啊,并没有特别复杂的内容,而且为了简单方便的展现有限状态机我将这些场景用个小方块代替,他们所做的事情通过Debug.Log文字和普通的一个动作来表示,因为只是一个小练习)

一、有限状态机

1、什么是有限状态机

有限状态机简称FSM,他将一个游戏角色的行为分为了若干有限个状态,将角色的行为进行分块,角色在任何时候都处在一个状态中,并且会根据情况切换到其他状态。最简单的例子:灯泡如果不算灯泡坏掉,灯泡就只有两个状态,比如点亮的状态和关闭的状态。玩家通过接触灯泡的开关来改变灯泡的状态。

2、有限状态机的优势

编程快速简单、易于调试、很少的计算机开销、直觉性、灵活性

3、有限状态机的实现方式

1>通过switch实现

如果说要将角色的行为模式进行分块当做不同状态处理的话,首先最容易想到的应该就是swtich了。
这种实现方式最简单易懂,但是他存在很多问题,它会导致一个代码块的内容过长不方便阅读和修改,随着状态的增加状态切换的频繁,程序调试过程中会出现跳转十分杂乱增加调试难度。

2>通过for、yeild实现

这种方法我还没有进行研究,就不加以累述了

3>通过接口和类的实现方式

通过一个状态接口将状态封装成类的形式,在角色对象类中声明状态接口,通过接口指向不同的状态来进行不同的行为模式。这种方式在编写比较复杂的状态时扩展性更高,在切换状态时也可以一目了然当前处于哪一个状态类,在调试时调试者可以一眼看出觉得当前处于某一个状态的某一个模块便于调试。
注:通常我们进行编程有限状态机之前,我们会通过表格的方式来列举有限状态和触发条件,以及他们的状态过度前提。

二、本次博客内容用到的API

Animation类

    speed

该变量控制的是物体动画播放的速度,当为-1时倒放
      

    1> Play(“t”,PlayMode.StopAll)

       直接播放该物体的名为动画t的动画,如果存在第二个参数,则停止所有除了动画t以外的其他动画

    2> CrossFade(“t”);

       淡入动画t

    3> IsPlaying(“t”)

       查看动画t的播放状态,如果正在播放则返回true,否则返回false

    4> Stop();或Stop(“t”);

       当没有参数时停止播放该物体的所有动画,当有参数时停止播放物体的t动画

Text类

    1> text成员变量

       表示当前Text组件显示的内容

三、项目的实现

项目的实现功能有:矿工AI自动的再地图中进行挖矿,睡觉,喝酒,卖掉矿石的活动,并通脱Text组建将有关变量信息显示在屏幕上方便观察。

再开始展示项目和代码之前,需要对项目的思路做一个说明:

丈夫的说明:
    我们需要定义4个用来决定矿工的行为状态的变量,他们分别为:矿工身上的矿石数量,矿工身上的金币数量,矿工的疲劳值,矿工的渴度,当然了这里就不设定为矿工会死亡,为了简单我们设定矿工只有在挖矿时才会增加疲劳值和渴度值。
我给出的设定是:
1、如果疲劳值和渴度都不足100矿工会去挖矿
2、如果疲劳值>=100矿工会回家睡觉
3、如果渴度>=100矿工会去银行卖掉自己的矿石,如果自己的金钱足够则会去酒吧喝酒以解决口渴问题
4、矿工口袋最多可装12个矿石
5、矿工在矿洞每一下可以得到2个矿石同时会增加20点疲劳值和10点渴度值
6、矿工在银行每个矿石售价15个金币
7、矿工在酒吧喝一次酒消费100块
8、旷工没有死亡状态
通过以上说明,可以发现我们可以将旷工的状态分为4个状态:回家睡觉,去矿洞挖矿,去银行买矿,去酒吧喝酒。
一般的我们在进行编程之前为了让我们在编程过程中思路清晰,一般的会制作一个状态转换表和状态转换图,以方便在编程时做对照,且在之后进行修改时更加方面理清思路。
废话不多说上图:
状态转换表:

状态转换图:

妻子的说明:
    在妻子的状态中我使用了一个全局状态的概念,就好像上厕所一样,人在任何状态都可能需要上厕所,这个全局状态的执行优先于普通状态,一旦满足全局状态的行为条件,AI会放弃手中正在做的普通事情,转而去做这个不得不做的全局状态行为。
    我们通过一个变量"脏度"来决定妻子的行为状态,妻子的行为设定是:
1、如果不洗澡的话,她会重复织毛衣和打扫卫生的工作,
2、如果妻子发现自己非常脏了,妻子就去放下手中做的一般事情去洗澡
3、如果妻子发现丈夫回来了,妻子就会马上放上自己手上所有的事情(包括洗澡),去给工作一天的丈夫做饭(看来她更喜欢自己的丈夫)。
当然了我的代码也有延时消息函数,如果需要可以让妻子延时洗完澡再去给丈夫做饭。

妻子的状态转换表:
妻子的状态转换图:

那么万事俱备,以下是制作过程和代码:
我原本是想将代码的讲解也直接放到博客中的,但是我发现代码稍微有点多,不太好用博客展示,所以就放链接了,感兴趣的同学可以下载
首先我创建一个这样的场景,由于没有模型,也没有找的合适的动画,所以我暂且用方块来代替。
拿剑的那个是矿工,需要为它绑上Troll脚本,那个拿棍棒的魔法师是wife需要为它绑定的Wife脚本。
其中为了方便观察每个角色的状态和各个属性的值,通过Text组件动态的显示了这些属性和状态名字:
其中妻子的各组件信息如下:
矿工的各组件信息如下:
对代码感兴趣的小伙伴可以直接去下载我的代码,里面基本上需要说明的地方我都进行了备注,下载地址:链接:https://pan.baidu.com/s/1A486eDGPCzqy_pLkIOiQng
提取码:ae4f
我用的是Unity2020版本,向运行一下的同学可以直接将代码拷贝,然后按照我给的截图设置组件就可以了。

四、总结

要知道什么是FSM是一个很简单的事情,不能够因为他的这种简单而低估它的潜力,FSM可以实现的功能只受限于使用者的想象力。
在进行学习和使用的过程中一开始最容易出现的问题就是一个智能体受限于一个FSM,我们可以用多个FSM来对智能体的行为进行处理:
比如书上说的,用两个或多个FSM,拿两个举例,当AI的战斗系统比较复杂时,用一个FSM用来控制角色的行动,一个FSM用于控制角色的武器。
再比如书上说的,一个状态机中包含一个状态机,这样我们可以将状态进行分层处理,做到更加精细的装填处理,比如智能体有搜索、战斗、巡逻状态;与此同时在这些状态分别包含一个FSM来处理他们的行为。
再再再比如我自己想的,将以上两种进行结合,我们可以在第二层使用多个状态机讲他们的行为进行再细分处理。

Unity编程有限状态机的实现相关推荐

  1. 【Unity编程】四元数(Quaternion)与欧拉角

    欧拉旋转.四元数.矩阵旋转之间的差异 除了欧拉旋转以外,还有两种表示旋转的方式:矩阵旋转和四元数旋转.接下来我们比较它们的优缺点. 欧拉角 优点:三个角度组成,直观,容易理解. 优点:可以进行从一个方 ...

  2. 12.unity编程基础

    目录 编程入门 一:语法基础 1-1.VS的使用 1-2.程序编写规范 1-3.数据类型(共15种) 1-4.常量和变量 1-5.表达式和运算符 二:控制语句 2-1.顺序结构 2-2.选择语句 2- ...

  3. 【Unity编程】Unity中关于四元数的API详解

    Unity中关于四元数的API详解 Quaternion类 Quaternion(四元数)用于计算Unity旋转.它们计算紧凑高效,不受万向节锁的困扰,并且可以很方便快速地进行球面插值. Unity内 ...

  4. C# Unity编程终极指南

    使用现代Unity开发技术创建一个有趣的2D平台,掌握Unity引擎和C#编程 你会学到: 学习C#的基础知识.从变量."如果"语句到创建面向对象的结构.没有编程经验是必要的. 创 ...

  5. Unity FSM(有限状态机)

    先看下效果: FSM ,有限状态机,一个可以枚举出有限个状态,并且这些状态在特定条件下是能够来回切换的. 在游戏中经常看到的一些AI,如敌人巡逻,巡逻过程中看到玩家就追击,追上了就攻击,追不上并且有了 ...

  6. 【Unity编程】Unity中的欧拉旋转

    版权声明:本文为博主原创文章,欢迎转载.请保留博主链接:http://blog.csdn.net/andrewfan 欧拉角的定义 在写这篇博客之前,我搜索了网上很多关于欧拉角的定义,发现大部分引用自 ...

  7. Unity编程实战--牧师与魔鬼

    游戏目标:将3个牧师和3个魔鬼从河的一端安全地送到河的另一端. 游戏规则:在运送过程中,船可以搭载两个人,而且必须有一人掌船. 游戏结果:无论何时,只要河一边的魔鬼数量多于牧师的数量,游戏就会以失败结 ...

  8. Unity编程笔记----音效管理器

    游戏世界里离不开各种酷炫的音效,把这些音效集中起来进行管理是每个项目必须要做的事情. 分享一下自用的SoundMgr(适用于大多Unity项目) 整体思路: SoundMgr脚本被调用时,自动执行继承 ...

  9. Unity编程 欧拉角与万向节死锁(图文版)

    万向节死锁(Gimbal Lock)问题 上文中曾经说过,欧拉旋转的顺规和轴向定义,自然造就了"万向节死锁"问题.本文主要来探索它自然形成的原因. 陀螺仪 首先,我们来了解Gimb ...

最新文章

  1. javascript中的闭包这一篇就够了
  2. Lucene-Analyzer
  3. linux 内核 ntfs,Linux大脑 内核 内核编译(NTFS)
  4. js学习小计1-onbeforeunload
  5. c店店铺名怎么用旗舰店_大发现!三利和洁丽雅2大国民毛巾品牌也有1688店铺!...
  6. php做页面编辑器,最牛在线编辑器ueditor在thinkphp框架中的使用方法
  7. 状态机finite-state machine学习笔记2——按键消抖初步(1)
  8. Hibernate下载地址
  9. 蓝桥杯led流水灯实现(38译码器和锁存器的使用)
  10. java画哆啦A梦_java绘制哆啦A梦 超可爱
  11. 破土Plan遇到的keng
  12. Linux之设备操作
  13. ACM-ICPC 2018 焦作赛区网络预赛A. Magic Mirror(签到题)
  14. 算法设计——质数的乘积
  15. Key Fact as Pivot: A Two-Stage Model for Low Resource Table-to-Text Generation 论文翻译
  16. IPFS为数据隐私保驾护航
  17. iOS开发系列–打造自己的“美图秀秀”(上)
  18. sklearn波士顿房价数据集——线性回归
  19. 大学计算机课程制作生日卡片,小学信息技术制作生日贺卡教案
  20. ubuntu软件安装方法大全

热门文章

  1. 安装nodemon包
  2. 西门子PLC-1200 SCL语言开发学习笔记 (一)
  3. 用Qt设计一款单词本软件,采用SQLite数据库
  4. java publisher_Java中的反应流详解
  5. 多个485串联_RS-485接口器件通讯无故障偏置电路的原理和设计
  6. python对excel两列相乘_Python w/Excel表格。对于第一列中的每个值,计算两列。
  7. Android模拟器获取IP的方法
  8. ctf 选择题 题库_计算机考试试题(精选)ctf
  9. CSS 阴影效果(盒子阴影,文字阴影)
  10. 无人机管控平台,推动电力巡检管理水平提升