1、什么是有限状态机

有限状态机(Finite State Machine),简称FSM,它由一组有限个状态、输入和根据输入及现有状态转换为下一个状态的转换函数组成,当然,通常每个状态机都必须有一个初始状态。它有两个重要的概念:状态和转移。有限状态机在很多领域都有运用,这里介绍的是在unity游戏开发中的运用。在游戏开发中,通常使用FSM去实现一些简单的AI逻辑,对于游戏中的每个对象,都可以在其生命周期中分出一些状态,比如一个小兵,它可能在休息,或者是在巡逻,当有敌人出现时,它的状态会变成追逐或者攻击敌人。当某些条件成立时,状态机从当前状态转移到下一个状态,在不同的状态下,游戏对象执行不同的任务。有限状态机中必须注意的是:必须要有一个初始状态,并保存当前状态,以及注意每个状态转移的必要条件。下面动手写一个简易的unity有限状态机。
 

2、定义有限状态机基类

public class FSMStateBase {
//进入该状态时调用
public virtual void Enter() { } //每帧调用
public virtual void Update() { } //退出该状态时调用
public virtual void Exit() { }
}

3、定义一组具体状态

public class IdleState : FSMStateBase {
public override void Enter()
{ }
public override void Update()
{ }
public override void Exit()
{ }
} public class WalkState : FSMStateBase
{
public override void Enter()
{ }
public override void Update()
{ }
public override void Exit()
{ }
} public class AttackState : FSMStateBase
{
public override void Enter()
{ }
public override void Update()
{ }
public override void Exit()
{ }
}

4、有限状态机使用示例

public class FSMManager : MonoBehaviour {

   public enum State {
Walk,
Idle,
Attack
} private State curState;//当前状态
private Dictionary<State, FSMStateBase> fsmDict = new Dictionary<State, FSMStateBase>(); private void Start()
{
curState = State.Idle;
InitState();
} //添加一组状态
public void InitState()
{
fsmDict.Add(State.Walk, new WalkState());
fsmDict.Add(State.Idle, new IdleState());
fsmDict.Add(State.Attack, new AttackState());
} //转移状态
public void ChangeState(State state)
{
fsmDict[curState].Exit();
curState = state;
fsmDict[curState].Enter();
} private void Update()
{
//模拟转换条件
if (Input.GetKeyDown(KeyCode.A))
{
ChangeState(State.Walk);
}
else if (Input.GetKeyDown(KeyCode.B))
{
ChangeState(State.Attack);
} fsmDict[curState].Update();
} }

5、最后

上面完成了一个简单的FSM有限状态机使用示例,可以看到,状态转移条件判断会有很多if else语句,状态一多,就很容易出bug。可以看出,有限状态机在某条件下,它的转移状态是一i定的,有限状态机有一个变种,叫模糊状态机,在确定的条件下,它的转移状态不是百分百确定的,它有一定的概率会转移到另一个状态。还有其他状态机比如分层状态机,水平有限,这里就不做介绍了。一般有限状态机在unity中只用来做简易的AI,如果要实现复杂的状态逻辑,有限状态机明显会显得力不从心,因此稍微复杂一些的情况我们会使用行为树,一些高级的AI效果则会用到神经网络算法。如有错误,欢迎指正!

