FSM状态机

【千锋合集】史上最全Unity3D全套教程|匠心之作_哔哩哔哩_bilibili

FSM有限状态机

动画状态机只能用于动画

游戏的正常速度、2倍速、暂停

吃鸡中的

半蹲 爬行状态 走路

字典

委托

有返回值 返回bool

协程必须继承monobehavior类才可以执行

 

字典可以同时执行多个事件的更新状态 

 A函数和B函数同时执行

状态机的嵌套 

17:00

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace FSMFrame
{
    public class State {
        public State(string name){
            StateName = name;
            TransitionStates = new Dictionary<string, Func<bool>>();
        }
        /// <summary>
        /// 状态名称
        /// </summary>
        private string StateName { get; set; }
        #region Transition States Control
        /// <summary>
        /// 当前状态可以切换的其他状态,传入的是一个委托,返回是bool值
        /// </summary>
        private Dictionary<string, Func<bool>> TransitionStates { get; set; }
      /// <summary>
      /// 注册状态切换
      /// </summary>
      /// <param name="stateName">要切换的状态名称</param>
      /// <param name="condition">切换的条件</param>
        public void RegisterTransitionState(String stateName,Func<bool> condition) {
            if (!TransitionStates.ContainsKey(stateName))
            {
                //添加
                TransitionStates.Add(stateName, condition);
            }
            else {
                //更新
                TransitionStates[stateName] = condition;
            }
        }
        /// <summary>
        /// 取消注册切换的状态
        /// </summary>
        /// <param name="stateName"></param>
        public void UnRegisterTransitionState(string stateName) {
            if (TransitionStates.ContainsKey(stateName)) {
                //移除
                TransitionStates.Remove(stateName);
            }
        }
        #endregion


        #region State Machine Event
        /// <summary>
        /// 状态进入事件
        /// </summary>
        public event Action<object[]> OnStateEnter;
        /// <summary>
        /// 状态跟新事件【在状态过程中,持续调用】
        /// </summary>
        public event Action<object[]> OnStateUpdate;
        /// <summary>
        /// 离开状态事件
        /// </summary>
        public event Action<object[]> OnStateExit;
        /// <summary>
        /// 进入状态
        /// </summary>
        /// <param name="paramters"></param>
        public void EnterState(object[] enterEventparamters,object[] updateEventParamters) {
            if (OnStateEnter != null) {
                //执行进入状态的事件
                OnStateEnter(enterEventparamters);
            }
            //绑定当前状态的更新事件,以便后期执行
            MonoHelper.Instance.AddUpdateEvent(StateName, OnStateUpdate,updateEventParamters);
        }
        /// <summary>
        /// 离开状态
        /// </summary>
        /// <param name="paramters"></param>
        public void ExitState(object[] paramters) {
            //解除绑定当前状态的更新事件,以便后期停止执行
            MonoHelper.Instance.RemoveUpdateEvent(StateName);
            if (OnStateExit != null) {
                //执行离开状态事件
                OnStateExit(paramters);
            }
        }
        #endregion
    }
}

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;


namespace FSMFrame
{
    public class MonoHelper : MonoBehaviour
    {
        /// <summary>
        /// 状态更新模块
        /// </summary>
        class StateUpdateModule {
            /// <summary>
            /// 状态名称
            /// </summary>
            //public string stateName;
            /// <summary>
            /// 状态更新事件
            /// </summary>
            public Action<object[]> stateUpdateEvent;
            /// <summary>
            /// 触发状态更新事件的参数
            /// </summary>
            public object[] stateUpdateEventParamters;
            public StateUpdateModule(Action<object[]> e, object[] paras) {
                stateUpdateEvent = e;
                stateUpdateEventParamters = paras;
            }
        }
        /// <summary>
        /// 单例脚本
        /// </summary>
        public static MonoHelper Instance;
        private void Awake()
        {
            Instance = this;
            StateUpdateModuleDic = new Dictionary<string, StateUpdateModule>();
        }
        /// <summary>
        /// 更新事件执行的时间间隔
        /// </summary>
        [Header("更新事件执行的时间间隔")]
        public float invokeInterval = -1;

