C# 实现简单状态机(参考代码)
代码:
using System; namespace StateMachine2.State { public enum AnimationState { Walk = 1, Dead, } public abstract class State { abstract public int GetStateId{ get; } abstract public void Enter(StateEvent data); abstract public void Execute(StateEvent data); abstract public void Exit(StateEvent data); } //状态运行时候的参数 public class StateEvent { public string data; } //行走状态 public class State_Walk : State { public const int ID = 1; public override int GetStateId { get { return ID; } } public override void Enter(StateEvent data) { Console.WriteLine("角色行走-进入"); } public override void Execute(StateEvent data) { Console.WriteLine("角色行走-执行中"); } public override void Exit(StateEvent data) { Console.WriteLine("角色行走-退出"); } } //死亡状态 public class State_Dead : State { public const int ID = 2; public override int GetStateId { get { return ID; } } public override void Enter(StateEvent data) { Console.WriteLine("角色死亡-进入"); } public override void Execute(StateEvent data) { Console.WriteLine("角色死亡-执行中"); } public override void Exit(StateEvent data) { Console.WriteLine("角色死亡-退出"); } } public class StateMachine { private State currentState = null; private State previousState = null; private StateEvent dataEvent = null; private bool isStop; public State CurrentState { get { return currentState; } } public State PreviousState { get { return previousState; } } public bool IsStop { get { return isStop; } set { isStop = value; } } private State GetState(AnimationState animationState) { switch (animationState) { case AnimationState.Walk: return new State_Walk(); case AnimationState.Dead: return new State_Dead(); } return new State_Walk(); } public void ChangeState(AnimationState animationState, StateEvent data,StateEvent previousData = null) { ChangeState(GetState(animationState),data, previousData); } public void ChangeState(State state,StateEvent data, StateEvent previousData = null) { //如果切换的状态就是本状态,就退出 if (currentState != null && state.GetStateId == currentState.GetStateId) return; //退出上一个状态 if (previousState != null) previousState.Exit(previousData); //设置进状态,进入新状态 currentState = state; dataEvent = data; currentState.Enter(data); } public void Update() { if (currentState == null) { Console.WriteLine("当前没有状态可以执行"); return; } else if (IsStop) { Console.WriteLine("状态机已经停止"); return; } else { currentState.Execute(dataEvent); } } } }
执行代码:
using StateMachine2.State; using System; namespace StateMachine2 { class Program { static void Main(string[] args) { StateMachine sm = new StateMachine(); sm.ChangeState(AnimationState.Walk, new StateEvent() { data = "行走需要的参数" }); sm.Update(); //执行行走状态 sm.Update(); //执行行走状态 sm.ChangeState(AnimationState.Dead, new StateEvent() { data = "死亡需要的参数" }); sm.Update(); sm.IsStop = true; //停止状态机 sm.Update(); //再次执行状态 Console.WriteLine("结束程序"); Console.ReadLine(); } } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