FSM有限状态机的更多相关文章

  1. Unity中FSM有限状态机

    什么是FSM FSM 即有限状态机,它是一个状态管理系统,表示一个对象的几种状态在指定条件下转移行为,即随着条件的不断改变内部状态不断地切换. FSM用处或者使用背景 通常使用FSM去实现一些简单的A ...

  2. Unity——FSM有限状态机

    FSM有限状态机 一.设计思路 1.共同的状态父类,提供可重写的进入,保持,退出该状态的生命周期方法: 2.状态机,管理所有状态(增删查改),状态机运行方法(Run): 3.在角色控制器中,实例化状态 ...

  3. Unity FSM 有限状态机

    翻译了一下unity wiki上对于有限状态机的案例,等有空时在详细写一下.在场景中添加两个游戏物体,一个为玩家并修改其Tag为Player,另一个为NPC为其添加NPCControl脚本,并为其将玩 ...

  4. FSM有限状态机 ---C#、Unity

    抽象类State public interface State//定义状态接口 { void Init();//初始化 int GetCurrentStateId();//返回当前状态Id void ...

  5. Lua中使用状态机FSM简单例子

    FSM 有限状态机: 一个有限状态机是一个设备,或者是一个设备模型,具有有限数量的状态,它可以在任何给定的时间根据输入进行操作,使得一个状态变换到另一个状态,或者是使一个输入或者一种行为的发生.一个有 ...

  6. 新FSM的一些思路

    好久之前写过一篇关于状态机的小例子,可以看这里http://www.cnblogs.com/mawanli/p/5966080.html,这篇博客首先感谢需要感谢当时看到凉鞋的笔记博客, 凉鞋的博客地 ...

  7. U3D-FSM有限状态机的简单设计

    http://coder.beitown.com/archives/592 在之前的文章里介绍了一个基础U3D状态机框架(Unity3D游戏开发之状态流框架)即大Switch的枚举状态控制.这种方法虽 ...

  8. Ejabberd源码解析前奏--配置

    一.基本配置     配置文件将在你第一次启动ejabberd时加载,从该文件中获得的内容将被解析并存储到内部的ejabberd数据库中,以后的配置将从数据库加载,并且任何配置文件里的命令都会被添加到 ...

  9. keepalive学习

    keepalive学习之软件设计 软件架构如下图所示: Keepalived 完全使用标准的ANSI/ISO C写出. 该软件主要围绕一个中央I/O复用分发器而设计,这个I/O复用分发器提供网络实时功 ...

随机推荐

  1. Python学习(一)——数据类型

    在大学学过一点python,只学了语法,关于实际应用却没怎么用过.现在用一些python的脚本来模拟webservices,挺好用的.这个语言,还是要好好学习学习了. 目前看着教材来的,这本教材,好像 ...

  2. xlsxwriter

    xlsxwriter是python中用来处理execl表格的库 参考

  3. (一)Mahapps安装与使用

    一.Mahapps安装 1.NuGet程序包安装 右击项目-->选择 “管理Nuget程序包”-->搜索“MahApps.Metro” 2.包管理控制台 选择“工具”-->“NuGe ...

  4. PageAdmin CMS网站制作教程实例:如何制作一个报名表?

    PageAdmin CMS网站建设实例:如何制作一个报名表? 有时我们根据需求需要制作一些自定义表,该如何去制作呢? 我们以制作一个报名表为例: 登录后台地址,进入后台, 2.在顶部导航中找到系统,并 ...

  5. springboot-登录拦截器

    小伙伴们大家好,今天给大家分享一个简单的springboot版登录拦截器 首先我们需要在springboot的启动类中让它实现WebMvcConfigurer 这个接口 比如: public clas ...

  6. 926. Flip String to Monotone Increasing

    A string of '0's and '1's is monotone increasing if it consists of some number of '0's (possibly 0), ...

  7. jzoj100044

    完全背包問題 我們可以將數組內每個元素看成一個物品,這樣問題就轉化成: 現有n個物品,每個物品可以取a[i]~b[i]個,價值為d[i],費用為c[i],問怎麼樣取讓費用為0且價值最大 我們可以先每種 ...

  8. python打造渗透工具集

    python是门简单易学的语言,强大的第三方库让我们在编程中事半功倍,今天我们就来谈谈python在渗透测试中的应用,让我们自己动手打造自己的渗透工具集. 难易程度:★★★阅读点:python;web ...

  9. Flask从入门到精通之Flash消息

    请求完成后,有时需要让用户知道状态发生了变化.这里可以使用确认消息.警告或者错误提醒.一个典型例子是,用户提交了有一项错误的登录表单后,服务器发回的响应重新渲染了登录表单,并在表单上面显示一个消息,提 ...

  10. vsftp小记

    安装一个vsftp都有问题(Version: 3.0.2-14ubuntu1),提示530 错误,之后修改配置如下(红色): # cat /etc/pam.d/vsftpdauth required ...