        /// <summary>
        /// 状态更新模块字典
        /// </summary>
        private Dictionary<string, StateUpdateModule> StateUpdateModuleDic;
        /// <summary>
        /// 添加更新事件
        /// </summary>
        /// <param name="stateName">状态名称</param>
        /// <param name="updateEvent">更新事件</param>
        /// <param name="updateEventParamters">更新事件执行时用的参数</param>
        public void AddUpdateEvent(string stateName, Action<object[]> updateEvent, object[] updateEventParamters) {
            //如果字典中存在该状态
            if (StateUpdateModuleDic.ContainsKey(stateName))
            {
                //更新Update事件及参数
                StateUpdateModuleDic[stateName] = new StateUpdateModule(updateEvent, updateEventParamters);
            }
            else {
                //添加Update事件及参数
                StateUpdateModuleDic.Add(stateName, new StateUpdateModule(updateEvent, updateEventParamters));
            }
        }
        /// <summary>
        /// 移除更新事件
        /// </summary>
        /// <param name="stateName"></param>
        public void RemoveUpdateEvent(string stateName) {
            if (StateUpdateModuleDic.ContainsKey(stateName)) {
                //移除
                StateUpdateModuleDic.Remove(stateName);
            }

        }

        /// <summary>
        /// test
        /// </summary>
        /// <returns></returns>
        private void Test1(object[] objs) {
            Debug.Log("Test");
            Debug.Log("Objs:"+objs.Length);
        }


        private void Test2(object[] objs)
        {
            Debug.Log("Test2" + objs.Length);            
        }


        private IEnumerator Start()
        {
            //Test:
            AddUpdateEvent(stateName:"TestState",updateEvent:Test1,updateEventParamters:new object[] { 1,2,3});
            AddUpdateEvent(stateName: "NewTestState", updateEvent: Test2, updateEventParamters: new object[] { 4,5 });
            while (true) {
                if (invokeInterval <= 0)
                {
                    //等一帧
                    yield return 0;

                }
                else {
                    //等一个时间间隔
                    yield return new WaitForSeconds(invokeInterval);
                }
                //执行事件
                foreach (KeyValuePair<string,StateUpdateModule> updateModule in StateUpdateModuleDic)
                {
                    if (updateModule.Value.stateUpdateEvent != null) {
                        //调用该字典中的每个事件,并传递参数
                        updateModule.Value.stateUpdateEvent(updateModule.Value.stateUpdateEventParamters);
                    }        
                }
            }
        }

    }
}

Lambda表达式。
Lambda表达式是C#3.0的新内容,如果您之前学习的C#2.0,不认识也就不奇怪了。
给您举个例子。
例如,我定义一个委托:
delegate int Method(int a, int b);
再定义一个方法:
int Add(int a, int b)
{
return a + b;
}
我可能需要这样通过委托调用方法:
Method m += Add;
Console.WriteLine(m(2, 3));
====================================================
但如果用 Lambda 表达式:
Method m += (a ,b) => a + b;
Console.WriteLine(m(2, 3));
可以省去方法的定义。
实际上, Lambda 表达式只是简化了匿名方法的语法而已。

附 C# 2.0 的匿名方法语法:
Method m += delegate(int a, int b) { return a + b; };
Console.WriteLine(m(2, 3));

*******************************************************************************

C#中 += (s, e) => 这些字符什么意思

public MainWindow()
{
InitializeComponent();
this.Loaded += (s, e) => DiscoverKinectSensor();
this.Unloaded += (s, e) => this.kinect = null;
}

=========================================================================

 

state有可能是statemachine,因为statemachine是state的子类

 

可以实现递归,一个状态机管理几个子类状态机 


using System.Collections;
using System.Collections.Generic;
using UnityEngine;


namespace FSMFrame
{
    public class StateMachine : State
    {
        #region Manager States
        /// <summary>
        /// 被管理的状态
        /// </summary>
        private Dictionary<string, State> manageredStates;
        /// <summary>
        /// 默认状态 
        /// </summary>
        private State defaultState;
        /// <summary>
        /// 当前状态
        /// </summary>
        private State currentState;

       
        public StateMachine(string name) : base(name)
        {
            manageredStates = new Dictionary<string, State>();
            //绑定初始事件
            StateMachineEventBind();
        }

        private void StateMachineEventBind() {
            OnStateUpdate += CheckCurrentSTateTransition;
        }
       
