Unity3D C# 状态机封装
2017-03-17 18:29
302 查看
简单明了,提供了一下几个功能。
enum类型状态id,c# 枚举Enum和int转换(不使用强转)
状态切换,获取当前状态,和前一个状态
状态进入,退出,执行
作为组件绑定在GameObject对象上,从此拥有了状态机
为什么要使用enum类型的状态id ?enum的特性符合,状态标识的要求
enum比string高效,也不损失可读性
enum比int有明确的类型要求,增加类型安全性
剔除了自定义enum类型和父类enum的强转的繁琐,增加了可读性
enum类型状态id,c# 枚举Enum和int转换(不使用强转)
状态切换,获取当前状态,和前一个状态
状态进入,退出,执行
作为组件绑定在GameObject对象上,从此拥有了状态机
为什么要使用enum类型的状态id ?enum的特性符合,状态标识的要求
enum比string高效,也不损失可读性
enum比int有明确的类型要求,增加类型安全性
剔除了自定义enum类型和父类enum的强转的繁琐,增加了可读性
using UnityEngine; using System.Collections; using System.Collections.Generic; using System; namespace OnePixelFramework { public class StateMachine : MonoBehaviour { private Dictionary<int, State> stateDict = new Dictionary<int, State>(); // 当前状态 public State curState { private set; get; } // 前一个状态 public State preState { private set; get; } // T 必须是Enum类型 public T GetCurStateId<T>() where T : struct, IConvertible { return GetStateId<T>(this.curState); } // T 必须是Enum类型 public T GetPreStateId<T>() where T : struct, IConvertible { return GetStateId<T>(this.preState); } // 获取State的状态id private static T GetStateId<T>(State state) { Type enumType = typeof(T); if (!enumType.IsEnum) { throw new ArgumentException("T must be an enumerated type"); } int value; if (state != null) { value = Convert.ToInt32(state.id); } else { value = -1; } return (T) Enum.ToObject(enumType, value); } // 根据自定义Enum创建State public State CreateState(Enum stateId) { State state = new State(); state.id = stateId; state.stateMachine = this; this.stateDict.Add(Convert.ToInt32(stateId), state); return state; } // 状态切换 public State SetState(Enum stateId) { if (this.curState != null) { if (this.curState.OnExit != null) { this.curState.OnExit(); } } this.preState = this.curState; this.curState = this.stateDict[Convert.ToInt32(stateId)]; if (this.curState.OnEnter != null) { this.curState.OnEnter(); } return this.curState; } // 状态执行 public virtual void Update() { if (this.curState != null) { if (this.curState.Update != null) { this.curState.Update(); } } } // 状态对象 public class State { public Enum id; public object userData; public StateMachine stateMachine; public Action OnEnter; public Action OnExit ; public Action Update ; public State SetId(Enum id) { this.id = id; return this; } public State SetUserData(object userData) { this.userData = userData; return this; } public State SetOnEnter(Action OnEnter) { this.OnExit = OnEnter; return this; } public State SetOnExit(Action OnExit) { this.OnExit = OnExit; return this; } public State SetUpdate(Action Update) { this.Update = Update; return this; } } } }
相关文章推荐
- 在Unity3D中用C#封装一个类似AS3的ByteArray类(二)--升级版
- Unity3D开发和总结:用C#封装类似苹果NSNotificationCenter消息通信机制(KVO)
- 在Unity3D中用C#封装一个类似AS3的ByteArray类
- 使用C#封装Win32API
- 收藏——在C#使用SHGetFileInfo获取(管理)文件或者文件夹图标(C#封装Win32函数的一个例子)
- 对象的封装与C#的类
- C#封装的一个串口操作类(可用于Win CE)
- .Net/C# 封装磁盘目录文件搜索功能的工具类 (实现了与搜索相关的事件,以便插入客户处理代码)
- SQL过程自动C#封装,支持从表到基本存储过程生成,
- 发布 c#控制Word的类库。对com操作进行了封装
- C#对Socket操作的封装
- 迈向面向对象程序设计的第一步:封装(c#描述)
- C#封装的DES与MD5加密示例代码
- C#下操作ini文件的封装
- c#封装jmail的pop3收邮件
- 用C#封装SWF文件格式
- .Net/C# 封装磁盘目录文件搜索功能的工具类 (实现了与搜索相关的事件,以便插入客户处理代码)
- c# 数据库操纵封装
- 存储过程中调用C#封装的DLL
- Web C#2.0 DataSet和Reader封装组件实现自动多数据库切换(含组件源码和实例)