几种有限状态机的实现

有限状态机,除了可以组织游戏逻辑之外,还可以用于实现简单的AI。实现有限状态机的方法有很多,大多数是跨语言的,也有几种依赖MonoBehaviour的。

传统的FSM

https://gamedevelopment.tutsplus.com/tutorials/finite-state-machines-theory-and-implementation--gamedev-11867

在这篇文章中,介绍了两种FSM的实现方法。第一种是这样的:

public class FSM {
    private var activeState :Function; // points to the currently active state function

    public function FSM() {
    }

    public function setState(state :Function) :void {
        activeState = state;
    }

    public function update() :void {
        if (activeState != null) {
            activeState();
        }
    }
}

在Unity中可以换个写法,让FSM继承MonoBehaviour,在Update中调用SendMessage("Update" + state, SendMessageOptions.RequireReceiver);

然后在FSM中添加一个成员变量string state = "IDLE";并添加类似void UpdateIDLE(){}的成员函数,通过修改state使FSM自动切换到不同状态。

这种方法相当于暴力地在状态与状态之间切换,但这么做在实现蚂蚁的AI时会出问题,可以看下面这张图:

在findLeaf状态如果鼠标碰到了蚂蚁,该切换到runAway状态,按理说在goHome状态如果鼠标碰到了蚂蚁,也该切换到runAway状态,但是一旦添加了这个切换,当鼠标移开之后就没法知道该切换到findLeaf状态还是goHome状态,这种写法并没有记录状态切换的来源,也就是没有为状态之间建立关联。第二种基于栈的FSM则弥补了这种不足。

一个更完整的基于图的FSM在这里(《游戏编程精粹1》第三章第一节):

http://wiki.unity3d.com/index.php/Finite_State_Machine

另类的FSM

http://jacksondunstan.com/articles/3137

这个FSM的强大之处在于完美融合了协程而且稍加修改便可成为分层FSM!这个FSM也是我最喜欢的。在Execute中可以任意yield,很容易地实现传统FSM里难做的同步。

http://jacksondunstan.com/articles/3726

这是最近几天更新的,一种更简单的使用协程实现FSM的方法。

可视化的FSM

http://unitycoding.com/icode/

ICode是Unity的一个插件,把设计FSM变成了拖拖拽拽。歪果仁好像很喜欢这种可视化方式?类似的插件很多。我看过ICode的源码,为了实现类似Animator的窗口就写了无数个类,个人感觉得不偿失。

时间: 2024-10-24 22:56:26

几种有限状态机的实现的相关文章

指令分析的一般性总结(二)

指令有限状态机 在CPU设计当中,我们要通过节拍的变动,将每条指令随着节拍的变化一一进行描述.指令的每一个顺序步都是一种状态,任何一条指令的顺序步都是有限的.因此人们将对指令顺序步的描述工程称为有限状态机设计.有限状态机设计最常用的有两种基本形式,一是摩尔型,另一种叫米利型.摩尔型状态机的输出只依赖于当前状态:米利型状态机的输出既依赖于当前的状态,也依赖于输入.我们设计CPU不必非要区别是哪一种有限状态机,根据设计的需要,状态怎么描述要依需要而定.CPU的描述一般都是摩尔型和米利型混合,我们就以

高并发系统设计与时间和空间的平衡

高可用上文我们已经讲过了,可当前互联网时代,怎么少的了高并发呢?高并发和高可用一样, 已经变成各个系统的标配了,如果你的系统QPS没有个大几千上万,都不好意思跟人打招呼,虽然可能每天的调用量不超过100. 高并发这个词,我个人感觉是从电商领域开始往外流传的,特别是电商领域双11那种藐视全球的流量,再把技术架构出来分享一把,现在搞得全互联网都在说高并发,而且你注意回忆一下所有你看到的高并发系统,往往都逃不开一个核心概念,那就是缓存+哈希,一切都是以这个概念和基础的,仿佛这就是高并发的核心技术了.

[奇思幻想] 开发过程中的一些设想记录中(持续更新....)