        /// <summary>
        /// 添加状态
        /// </summary>
        /// <param name="stateName"></param>
        /// //通过状态名添加
        public State AddState(string stateName) {
            if (IsRun)
            {
                Debug.LogWarning("状态已经启动,不能进行状态删除");
                return null;
            }
            if (manageredStates.ContainsKey(stateName))
            {
                Debug.LogWarning("该状态已存在");
                return manageredStates[stateName];
            }
            //创建状态
            State crtState = new State(stateName);
            //添加状态
            manageredStates.Add(stateName, crtState);
            //当前添加的状态是第一个状态
            if (manageredStates.Count == 1) {
                //当前状态就是默认状态
                defaultState = crtState;
            }
            return crtState;
        }
        /// <summary>
        /// 添加状态
        /// </summary>
        /// <param name="crtState"></param>
        public void AddState(State crtState) {           
            if (manageredStates.ContainsKey(crtState.StateName))
            {
                Debug.LogWarning("该状态已存在");
                return;
            }            
            //添加状态
            manageredStates.Add(crtState.StateName, crtState);
            //当前添加的状态是第一个状态
            if (manageredStates.Count == 1)
            {
                //当前状态就是默认状态
                defaultState = crtState;
            }
        }
        /// <summary>
        /// 移除状态
        /// </summary>
        /// <param name="stateName"></param>
        public void RemoveState(string stateName) {
            if (IsRun)
            {
                Debug.LogWarning("状态已经启动,不能进行状态删除");
                return;
            }


            //如果当前状态在状态机内,且不是当前状态
            if (manageredStates.ContainsKey(stateName)&&manageredStates[stateName]!=currentState) {
                //当前要删除的状态
                State crtState = manageredStates[stateName];
                //移除状态
                manageredStates.Remove(stateName);
                //如果当前状态是默认状态
                if (manageredStates[stateName] == defaultState) {
                    //清除上一次默认状态
                    defaultState = null;
                    //选择新的默认状态
                    ChooseNewDefaultState();
                }             
            }
        }
        /// <summary>
        /// 选择新的默认状态
        /// </summary>
        private void ChooseNewDefaultState() {
            foreach (KeyValuePair<string,State> item in manageredStates) {
                //遍历到第一个状态设置为默认状态
                defaultState = item.Value;
                return;
            }
        }
        #endregion

        #region State Machine Event
        /// <summary>
        /// 状态机的进入
        /// </summary>
        /// <param name="enterEventparamters"></param>
        /// <param name="updateEventParamters"></param>
        public override void EnterState(object[] enterEventparamters, object[] updateEventParamters)
        {
            //先执行当前状态机的进入事件
            base.EnterState(enterEventparamters, updateEventParamters);
            //在执行子状态的进入


            //判断是否有默认状态
            if (defaultState == null) {
                return;
            }
            //此时当前状态就是默认状态
            currentState = defaultState;
            //当前状态执行进入事件[进入默认的子状态]
            currentState.EnterState(enterEventparamters, updateEventParamters);
        }
        /// <summary>
        /// 状态机的离开
        /// </summary>
        /// <param name="paramters"></param>
        public override void ExitState(object[] paramters)
        {   //如果状态不为空
            if (currentState != null)
            {
                //当前状态先离开
                currentState.ExitState(paramters);
            }
            //状态机再离开
            base.ExitState(paramters);
        }
        #endregion

        #region State Machine Check State Transition 
        /// <summary>
        /// 检测当前状态是否满足过渡条件,满足就过渡
        /// </summary>
        private void CheckCurrentSTateTransition(object[] objs) {
            //检测过渡事件
            string targetState=currentState.CheckTransition();
            //当前状态达到过渡事件满足了
            if (targetState != null) {
                //过渡到新状态
                TransitionToState(targetState);
            }
        }

        private void TransitionToState(string targetStateName) {
            //要过渡的状态是否被当前状态机所管理
            if (manageredStates.ContainsKey(targetStateName)) {
                //当前状态离开
                currentState.ExitState(null);
                //切换当前状态为新状态
                currentState = manageredStates[targetStateName];
                //新的当前状态执行进入
                currentState.EnterState(null, null);
            }
        }
        #endregion
    }
}

全部代码

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

