Unity中的有限状态机FSM
Posted Hello Bug.
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity中的有限状态机FSM相关的知识,希望对你有一定的参考价值。
一:什么是有限状态机?
在游戏的战斗系统开发中,角色都会有很多的状态,我们需要对这些状态进行处理以及状态之间的转换,最简单的方式是在一个Switch中进行判断,在每一个case分支中进行相应的状态处理和转换条件的判断,但是这种方式不利于扩展,每当添加新的状态都需要修改Switch-case中的代码,违背了对修改关闭对扩展开放的开闭原则,而使用有限状态机可以更好的扩展,后期加入新状态时,只需编写继承状态基类的状态类并添加实现
二:使用方法
——声明若干个继承BaseState的状态类并实现OnEnter、OnStay、OnExit方法
——使用AddState将每个状态添加到状态字典中
——在Update中调用OnStay
三:代码实现
using System;
using System.Collections.Generic;
using UnityEngine;
/// <summary>
/// 状态基类
/// </summary>
public abstract class BaseState
{
public abstract void OnEnter(FSMSystem fsm);
public abstract void OnStay(FSMSystem fsm, GameObject obj);
public abstract void OnExit(FSMSystem fsm);
}
/// <summary>
/// 有限状态机
/// </summary>
public class FSMSystem
{
private Dictionary<Type, BaseState> stateCache = new Dictionary<Type, BaseState>();//所有状态
//当前状态
private BaseState curState;
public BaseState CurState { get { return curState; } }
/// <summary>
/// 添加状态
/// </summary>
public void AddState(BaseState state)
{
if (stateCache.ContainsKey(state.GetType()))
{
Debug.LogError("已经存在此状态:" + state.GetType());
return;
}
if (curState == null)
{
curState = state;
}
stateCache.Add(state.GetType(), state);
}
/// <summary>
/// 删除状态
/// </summary>
public void DeleteState(BaseState state)
{
if (!stateCache.ContainsKey(state.GetType()))
{
Debug.LogError("不存在此状态:" + state.GetType());
return;
}
stateCache.Remove(state.GetType());
}
/// <summary>
/// 切换状态
/// </summary>
public void SwitchState<T>()
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;
}
}
以上是关于Unity中的有限状态机FSM的主要内容,如果未能解决你的问题,请参考以下文章