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的主要内容,如果未能解决你的问题,请参考以下文章

Unity FSM 有限状态机

Unity有限状态机编写

独立项目-角色控制器-有限状态机(FSM)

有限状态机FSM详解及其实现

Fsm有限状态机深入浅析代码

浅谈在Unity3D中实现Finite State Machine System有限状态机框架系统