namespace FSMFrame
{
    public class State {
        public State(string name){
            StateName = name;
            TransitionStates = new Dictionary<string, Func<bool>>();
            //绑定基础回调
            StateBaseEventBind();
        }
        /// <summary>
        /// 状态名称
        /// </summary>
        public string StateName { get; set; }
        /// <summary>
        /// 标记当前状态是否已经正在执行
        /// </summary>
        public bool IsRun { get; set; }
        #region State Base EventBinding
        private void StateBaseEventBind()
        {
            //进入状态标记
            OnStateEnter += objects => { IsRun = true; };
            OnStateExit += objects => { IsRun = false; };
        }

        #endregion
        #region Transition States Control
        /// <summary>
        /// 当前状态可以切换的其他状态,传入的是一个委托,返回是bool值
        /// </summary>
        private Dictionary<string, Func<bool>> TransitionStates { get; set; }
      /// <summary>
      /// 注册状态切换
      /// </summary>
      /// <param name="stateName">要切换的状态名称</param>
      /// <param name="condition">切换的条件</param>
        public void RegisterTransitionState(String stateName,Func<bool> condition) {
            if (!TransitionStates.ContainsKey(stateName))
            {
                //添加
                TransitionStates.Add(stateName, condition);
            }
            else {
                //更新
                TransitionStates[stateName] = condition;
            }
        }
        /// <summary>
        /// 取消注册切换的状态
        /// </summary>
        /// <param name="stateName"></param>
        public void UnRegisterTransitionState(string stateName) {
            if (TransitionStates.ContainsKey(stateName)) {
                //移除
                TransitionStates.Remove(stateName);
            }
        }
        #endregion


        #region State Machine Event
        /// <summary>
        /// 状态进入事件
        /// </summary>
        public event Action<object[]> OnStateEnter;
        /// <summary>
        /// 状态跟新事件【在状态过程中,持续调用】
        /// </summary>
        public event Action<object[]> OnStateUpdate;
        /// <summary>
        /// 离开状态事件
        /// </summary>
        public event Action<object[]> OnStateExit;
        /// <summary>
        /// 进入状态
        /// </summary>
        /// <param name="paramters"></param>
        public virtual void EnterState(object[] enterEventparamters,object[] updateEventParamters) {
            if (OnStateEnter != null) {
                //执行进入状态的事件
                OnStateEnter(enterEventparamters);
            }
            //绑定当前状态的更新事件,以便后期执行
            MonoHelper.Instance.AddUpdateEvent(StateName, OnStateUpdate,updateEventParamters);
        }
        /// <summary>
        /// 离开状态
        /// </summary>
        /// <param name="paramters"></param>
        public virtual void ExitState(object[] paramters) {
            //解除绑定当前状态的更新事件,以便后期停止执行
            MonoHelper.Instance.RemoveUpdateEvent(StateName);
            if (OnStateExit != null) {
                //执行离开状态事件
                OnStateExit(paramters);
            }
        }
        #endregion

        #region Check Transition
        /// <summary>
        /// 检测状态过渡
        /// </summary>
        /// <returns></returns>
        public string CheckTransition() {
            foreach (KeyValuePair<string, Func<bool>> item in TransitionStates)
            {   //执行判断条件
                if (item.Value())
                {
                    //条件满足,过渡状态                    
                    return item.Key;
                }
            }
            return null;
        }

        #endregion
    }
}

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;


namespace FSMFrame
{
    public class MonoHelper : MonoBehaviour
    {
        /// <summary>
        /// 状态更新模块
        /// </summary>
        class StateUpdateModule {
            /// <summary>
            /// 状态名称
            /// </summary>
            //public string stateName;
            /// <summary>
            /// 状态更新事件
            /// </summary>
            public Action<object[]> stateUpdateEvent;
            /// <summary>
            /// 触发状态更新事件的参数
            /// </summary>
            public object[] stateUpdateEventParamters;
            public StateUpdateModule(Action<object[]> e, object[] paras) {
                stateUpdateEvent = e;
                stateUpdateEventParamters = paras;
            }
        }
        /// <summary>
        /// 单例脚本
        /// </summary>
        public static MonoHelper Instance;
        private void Awake()
        {
            Instance = this;
            StateUpdateModuleDic = new Dictionary<string, StateUpdateModule>();
           
        }
        /// <summary>
        /// 更新事件执行的时间间隔
        /// </summary>
        [Header("更新事件执行的时间间隔")]
        public float invokeInterval = -1;

