FSM(Finite State Machine有限状态机)可以理解成是对行为逻辑的抽象,就好象人在生活中会做出各种行为,例如吃饭、睡觉等,这些所有我们都看作是“行为”的分支,由大脑决定每种行为具体是什么实施。在整个FSM架构中,其实与上面解释一致,首先有一个状态基类stateObject,里面有三个方法,分别是状态前、状态中、状态后。所有具体行为都要继承这个基类,在这三个方法中具体实现各种方法的逻辑。然后,需要一个stateManager(大脑)状态管理类来管理这些状态,特别注意的是里面changeState方法,他是状态跳转的关键。至于如果存储各种状态,你可以用list类 ,字典类等等。有限状态机就是把一个对象的行为分解成为易于处理的“块”或“状态”。

例如将人的行为抽象成3个,分别是吃饭、睡觉、上班。上班族,只有吃饭、睡觉、上班三种行为,我们把这三种行为放进我们的大脑,即stateManager。那我们从什么行为开始呢?(其实这里就是initState),随便挑一个,默认为睡觉。之前说过,每个行为都有三个状态(前、中、后),当我们进入睡觉行为时,首先进入的是睡觉前状态(该状态只执行一次),然后进入睡觉中,真正的逻辑是在这里执行的,它会不停检查什么时候睡醒了,符合条件后跳到其他状态,当要进行跳转时,还会执行一次睡觉后状态,其实前、后状态我理解成当要执行或结束某种行为时,你要额外做的事情。例如,睡觉前我要带个眼罩。(放到游戏开发里可以进行一些赋值操作,或者调用其他类的方法,例如一些特效)。因为它编程快速简单,易于调试,性能高,与人类思维相似从而具有:1.便于梳理状态关系,2.使用灵活,3.容易修改

  FSM的优点就是因为它编程快速,简单,易于调试,性能高,与人类思维相似。

以下是一个自己写的实例代码,可供大家参考

