博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Unity中实现有限状态机FSM
阅读量:1983 次
发布时间:2019-04-27

本文共 2289 字,大约阅读时间需要 7 分钟。

一:什么是有限状态机?

在游戏的战斗系统开发中,角色都会有很多的状态,我们需要对这些状态进行处理以及状态之间的转换,最简单的方式是在一个Switch中进行判断,在每一个case分支中进行相应的状态处理和转换条件的判断,但是这种方式不利于扩展,每当添加新的状态都需要修改Switch-case中的代码,违背了对修改关闭对扩展开放的开闭原则,而使用有限状态机可以更好的扩展,后期加入新状态时,只需编写继承状态基类的状态类并添加实现


二:使用方法

——创建FSM并使用SetHolder去设置FSM的持有者

——声明若干个继承BaseState的状态类并实现OnEnter、OnStay、OnExit方法
——使用AddState将每个状态添加到状态字典中
——在Update中调用OnStay


三:代码实现

using System;using System.Collections.Generic;using UnityEngine;/// /// 状态基类/// public abstract class BaseState{    public abstract void OnEnter(FSMSystem fsm);    public abstract void OnStay(FSMSystem fsm);    public abstract void OnExit(FSMSystem fsm);}/// /// 有限状态机/// public class FSMSystem{    private Dictionary
stateCache = new Dictionary
();//所有状态 public BaseState CurState { get; set; }//当前状态 //FSM持有者 public object holder { get; private set; } public void SetHolder(object holder) { this.holder = holder; } ///
/// 添加状态 /// public void AddState(BaseState state) { if (stateCache.ContainsKey(state.GetType())) { Debug.LogError("已经存在此状态:" + state.GetType()); return; } stateCache.Add(state.GetType(), state); } ///
/// 删除状态 /// public void DeleteState(BaseState state) { if (!stateCache.ContainsKey(state.GetType())) { Debug.LogError("不存在此状态:" + state.GetType()); return; } stateCache.Remove(state.GetType()); } ///
/// 切换状态 /// public void SwitchState
() where T : BaseState { Type type = typeof(T); if (!stateCache.ContainsKey(type)) { Debug.LogError("不存在此状态:" + type); return; } if (CurState != null) { CurState.OnExit(this); } BaseState state = stateCache[type]; state.OnEnter(this); CurState = state; } ///
/// 切换状态 /// public void SwitchState(Type type) { if (!stateCache.ContainsKey(type)) { Debug.LogError("不存在此状态:" + type); return; } if (CurState != null) { CurState.OnExit(this); } BaseState state = stateCache[type]; state.OnEnter(this); CurState = state; }}

转载地址:http://vpyvf.baihongyu.com/

你可能感兴趣的文章
2021年不可错过的17种JS优化技巧(一)
查看>>
月薪15~20k的前端面试问什么?
查看>>
在 Vue 中用 Axios 异步请求API
查看>>
mysql——介绍及安装与基本用法
查看>>
MYSQL——事务操作+视图+存储引擎
查看>>
Mysql——完全备份+增量备份+备份恢复
查看>>
MySQL进阶查询(SELECT 语句高级用法)
查看>>
Mysql 之主从复制
查看>>
LVS负载均衡------NAT模式
查看>>
squid代理介绍----ACL控制应用+sarg日志分析+反向代理
查看>>
redis集群之主从模式+哨兵模式
查看>>
freeswitch添加坐席/usr/local/freeswitch/conf/directory/default
查看>>
JavaScript原生开关灯效果
查看>>
微信企业邮箱,手机邮箱格式地址怎么写?
查看>>
公司如何申请企业邮箱,公司邮箱怎么申请,公司企业邮箱哪个好?
查看>>
电子邮箱账号怎么申请,怎样申请邮箱账号呢
查看>>
邮箱怎么发邮件,邮件发信量多少,职场新人怎么发汇报邮件呢?
查看>>
maven 多层次pom 新引入包,编译成功,还是没有将包引入到本地
查看>>
【深度学习笔记】batchsize, time step(iteration), epoch 区别与联系
查看>>
【解决错误】ModuleNotFoundError No module named matplotlib
查看>>