        /// <summary>
        /// 状态更新模块字典
        /// </summary>
        private Dictionary<string, StateUpdateModule> StateUpdateModuleDic;
        /// <summary>
        /// 状态更新模块数组
        /// </summary>
        private StateUpdateModule[] stateUpdateModuleArray;

        private void DicToArray()
        {
            //实例化数组
            stateUpdateModuleArray = new StateUpdateModule[StateUpdateModuleDic.Count];
            //计数器
            int counter = 0;
            foreach (KeyValuePair<string, StateUpdateModule> item in StateUpdateModuleDic) {
                //模块事件对象
                stateUpdateModuleArray[counter] = item.Value;
                //计数器递增
                counter++;
            }
        }

        /// <summary>
        /// 添加更新事件
        /// </summary>
        /// <param name="stateName">状态名称</param>
        /// <param name="updateEvent">更新事件</param>
        /// <param name="updateEventParamters">更新事件执行时用的参数</param>
        public void AddUpdateEvent(string stateName, Action<object[]> updateEvent, object[] updateEventParamters) {
            //如果字典中存在该状态
            if (StateUpdateModuleDic.ContainsKey(stateName))
            {
                //更新Update事件及参数
                StateUpdateModuleDic[stateName] = new StateUpdateModule(updateEvent, updateEventParamters);
            }
            else {
                //添加Update事件及参数
                StateUpdateModuleDic.Add(stateName, new StateUpdateModule(updateEvent, updateEventParamters));
            }
            //倒一下
            DicToArray();
        }
        /// <summary>
        /// 移除更新事件
        /// </summary>
        /// <param name="stateName"></param>
        public void RemoveUpdateEvent(string stateName) {
            if (StateUpdateModuleDic.ContainsKey(stateName)) {
                //移除
                StateUpdateModuleDic.Remove(stateName);
                //倒一下
                DicToArray();
            }

        }

        /// <summary>
        /// test
        /// </summary>
        /// <returns></returns>
        private void Test1(object[] objs) {
            Debug.Log("Test");
            Debug.Log("Objs:"+objs.Length);
        }


        private void Test2(object[] objs)
        {
            Debug.Log("Test2" + objs.Length);            
        }


        private IEnumerator Start()
        {
            //Test:
            //AddUpdateEvent(stateName:"TestState",updateEvent:Test1,updateEventParamters:new object[] { 1,2,3});
            //AddUpdateEvent(stateName: "NewTestState", updateEvent: Test2, updateEventParamters: new object[] { 4,5 });
            while (true) {
                if (invokeInterval <= 0)
                {
                    //等一帧
                    yield return 0;

                }
                else {
                    //等一个时间间隔
                    yield return new WaitForSeconds(invokeInterval);
                }
                执行事件
                for (int i = 0; i < stateUpdateModuleArray.Length; i++) {
                    if (stateUpdateModuleArray[i].stateUpdateEvent != null) {
                        //调用该数组中的每个事件,并传递参数
                        stateUpdateModuleArray[i].stateUpdateEvent(stateUpdateModuleArray[i].stateUpdateEventParamters);
                    }
                }


                //foreach (KeyValuePair<string,StateUpdateModule> updateModule in StateUpdateModuleDic)
                //{
                //    if (updateModule.Value.stateUpdateEvent != null) {
                //        //调用该字典中的每个事件,并传递参数
                //        updateModule.Value.stateUpdateEvent(updateModule.Value.stateUpdateEventParamters);
                //    }        
                //}
            }
        }

    }
}

using System.Collections;
using System.Collections.Generic;
using UnityEngine;


namespace FSMFrame
{
    public class StateMachine : State
    {
        #region Manager States
        /// <summary>
        /// 被管理的状态
        /// </summary>
        private Dictionary<string, State> manageredStates;
        /// <summary>
        /// 默认状态 
        /// </summary>
        private State defaultState;
        /// <summary>
        /// 当前状态
        /// </summary>
        private State currentState;

       
        public StateMachine(string name) : base(name)
        {
            manageredStates = new Dictionary<string, State>();
            //绑定初始事件
            StateMachineEventBind();
        }