首先创建一个抽象状态基类,里面有3个抽象方法,分别是进入状态,离开状态,更新状态的方法

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public abstract class StateObject
{//状态控制机protected StateManger sm;//构造函数public StateObject(StateManger _sm){sm = _sm;}//进入状态方法public abstract void EnterState();//离开状态方法public abstract void ExitState();//更新状态方法public abstract void UpdateState();}

然后根据具体的情况创建具体的状态类(继承自状态基类),我这里实现了3个具体的状态类,分别是人物默认状态,移动状态,死亡状态

默认状态方法

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class IdleState : StateObject
{public IdleState(StateManger _sm):base(_sm){}
//进入状态方法public override void EnterState(){Debug.Log("进入待定状态");}
//离开状态方法public override void ExitState(){Debug.Log("离开待定状态");}
//更新状态方法public override void UpdateState(){Debug.Log("更新待定状态");if (Input.GetKeyDown(KeyCode.M)){sm.ChangeState("Move");}else if (Input.GetKeyDown(KeyCode.D)){sm.ChangeState("Die");}}}

移动状态方法

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class MoveState : StateObject
{public MoveState(StateManger _sm) :base(_sm){}public override void EnterState(){Debug.Log("进入移动状态");}public override void ExitState(){Debug.Log("离开移动状态");}public override void UpdateState(){Debug.Log("更新移动状态");if (Input.GetKeyDown(KeyCode.D)){sm.ChangeState("Die");}else if(Input.GetKeyDown(KeyCode.I)){sm.ChangeState("Idle");}}
}

死亡状态方法

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class DieState : StateObject
{public DieState(StateManger _sm):base(_sm){}public override void EnterState(){Debug.Log("进入死亡状态");}public override void ExitState(){Debug.Log("离开死亡状态");}public override void UpdateState(){Debug.Log("更新死亡状态");if (Input.GetKeyDown(KeyCode.I)){sm.ChangeState("Idle");}}
}

然后,需要一个stateManager(大脑)状态管理类来管理这些状态,特别注意的是里面changeState方法,他是状态跳转的关键,需要放在Update函数中,因为需要不断检测当前的状态,检测是否跳转

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class StateManger {//利用字典存储各种状态Dictionary<string, StateObject> Dic = new Dictionary<string, StateObject>();//当前状态StateObject currentstate;//注册状态public void Region(string statename,StateObject state){if (!Dic.ContainsKey(statename)){Dic.Add(statename,state);}}//设置默认状态public void SetDefat(string statename){if (Dic.ContainsKey(statename)){currentstate = Dic[statename];currentstate.EnterState();}}//改变状态public void ChangeState(string statename){if (Dic.ContainsKey(statename)){if (currentstate!=null){currentstate.ExitState();currentstate = Dic[statename];currentstate.EnterState();}}}//更新状态public void UpdateState(){if (currentstate!=null){currentstate.UpdateState();}}}

这样一个简单的有限状态机就写好了,然后我们可以在Unity里面利用一个实例来测试一下,我写了一个控制物体状态的脚本

using System.Collections;
using System.Collections.Generic;
using UnityEngine;public class TestFsm : MonoBehaviour {//添加一个状态机StateManger stm = new StateManger();void Start(){//注册状态stm.Region("Idle", new IdleState(stm));stm.Region("Die", new DieState(stm));stm.Region("Move", new MoveState(stm));
//设置默认状态stm.SetDefat("Idle");}// Update is called once per framevoid Update(){
//更新状态的方法stm.UpdateState();}
}

  以上就是本人学习FSM的一点总结,如果有什么不对的地方,敬请大家指出,大家一起学习进步。

【转】有限状态机(FSM)学习总结C#相关推荐

  1. [转载][FPGA]有限状态机FSM学习笔记(二)

    1. Mealy和Moore状态机的互换 对于给定的时序逻辑功能,可以用Mealy机实现,也可以用Moore机实现.根据Moore机比Mealy机输出落后一个周期的特性,可以实现两种状态机之间的转换. ...

  2. SAP FSM 学习笔记(四) : 现场服务技师使用的移动应用

    这个系列的前三篇文章: SAP FSM 学习笔记(一) : 使用API消费FSM的数据 SAP FSM 学习笔记(二) : SAP FSM的微信接入 SAP FSM 学习笔记(三) : 在微信里创建S ...

  3. SAP FSM 学习笔记(三) 在微信里发起SAP FSM客户预约

    这个系列的第一篇文章,SAP FSM 学习笔记(一) : 使用API消费FSM的数据,我们学习了如何使用SAP FSM提供的nodejs SDK,第二篇文章 SAP FSM 学习笔记(二) : SAP ...

  4. SAP FSM 学习笔记(二) : SAP FSM的微信接入

    Jerry的前一篇文章 SAP FSM 学习笔记(一) : 使用API消费FSM的数据 介绍了SAP Field Service Management Restful API的消费方式,本文继续介绍如 ...

  5. Cocos Creator 超简洁代码实现有限状态机 FSM,打造丝滑角色动作

    引言:本文作者黄聪是一名在校大学生,设计毕设的过程中,他参考<游戏编程模式>一书,摸索出了一套角色动作控制方案. 作为一名在校学生,前段时间在做毕业设计的过程中,我也遇到了很多同学都会遇到 ...

  6. 【算法】有限状态机FSM

    目录 一.快速理解 1.有限状态机(FSM) 2.有限状态机的设计 二.详细说明 1.有限状态机FSM 1)FSM概念 2)FSM的3特点 3)FSM的4要素 4)FSM状态转换图 2.FSM的设计和 ...

  7. 有限状态机FSM(finite state machine) 二

    有限状态机FSM(finite state machine) 二 延续上一篇继续有限状态机 上一篇中的状态切换判断是在每一个状态类的 OnExecute 方法中各种 if else 硬编码逻辑 当状态 ...

  8. 什么是有限状态机FSM

    什么是有限状态机FSM 简介 有限状态机(以下用FSM指代)是一种算法思想,简单而言,有限状态机由一组状态.一个初始状态.输入和根据输入及现有状态转换为下一个状态的转换函数组成.在Gof的23种设计模 ...

  9. Unity进阶第三章-有限状态机FSM(三种方法实现角色动画操作)

    一.有限状态机FSM概述 二.不用有限状态机实现角色的走路.攻击动作 (1)新建角色.地面.为角色添加动画 (2)为角色添加脚本 using System.Collections; using Sys ...

  10. 有限状态机FSM(finite state machine) 一

    有限状态机FSM(finite state machine) 一 有限状态机又称有限自动状态机,它拥有有限数量的状态,每个状态代表不同的意义,每个状态可以切换到 零-多 个状态.任意时刻状态机有且只能 ...

最新文章

  1. 平衡二叉树-splay c/c++代码实现
  2. 关于XDC约束文件,你需要知道的几点
  3. Source引擎的远程代码执行漏洞,可能影响千万游戏玩家
  4. linux 文件 目录 默认权限
  5. C#中时间格式的转换
  6. android连接airprint打印机,AirPrint:iOS的打印机
  7. mac下Android开发环境搭建
  8. 传智播客-刘意-java深入浅出精华版学习笔记Day06
  9. “丧文化”的祖师:波德莱尔:不懂得使自己的孤独为众人接受的人,也不懂得在碌碌众生中自立。...
  10. 手机最好的html5浏览器,哪款浏览器最好用:六款主流手机浏览器横评
  11. CS61A 2021Spring Lab: Cats
  12. VS2015 无法打开包括文件string.h等
  13. QT控件之QComboBox(下拉框相关)
  14. ITween操作API
  15. Word2vec安装使用
  16. windows微信双开
  17. python语言的实验心得体会范文_关于实验的心得体会范文5篇
  18. IP-Guard十六个模块功能详解
  19. 京东抢购工具 监控工具 秒杀工具
  20. 计算机应用技术英语音标,英语国际音标

热门文章

  1. 【C++深度剖析教程5】C++中类的静态成员函数
  2. 【算法】禁忌搜索算法(Tabu Search,TS)超详细通俗解析附C++代码实例
  3. Bootstrap table后端分页(ssm版)
  4. Python入门基础之迭代和列表生成式
  5. HOSTNAME问题 和yum配置163源的操作 安装lsb_release,KSH,CSH
  6. PM2.5环境检测系统的设计与分析
  7. 新手算法学习之路----二分法Last-position-of-Target
  8. TreeSet类的排序
  9. 2-jQuery - AJAX load() 方法【进阶篇】
  10. [dp]Leetcode 5. Longest Palindromic Substring