有限状态机(FSM)
在游戏开发中,AI是个永恒不变的话题,如果你要的AI只是很简单的一个逻辑
那么有限状态机是一个很好的解决方案,尽管在实际开发中,AI的设计并不是一个简单的逻辑,
如果用有限状态机,维护起来会非常麻烦,但还是有必要记一笔。
为什么说维护起来很麻烦?
画一个图就知道了。
在状态不是很多的时候,要维护的状态就少,实现起来也很简单。

但是,一旦状态一多,要维护的状态就多了,
每增加一个状态,就要维护这个状态到其他各个状态之间的实现
当状态越来越多的时候,你就会觉得心有余而力不足了。

代码1:
using System;
using System.Collections;
using System.Collections.Generic; namespace ShiHuanJue.FSM
{
public abstract class FSMParent
{
#region 公共变量 public string m_currentState = string.Empty; #endregion #region 私有变量 protected Dictionary<string, IState> theFSM = new Dictionary<string, IState>(); #endregion public FSMParent()
{
} public virtual void ChangeStatus(string newState, params Object[] args)
{
if (this.m_currentState == newState)
{
UnityEngine.Debug.Log("oldState = newState");
return;
} if (!this.theFSM.ContainsKey(newState))
{
UnityEngine.Debug.Log("newState is not in stateList");
return;
} if(this.theFSM.ContainsKey(this.m_currentState))
this.theFSM[this.m_currentState].Exit(args);
this.theFSM[newState].Enter(args);
this.m_currentState = newState;//更改当前状态
this.theFSM[newState].Process(args);
}
}
}
代码2:
using System;
namespace ShiHuanJue.FSM
{
public interface IState
{
// 进入该状态
void Enter(params Object[] args); // 离开状态
void Exit(params Object[] args); // 状态处理
void Process(params Object[] args);
}
}
代码3:
namespace ShiHuanJue.FSM
{
// 状态
static public class MotionState
{
static readonly public string IDLE = "idle";
static readonly public string WALKING = "walking";
static readonly public string DEAD = "dead";
static readonly public string ATTACKING = "attacking";
}
}
代码就上面3个,很简单吧。
怎么用呢?
using System;
using System.Collections; namespace ShiHuanJue.FSM
{
static public class RoleStateSet
{
static public RoleIdle stateIdle = new RoleIdle();
static public RoleWalking stateWalking = new RoleWalking();
static public RoleDead stateDead = new RoleDead();
static public RoleAttacking stateAttackint = new RoleAttacking();
} public class FSMRole : FSMParent
{
public FSMRole()
{
theFSM.Add(MotionState.IDLE, RoleStateSet.stateIdle);
theFSM.Add(MotionState.WALKING, RoleStateSet.stateWalking);
theFSM.Add(MotionState.DEAD, RoleStateSet.stateDead);
theFSM.Add(MotionState.ATTACKING, RoleStateSet.stateAttackint);
} public override void ChangeStatus(string newState, params Object[] args)
{
base.ChangeStatus(newState,args);
}
}
}
实现各个状态的逻辑。这里就贴一个Idle的。其它状态格式都一样,只是实现不一样。
using UnityEngine;
using System.Collections; namespace ShiHuanJue.FSM
{
public class RoleIdle : IState
{
public void Enter(params System.Object[] args)
{
Debug.Log("RoleIdle Enter");
} public void Exit(params System.Object[] args)
{
Debug.Log("RoleIdle Exit");
} public void Process(params System.Object[] args)
{
Debug.Log("RoleIdle Process");
}
}
}
测试一下咯:
using UnityEngine;
using System.Collections;
using ShiHuanJue.FSM; public class Test : MonoBehaviour
{
void Start()
{
FSMRole roleAI = new FSMRole();
Debug.Log(roleAI.m_currentState); roleAI.ChangeStatus(MotionState.IDLE);
Debug.Log(roleAI.m_currentState); roleAI.ChangeStatus(MotionState.WALKING);
Debug.Log(roleAI.m_currentState); roleAI.ChangeStatus(MotionState.IDLE);
Debug.Log(roleAI.m_currentState);
}
}
代码都在这了,实际用的也不多,工程就不上传了。用的不多,只是在这记一笔。
实际开发中,还是推荐用行为树。
行为树下次再说,我会先自己写一个行为树之后,分析下缺点,然后介绍一下腾讯开源的行为树框架。
我觉得学习,再理解了它的原理之后,就可以拿现有完善的框架来用,站在巨人的肩膀上,你才可以看的更远,知道自己是多么的渺小。
敬请期待~!
- 本文固定链接: http://www.shihuanjue.com/?p=75
- 转载请注明: 乔 2015年09月04日 于 是幻觉 发表
有限状态机(FSM)的更多相关文章
- 有限状态机FSM(自动售报机Verilog实现)
有限状态机FSM(自动售报机Verilog实现) FSM 状态机就是一种能够描述具有逻辑顺序和时序顺序事件的方法. 状态机有两大类:Mealy型和Moore型. Moore型状态机的输出只与当前状态有 ...
- cocos2d-x 游戏开发之有限状态机(FSM) (四)
cocos2d-x 游戏开发之有限状态机(FSM) (四) 虽然我们了解了FSM,并且可以写自己的FSM,但是有更好的工具帮我们完成这个繁琐的工作.SMC(http://smc.sourceforge ...
- cocos2d-x 游戏开发之有限状态机(FSM) (三)
cocos2d-x 游戏开发之有限状态机(FSM) (三) 有限状态机简称FSM,现在我们创建一个专门的FSM类,负责管理对象(Monkey)的状态.然后Monkey类就实现了行为与状态分离.Monk ...
- cocos2d-x 游戏开发之有限状态机(FSM) (一)
cocos2d-x 游戏开发之有限状态机(FSM) (一) 参考:http://blog.csdn.net/mgphuang/article/details/5845252<Cocos2d-x游 ...
- cocos2d-x 游戏开发之有限状态机(FSM) (二)
cocos2d-x 游戏开发之有限状态机(FSM) (二) 1 状态模式
- 有限状态机FSM
有限状态机(Finite-state machine)又称有限状态自动机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型.常用与:正则表达式引擎,编译器的词法和语法分析,游戏设计,网络 ...
- Atitit. 有限状态机 fsm 状态模式
Atitit. 有限状态机 fsm 状态模式 1. 有限状态机 1 2. "状态表"和"状态轮换表" 1 3. 有限状态机概念(状态(State)事件(Even ...
- [原创][FPGA]有限状态机FSM学习笔记(一)
1. 概述--何为有限状态机FSM? 有限状态机-Finite State Machine,简写为FSM,是表示有限个状态及在这些状态之间的转移和动作等行为的数学模型,在计算机领域有着广泛的应用.通常 ...
- Linux编程之有限状态机FSM的理解与实现
有限状态机(finite state machine)简称FSM,表示有限个状态及在这些状态之间的转移和动作等行为的数学模型,在计算机领域有着广泛的应用.FSM是一种逻辑单元内部的一种高效编程方法,在 ...
- 有限状态机(FSM)的Java 学习FSM
本文从简单的例子入手,逐步演变成非常复杂的程序. 在简明 状态模式(5.8)中,状态之间的变换由外界控制,或者说,多种状态是分割的.无关的.状态模式最有趣的地方正是讨论其状态的变迁. 1.引子 空调( ...
随机推荐
- memcached的key,value,过期时间的限制
1. key值最大长度? memcached的key的最大长度是250个字符,是memcached服务端的限制. 如果您使用的客户端支持"key的前缀"或类似特性,那么key( ...
- 在Application中集成Microsoft Translator服务之翻译语言代码
Microsoft Translator支持多种语言,当我们获取服务时使用这些代码来表示我们是使用哪种语言翻译成什么语言,以下是相关语言对应的代码和中文名 为了方便我已经将数据库上传到云盘上,读者可 ...
- git版本控制管理实践-3
git -m 和git -a -m(-am) . 的区别? usally two steps to commit files to respository: first, git add somefi ...
- JAVA关键字与保留字说明及使用
1.abstract 2.boolean 3.break 4.byte 5.case 6.catch 7.char 8.class 9.continue 10.default 11.do 12.dou ...
- LYDSY模拟赛day1 Walk
/* 依旧考虑新增 2^20 个点. i 只需要向 i 去掉某一位的 1 的点连边. 这样一来图的边数就被压缩到了 20 · 2^20 + 2n + m,然后 BFS 求出 1 到每个点的最短路即可. ...
- 如何给Apache添加虚拟路径和虚拟主机?
在本地开发,一般只用一个Apache服务器,然后通过配置文件实现多个站点访问,要么是“虚拟路径(别名)”的形式,要么是“虚拟主机”的形式,相关配置参考如下: 说明:我给Apache设置的端口为:,即 ...
- 优化MySQL数据库性能的八大方法
本文探讨了提高MySQL 数据库性能的思路,并从8个方面给出了具体的解决方法. 1.选取最适用的字段属性 MySQL可以很好的支持大数据量的存取,但是一般说来,数据库中的表越小,在它上面执行的查询也就 ...
- Qt:正则表达式语法:
正则表达式是验证输入.从输入中提取数据以及对输入进行搜索和替换的强大工具,所谓正则表达式,regexp是一种利用模式匹配语言来描述字符串组成限制条件的方式; Qt 提供了一个Q ...
- linux下nat配置
iptables要启用nat表,必须启动nat表的支持.默认情况下,linux下是没有开启nat表的支持的. #启动内核的路由功能 echo > /proc/sys/net/ipv4/ip_fo ...
- HDU 3879 Base Station(最大权闭合子图)
经典例题,好像说可以转化成maxflow(n,n+m),暂时只可以勉强理解maxflow(n+m,n+m)的做法. 题意:输入n个点,m条边的无向图.点权为负,边权为正,点权为代价,边权为获益,输出最 ...