        private void StateMachineEventBind() {
            OnStateUpdate += CheckCurrentSTateTransition;
        }
       
        /// <summary>
        /// 添加状态
        /// </summary>
        /// <param name="stateName"></param>
        /// //通过状态名添加
        public State AddState(string stateName) {
            if (IsRun)
            {
                Debug.LogWarning("状态已经启动,不能进行状态删除");
                return null;
            }
            if (manageredStates.ContainsKey(stateName))
            {
                Debug.LogWarning("该状态已存在");
                return manageredStates[stateName];
            }
            //创建状态
            State crtState = new State(stateName);
            //添加状态
            manageredStates.Add(stateName, crtState);
            //当前添加的状态是第一个状态
            if (manageredStates.Count == 1) {
                //当前状态就是默认状态
                defaultState = crtState;
            }
            return crtState;
        }
        /// <summary>
        /// 添加状态
        /// </summary>
        /// <param name="crtState"></param>
        public void AddState(State crtState) {           
            if (manageredStates.ContainsKey(crtState.StateName))
            {
                Debug.LogWarning("该状态已存在");
                return;
            }            
            //添加状态
            manageredStates.Add(crtState.StateName, crtState);
            //当前添加的状态是第一个状态
            if (manageredStates.Count == 1)
            {
                //当前状态就是默认状态
                defaultState = crtState;
            }
        }
        /// <summary>
        /// 移除状态
        /// </summary>
        /// <param name="stateName"></param>
        public void RemoveState(string stateName) {
            if (IsRun)
            {
                Debug.LogWarning("状态已经启动,不能进行状态删除");
                return;
            }


            //如果当前状态在状态机内,且不是当前状态
            if (manageredStates.ContainsKey(stateName)&&manageredStates[stateName]!=currentState) {
                //当前要删除的状态
                State crtState = manageredStates[stateName];
                //移除状态
                manageredStates.Remove(stateName);
                //如果当前状态是默认状态
                if (manageredStates[stateName] == defaultState) {
                    //清除上一次默认状态
                    defaultState = null;
                    //选择新的默认状态
                    ChooseNewDefaultState();
                }             
            }
        }
        /// <summary>
        /// 选择新的默认状态
        /// </summary>
        private void ChooseNewDefaultState() {
            foreach (KeyValuePair<string,State> item in manageredStates) {
                //遍历到第一个状态设置为默认状态
                defaultState = item.Value;
                return;
            }
        }
        #endregion

        #region State Machine Event
        /// <summary>
        /// 状态机的进入
        /// </summary>
        /// <param name="enterEventparamters"></param>
        /// <param name="updateEventParamters"></param>
        public override void EnterState(object[] enterEventparamters, object[] updateEventParamters)
        {
            //先执行当前状态机的进入事件
            base.EnterState(enterEventparamters, updateEventParamters);
            //在执行子状态的进入


            //判断是否有默认状态
            if (defaultState == null) {
                return;
            }
            //此时当前状态就是默认状态
            currentState = defaultState;
            //当前状态执行进入事件[进入默认的子状态]
            currentState.EnterState(enterEventparamters, updateEventParamters);
        }
        /// <summary>
        /// 状态机的离开
        /// </summary>
        /// <param name="paramters"></param>
        public override void ExitState(object[] paramters)
        {   //如果状态不为空
            if (currentState != null)
            {
                //当前状态先离开
                currentState.ExitState(paramters);
            }
            //状态机再离开
            base.ExitState(paramters);
        }
        #endregion

        #region State Machine Check State Transition 
        /// <summary>
        /// 检测当前状态是否满足过渡条件,满足就过渡
        /// </summary>
        private void CheckCurrentSTateTransition(object[] objs) {
            //检测过渡事件
            string targetState=currentState.CheckTransition();
            //当前状态达到过渡事件满足了
            if (targetState != null) {
                //过渡到新状态
                TransitionToState(targetState);
            }
        }

        private void TransitionToState(string targetStateName) {
            //要过渡的状态是否被当前状态机所管理
            if (manageredStates.ContainsKey(targetStateName)) {
                //当前状态离开
                currentState.ExitState(null);
                //切换当前状态为新状态
                currentState = manageredStates[targetStateName];
                //新的当前状态执行进入
                currentState.EnterState(null, null);
            }
        }
        #endregion
    }
}

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using FSMFrame;

