C#状态机
2016-03-16 11:29
881 查看
状态机可以拆分复杂的控制逻辑到各个状态之中,使之更加清晰,更容易理解
以下是在UNITY3D中的一个实现
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;
public class CoroutineWrapper : MonoBehaviour {
#region 单例
static CoroutineWrapper inst;
private readonly static object mutex = new object();
public static CoroutineWrapper Inst {
get {
lock (mutex) {
if (inst == null) {
var obj = new GameObject("CoroutineWrapper");
inst = obj.AddComponent<CoroutineWrapper>();
}
return inst;
}
}
}
void Awake() {
inst = this;
DontDestroyOnLoad(this);
}
#endregion
public IEnumerator ExeDelay(int frames,Action ev) {
for (int i = 0; i < frames;i++ ) {
yield return new WaitForEndOfFrame();
}
ev();
}
public IEnumerator ExeDelayS(float sec, Action ev) {
yield return new WaitForSeconds(sec);
ev();;
}
public static void EXES(float sec, Action ev) {
inst.StartCoroutine(inst.ExeDelayS(sec,ev));
}
public static void EXEF(int frames, Action ev) {
inst.StartCoroutine(inst.ExeDelay(frames, ev));
}
public static void EXEE(Func<IEnumerator> ien) {
inst.StartCoroutine(ien());
}
public static void EXEE(Func<object[],IEnumerator> ien,params object[] p) {
inst.StartCoroutine(ien(p));
}
public event Action OnPerFrame;
void Update() {
if (OnPerFrame != null)
OnPerFrame();
}
}
使用时,可以跟据自己的需要去编写实现了FSMStatus接口类,来表示各个状态,然后状态间的跳转就被分散到了每个状态的代码之中
以下是在UNITY3D中的一个实现
using System.Collections; /// <summary> /// 基于字符串标识状态的状态机 /// 请自行确保FSMStatus的Name的唯一性 /// </summary> public class FSM { FSMStatus curStatus; // Use this for initialization public FSM(){ var t = CoroutineWrapper.Inst; t.OnPerFrame += Update; } // Update is called once per frame void Update () { if (curStatus != null) { curStatus.Update(); } } public void SetStatus(FSMStatus status) { if (curStatus!=null) { curStatus.Out(); } curStatus = status; curStatus.In(); } }
using System.Collections; /// <summary> /// 基于字符串标识的状态机状态 /// </summary> public interface FSMStatus { string Name { get; } // Use this for initialization void In(); // Update is called once per frame void Update(); void Out(); }
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;
public class CoroutineWrapper : MonoBehaviour {
#region 单例
static CoroutineWrapper inst;
private readonly static object mutex = new object();
public static CoroutineWrapper Inst {
get {
lock (mutex) {
if (inst == null) {
var obj = new GameObject("CoroutineWrapper");
inst = obj.AddComponent<CoroutineWrapper>();
}
return inst;
}
}
}
void Awake() {
inst = this;
DontDestroyOnLoad(this);
}
#endregion
public IEnumerator ExeDelay(int frames,Action ev) {
for (int i = 0; i < frames;i++ ) {
yield return new WaitForEndOfFrame();
}
ev();
}
public IEnumerator ExeDelayS(float sec, Action ev) {
yield return new WaitForSeconds(sec);
ev();;
}
public static void EXES(float sec, Action ev) {
inst.StartCoroutine(inst.ExeDelayS(sec,ev));
}
public static void EXEF(int frames, Action ev) {
inst.StartCoroutine(inst.ExeDelay(frames, ev));
}
public static void EXEE(Func<IEnumerator> ien) {
inst.StartCoroutine(ien());
}
public static void EXEE(Func<object[],IEnumerator> ien,params object[] p) {
inst.StartCoroutine(ien(p));
}
public event Action OnPerFrame;
void Update() {
if (OnPerFrame != null)
OnPerFrame();
}
}
使用时,可以跟据自己的需要去编写实现了FSMStatus接口类,来表示各个状态,然后状态间的跳转就被分散到了每个状态的代码之中
相关文章推荐
- Kinect结合Unity3D引擎开发体感游戏(一)
- c#调用COM组件
- C#实现把指定数据写入串口
- C#动态创建button的方法
- C#中抽象方法与虚拟方法的区别
- c#中虚函数的相关使用方法
- C#实现给图片加水印的方法
- C#使用加边法计算行列式的值
- C#实现多线程的同步方法实例分析
- C#中尾递归的使用、优化及编译器优化
- C#中的delegate委托类型基本学习教程
- C#实现子窗体与父窗体通信方法实例总结
- C#通用邮件发送类分享
- 举例讲解C#中自动实现的属性
- C#中this的用法集锦
- C#数据结构之顺序表(SeqList)实例详解
- C#.NET获取拨号连接的宽带连接方法
- C#异步绑定数据实现方法
- C#实现AddRange为数组添加多个元素的方法