一、简介

 

1. 什么是有限状态机?

       有限状态机(英语:finite-state machine,缩写:FSM)又称有限状 态自动机,简称状态机,是一种抽象机制,是处在各种不同的预定状态 下的其中一种状态。有限状态机也可以定义一组条件,以确认何时应该 改变状态。实际的状态会决定状态机的行为。

 

2. 为什么要使用有限状态机?

       状态机能够分离逻辑代码,提高代码的可维护性和重用性

 

3. 有限状态机如何解耦合?

(如战斗状态,我们将所有战斗相关的代码都 放在战斗状态类中实现)

 

 

二、项目结构

 


1. 源码存放路径

ImportPlugins/MXFramework**/Core/FiniteStateMachine

03_Unity有限状态机(FSM)_Unity有限状态机

 

2. 示例工程存放路径

    Example/ 03_FiniteStateMachine

03_Unity有限状态机(FSM)_状态机_02

 

 

三、 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