public class UseFSM : MonoBehaviour {
    /// <summary>
    /// 总状态机
    /// </summary>
    private StateMachine leader;
    [Range(0,10)]
    [Header("速度参数")]
    public float speed;
    private void Start()
    {
        //实例化
        leader = new StateMachine("leader");
        //创建子状态
        State idleState = new State("Idle");
        State walkState = new State("Walk");
        State runState = new State("Run");
        //创建子状态机
        StateMachine locomotionState = new StateMachine("Locomotion");
        //建立状态关系
        locomotionState.AddState(walkState);
        locomotionState.AddState(runState);
        leader.AddState(idleState);
        leader.AddState(locomotionState);
        //添加状态事件
        leader.OnStateEnter += objects => { Debug.Log("Leader Enter!"); };
        leader.OnStateUpdate += objects => { Debug.Log("Leader Update!"); };
        leader.OnStateExit += objects => { Debug.Log("Leader Exit!"); };

        locomotionState.OnStateEnter += objects => { Debug.Log("locomotionState Enter!"); };
        locomotionState.OnStateUpdate += objects => { Debug.Log("locomotionState Update!"); };
        locomotionState.OnStateExit += objects => { Debug.Log("locomotionState Exit!"); };

        idleState.OnStateEnter += objects => { Debug.Log("idleState Enter!"); };
        idleState.OnStateUpdate += objects => { Debug.Log("idleState Update!"); };
        idleState.OnStateExit += objects => { Debug.Log("idleState Exit!"); };

        walkState.OnStateEnter += objects => { Debug.Log("walkState Enter!"); };
        walkState.OnStateUpdate += objects => { Debug.Log("walkState Update!"); };
        walkState.OnStateExit += objects => { Debug.Log("walkState Exit!"); };

        runState.OnStateEnter += objects => { Debug.Log("runState Enter!"); };
        runState.OnStateUpdate += objects => { Debug.Log("runState Update!"); };
        runState.OnStateExit += objects => { Debug.Log("runState Exit!"); };

        //添加状态过渡关系
        idleState.RegisterTransitionState("Locomotion",  () => {return speed > 1; });
        locomotionState.RegisterTransitionState("Idle", () => { return speed <= 1; });
        walkState.RegisterTransitionState("Run", () => { return speed > 5;});
        runState.RegisterTransitionState("Walk",()=> { return speed <= 5; });

        //启动状态机
        leader.EnterState(null, null);
    }


}
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
下面是一个简单的FSM状态机示例代码(使用Python编写): ```python class State: def __init__(self, name): self.name = name def on_enter(self): pass def on_exit(self): pass def handle_event(self, event): pass class StateMachine: def __init__(self, initial_state): self.current_state = initial_state def transition_to(self, new_state): self.current_state.on_exit() self.current_state = new_state self.current_state.on_enter() def handle_event(self, event): self.current_state.handle_event(event) # 示例状态 class IdleState(State): def on_enter(self): print("进入空闲状态") def on_exit(self): print("退出空闲状态") def handle_event(self, event): if event == "start": print("开始任务") return "running" return self.name class RunningState(State): def on_enter(self): print("进入运行状态") def on_exit(self): print("退出运行状态") def handle_event(self, event): if event == "stop": print("停止任务") return "idle" return self.name # 创建状态机并设置初始状态为IdleState state_machine = StateMachine(IdleState()) # 处理事件 state_machine.handle_event("start") # 输出: 进入空闲状态 # 开始任务 state_machine.transition_to(RunningState()) # 输出: 退出空闲状态 # 进入运行状态 state_machine.handle_event("stop") # 输出: 停止任务 # 退出运行状态 # 进入空闲状态 ``` 以上示例代码展示了一个简单的状态机,其中包括两个状态,即"空闲"和"运行"。状态之间的切换由事件触发,例如"start"事件将从"空闲"状态切换到"运行"状态,"stop"事件将从"运行"状态切换回"空闲"状态。每个状态都有进入(on_enter)和退出(on_exit)方法,在切换到新状态时会调用这些方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值