编写一个通用的状态框架,不仅可以用于动画的转换,可以针对所有需要用到状态的情况。主要是模拟动画Animator Controller里的作用,写一个简单的框架。
先写一个State的类,放入FSM命名空间,然后创建状态名称StateName与存放状态的字典TransitionStates,接着创建切换状态的方法,如添加,移除。接着创建判断状态的三个事件:OnStateEnter,OnStateUpdate,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
本文介绍如何构建一个通用的状态机框架,适用于游戏开发中的各种状态管理,如角色动画转换。通过创建State类、MonoHelper类和StateMachine类,实现状态的添加、移除、切换以及事件监听。状态机可以根据Speed值动态切换Leader、Idle、Walk和Run等状态。
最低0.47元/天 解锁文章
2142

被折叠的 条评论
为什么被折叠?