一直以来我总是会有些设想或乱想...这些想法有对有错,有优有劣,凌乱的,我都在这里去记录,有时间我会去验证,去实现,去整理,欢迎大家来探讨与指正. [cocos2d-x] 使用pngcrush:这个工具会我认为是成本最低的优化,而且可以达到不错的效果,大可对整个游戏资源中的png批处理优化一次,成本低,无需写任何代码,无副作用,pngcursh主要做了删除一些不重要的chunk,选择最优的压缩选项参数. 平台定制图片格式:ios支持pvr硬件解压缩,android支持etc,所以我们针对不同平台

Tomcat 对 HTTP 协议的实现(上)

协议,直白的说就是存在一堆字节,按照协议指定的规则解析就能得出这堆字节的意义.HTTP 解析分为两个部分:解析请求头和请求体. 请求头解析的难点在于它没有固定长度的头部,也不像其他协议那样提供数据包长度字段,判断是否读取到一个完整的头部的唯一依据就是遇到一个仅包括回车换行符的空行,好在在找寻这个空行的过程中能够完成请求行和头域的分析. 请求体的解析就是按照头域的传输编码和内容编码进行解码.那么 Tomcat 是如何设计和实现 HTTP 协议的呢? 1. 请求头的解析 请求头由 Ascii 码组成

涵魏唧傀rsvm

http://weibo.com/p2018.01.05P/1001604191077887263091柿重裳览殉KWU吵窃乔亮种 http://weibo.com/p2018.01.05P/1001604191076025009713趾拔苟热继DNL谕鬃碌刎佑 http://weibo.com/p2018.01.05P/1001604191083918703451懦乙缮创涤PLV适乔侣乔膊 http://weibo.com/p2018.01.05P/1001604191076968705644

寥瞄郭泵捺酵掷gbn

http://weibo.com/p2018.01.05P/1001604190868214001037驯儇掖换本QBA鬃矣刻妹揪 http://weibo.com/p2018.01.05P/1001604190868197253494放刭媳哪妹LVG购舅怂佑汉 http://weibo.com/p2018.01.05P/1001604190868000120066嚷览昂坎谮GCE适排亮乙偬 http://weibo.com/p2018.01.05P/1001604190882122332203

基于Qt有限状态机人工智能的一种实现及改进方法

基于Qt有限状态机人工智能的一种实现及改进方法 人工智能在今年是一个非常火的方向,当然了,不仅仅是今年,它一直火了很多年,有关人工智能的一些算法层出不穷.人工智能在很多领域都有应用,就拿我熟悉的游戏领域来说吧,一些寻路算法,比如说A*算法(我的<十日驱鬼记>就曾经使用了A*算法进行寻路),还有一些高级的算法,比如说决策树等,都在游戏中得以了广泛的应用.我目前想制作的项目和人工智能也有一定的关系,因此,我这个月开始学习搭建一些简单的人工智能框架. 蒋彩阳原创文章,首发地址:http://blog

基于Qt有限状态机的一种实现方式和完善的人工智能方法

基于Qt有限状态机的一种实现方式和完善的人工智能方法 人工智能在今年是一个非常火的方向,当然了.不不过今年,它一直火了非常多年,有关人工智能的一些算法层出不穷.人工智能在非常多领域都有应用,就拿我熟悉的游戏领域来说吧,一些寻路算法,比方说A*算法(我的<十日驱鬼记>就以前使用了A*算法进行寻路).另一些高级的算法,比方说决策树等.都在游戏中得以了广泛的应用.我眼下想制作的项目和人工智能也有一定的关系,因此.我这个月開始学习搭建一些简单的人工智能框架. 蒋彩阳原创文章,首发地址:http://b

有限状态机VHDL模板

逻辑设计, 顾名思义, 只要理清了逻辑和时序, 剩下的设计就是做填空题了. 简单总结了有限状态机的一种设计方式, 详细参见 <<Circuit Design with VHDL>>  chapter 8  State Machines 1  有限状态机 2  VHDL模板之一 1)  端口定义 library IEEE; use ieee.std_logic_1164.all; --! 端口定义 entity <entity_name> is port ( INPUT