FSM状态机框架

本文介绍如何构建一个通用的状态机框架,适用于游戏开发中的各种状态管理,如角色动画转换。通过创建State类、MonoHelper类和StateMachine类,实现状态的添加、移除、切换以及事件监听。状态机可以根据Speed值动态切换Leader、Idle、Walk和Run等状态。
摘要由CSDN通过智能技术生成

编写一个通用的状态框架,不仅可以用于动画的转换,可以针对所有需要用到状态的情况。主要是模拟动画Animator Controller里的作用,写一个简单的框架。

先写一个State的类,放入FSM命名空间,然后创建状态名称StateName与存放状态的字典TransitionStates接着创建切换状态的方法,如添加,移除。接着创建判断状态的三个事件:OnStateEnterOnStateUpdate,OnStateExit。创建进入状态的(带参数)方法:EnterState与ExitState。最后创建判断是否满足过度状态的条件。

using System;
using System.Collections.Generic;

namespace FSM
{
    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>
        /// 当前状态可以切换到其他状态
        /// </summary>
        private Dictionary<string, Func<bool>> TransitionStates { get; set; }
        /// <summary>
        /// 注册状态切换
        /// </summary>
        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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值