本文共 2289 字,大约阅读时间需要 7 分钟。
在游戏的战斗系统开发中,角色都会有很多的状态,我们需要对这些状态进行处理以及状态之间的转换,最简单的方式是在一个Switch中进行判断,在每一个case分支中进行相应的状态处理和转换条件的判断,但是这种方式不利于扩展,每当添加新的状态都需要修改Switch-case中的代码,违背了对修改关闭对扩展开放的开闭原则,而使用有限状态机可以更好的扩展,后期加入新状态时,只需编写继承状态基类的状态类并添加实现
——创建FSM并使用SetHolder去设置FSM的持有者
——声明若干个继承BaseState的状态类并实现OnEnter、OnStay、OnExit方法 ——使用AddState将每个状态添加到状态字典中 ——在Update中调用OnStayusing 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 DictionarystateCache = 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/