03_Unity有限状态机(FSM)
原创
©著作权归作者所有:来自51CTO博客作者DaLiangChen的原创作品,请联系作者获取转载授权,否则将追究法律责任
一、简介
1. 什么是有限状态机?
有限状态机(英语:finite-state machine,缩写:FSM)又称有限状 态自动机,简称状态机,是一种抽象机制,是处在各种不同的预定状态 下的其中一种状态。有限状态机也可以定义一组条件,以确认何时应该 改变状态。实际的状态会决定状态机的行为。
2. 为什么要使用有限状态机?
状态机能够分离逻辑代码,提高代码的可维护性和重用性
3. 有限状态机如何解耦合?
(如战斗状态,我们将所有战斗相关的代码都 放在战斗状态类中实现)
二、项目结构
1. 源码存放路径
ImportPlugins/MXFramework**/Core/FiniteStateMachine
2. 示例工程存放路径
Example/ 03_FiniteStateMachine
三、 API
1. OnEnter
public void OnEnter(string prevState)
(只刷新一次)
prevState:上一个状态的名称
2. OnUpdate
public void OnUpdate()
(每一帧都刷新)
3. OnExit
public void OnExit(string nextState)
(只刷新一次)
nextState:切换下一个状态的名字
四、 使用说明
1.注册状态和定义状态切换条件(代码如下)
using UnityEngine;
namespace Mx.Example
{
/// <summary>测试有限状态机</summary>
public class TestStateManager : MonoBehaviour
{
private FiniteStateMachine fsm;
void Awake()
{
fsm = new FiniteStateMachine();
this.FSMRegister();
fsm.EntryPoint("One");
}
void Update()
{
fsm.Update();
}
void FSMRegister()
{
//需要先注册状态
fsm.Register("One", new TestOneState());
fsm.Register("Two", new TesTwoState());
//限制状态直接的切换
fsm.State("One").On("Two").Enter("Two");
fsm.State("Two").On("One").Enter("One");
}
public void Trigger(string eventName) => fsm.Trigger(eventName);
public void Trigger(string eventName, object param1) => fsm.Trigger(eventName, param1);
public void Trigger(string eventName, object param1, object param2) => fsm.Trigger(eventName, param1, param2);
public void Trigger(string eventName, object param1, object param2, object param3) => fsm.Trigger(eventName, param1, param2, param3);
}
}
2.新建状态实体类(代码如下)
using UnityEngine;
namespace Mx.Example
{
/// <summary>测试状态1</summary>
public class TestOneState : IState
{
public void OnEnter(string prevState)
{
Debug.Log(GetType() + "/OnEnter()/prevState:"+ prevState);
}
public void OnExit(string nextState)
{
Debug.Log(GetType() + "/OnExit()/nextState:"+ nextState);
}
public void OnUpdate()
{
}
}
}
using UnityEngine;
/// <summary>测试状态2</summary>
public class TesTwoState : IState
{
public void OnEnter(string prevState)
{
Debug.Log(GetType() + "/OnEnter()/prevState:" + prevState);
}
public void OnExit(string nextState)
{
Debug.Log(GetType() + "/OnExit()/nextState:" + nextState);
}
public void OnUpdate()
{
}
}
3.测试有限状态机的调用(代码如下)
using UnityEngine;
using UnityEngine.UI;
namespace Mx.Example
{
/// <summary>测试有限状态机</summary>
public class TestFiniteStateMachine : MonoBehaviour
{
public Button m_BtnSwitch;
private TestStateManager m_TestStateManager;
private string m_StateName="One";
private void Awake()
{
m_TestStateManager = FindObjectOfType<TestStateManager>();
if (m_TestStateManager == null) m_TestStateManager = gameObject.AddComponent<TestStateManager>();
m_BtnSwitch.onClick.AddListener(onClickSwitchButton);
}
/// <summary>点击切换状态按钮</summary>
private void onClickSwitchButton()
{
switchState();
}
/// <summary>状态</summary>
private void switchState()
{
if (m_StateName.Equals("One")) m_StateName = "Two";
else m_StateName = "One";
m_BtnSwitch.transform.Find("Text").GetComponent<Text>().text = (m_StateName.Equals("One")? "切换状态Two" : "切换状态One");
m_TestStateManager.Trigger(m_StateName);
}
}
}
资料下载
源码地址:https://github.com/yongliangchen/MxDebug
QQ交流群:1079467433