最近刚找到在实习,忙于公司一个c++ 项目 ,一直想写博客来着,没时间写今天熬夜打算先献上自己前几天自己封装的一个fsm状态机

话不多说,直接上正题,这篇博客主要是在学校的时候状态机一直使用的是player maker插件或者是自己使用if else (switch  case)来实现自己的状态机

所谓的状态机不过是一种数据结构,可以遵循一定的顺序的状态循环而已 (PS:自己能力有限,有不对的地方欢迎大家指出)

public delegate void FsmEvent();

public class MyState<T>
{
private T myState;
public string name;
public MyState(string name,T state)
{
this.name = name;
myState = state;
} public Dictionary<T, MyFSMTranslation<T>> TranslationDict = new Dictionary<T, MyFSMTranslation<T>>(); public event FsmEvent DoBeforeEntering; public void DoBeforeEntery()
{
if (DoBeforeEntering != null)
{
DoBeforeEntering();
}
else
{
Debug.Log("没有添加事件");
} } public event FsmEvent DoBeforeLeaving; public void DoBeforeLeave()
{
if (DoBeforeLeaving != null)
{
DoBeforeLeaving();
}
else
{
Debug.Log("没有绑定事件");
} } public event FsmEvent Act; public void DoAct()
{
if (Act != null)
{
Act();
}
else
{
Debug.Log("没有绑定事件");
}
}
}

解释一下自己的代码,FsmEvent是自定义的fsm的事件,MyState<T> 是泛型的状态类,包含了状态和三个事件,分别为第一次进入,一直执行,退出

 public class MyFSMTranslation<T>
{
public MyState<T> fromState;
/// <summary>
/// 转换状态的名字
/// </summary>
public string name;
public MyState<T> toState; /// <summary>
/// 状态跳转
/// </summary>
/// <param name="fromState"> 当前状态</param>
/// <param name="name"> 状态跳转的名字</param>
/// <param name="toState"> 下一个要进入的状态</param>
public MyFSMTranslation(MyState<T> fromState, MyState<T> toState, string name = null)
{
fromState = fromState;
toState = toState;
name = name;
}
}

这是一个状态跳转类注释很详细就不解释了

重点到了

 public class FSMS<T>
{ private T myFsmType;
public T FsmType
{
get
{
return myFsmType;
} } public string StateName
{
get
{
return StateDict[myFsmType].name;
}
} // 状态存贮
Dictionary<T, MyState<T>> StateDict = new Dictionary<T, MyState<T>>(); /// <summary>
/// 添加状态
/// </summary>
/// <param name="state">State.</param>
public void AddState(T stateType,string name,MyState<T> State)
{
StateDict[stateType] = State;
} /// <summary>
/// 添加跳转
/// </summary>
public void AddTranslation(T fromState, MyState<T> toState,string name)
{
StateDict[fromState].TranslationDict[fromState] = new MyFSMTranslation<T>(StateDict[fromState], toState,name);
} public void AddTranslation(T fromState, MyState<T> toState)
{
StateDict[fromState].TranslationDict[fromState] = new MyFSMTranslation<T>(StateDict[fromState], toState);
} public bool Translate(T nextType)
{
MyState<T> nextstate;
if (StateDict.ContainsKey(nextType))
{
nextstate = StateDict[nextType];
}
else
{
return false;
}
if (StateDict[myFsmType].TranslationDict.ContainsKey(nextType))
{ //当期状态转换之后执行的函数
//当期状态转换
//下一个状态需要执行的函数
//改变类里面的状态
StateDict[myFsmType].DoBeforeLeave();
myFsmType = nextType;
nextstate.DoBeforeEntery(); }
else
{
return false;
} return true;
} /// <summary>
/// 执行当前状态的方法
/// </summary>
public void Carry()
{
MyState<T> nextstate = StateDict[myFsmType];
nextstate.DoAct();
} /// <summary>
/// 启动状态机
/// </summary>
public void Start(T fsmtype)
{
myFsmType = fsmtype;
} /// <summary>
/// 清空状态机
/// </summary>
public void Clear()
{
StateDict.Clear();
} }

上面都有注释,就不在解释了,大家感觉有不对的地方欢迎指出

unity 状态机 + svn + 码云 上篇的更多相关文章

  1. UNITY 状态机 + SVN + 码云 下篇

    上篇说到自己写的一个FSM状态机,这篇写怎么把代码和码云联系在一起! 首先,我们应该知道为什么使用码云? 码云是开源中国社区2013年推出的基于 Git 的完全免费的代码托管服务,这个服务是基于 Gi ...

  2. SVN+码云 简单使用流程

    1.登录码云网站...

  3. git与svn与github与码云的区别

    1.git与github(https://www.oschina.net/)的区别 Git(https://git-scm.com/)是一个版本控制工具 github是一个用git做版本控制的项目托管 ...

  4. 使用eclipse的SVN连接码云

    码云配置: 码云的项目上,启用SVN访问 eclipse的配置,不配置这个会报错

  5. 码云使用svn无法提交空文件夹

    错误信息: svn: E200015: Commit failed (details follow): svn: E200015: Empty directories is not supported ...

  6. 码云分布式之 Brzo 服务器

    摘要: 码云是国内最大的代码托管平台,为了支持更大的用户规模,开发团队也在对一些组件进行大规模的重构. 前言 码云是国内最大的代码托管平台.码云基于 Gitlab 5.5 开发,经过几年的开发已经和官 ...

  7. idea和Webstorm上使用git和github,码云

    由于之前一直使用svn,现在项目使用git,顾根据网上找的学习资料,自己梳理了下,收获蛮多,这里做个记录,如果能帮助到您那是最好不过的. 1.大致步骤 使用工具:idea,github,码云 webs ...

  8. 代码管理必备-----git使用上传码云

    作为一个程序员,你要学会代码的管理,这是一个最基本的修养,就像是一个剑客的剑谱,代码管理,目前流行的是svn和git,但是很不好的是git如果没有插件的话,很多人都不会用git bash 来实现自己的 ...

  9. 在码云(gitee)上展开程序类课程教学

    码云主要提供了源代码管理(Git/SVN)功能,最近又推出了高校版让普通老师也能利用起来以供教学使用. 学生与老师不仅能利用其管理代码,更重要的是我们的程序教学能通过对git的使用来引入业界流行的软件 ...

随机推荐

  1. 浅淡HTML5移动Web开发

    说实话,我们这次开发移动端的项目,整个项目组的人都是第一次,最初立项的时候为是选择native app和web app还争论了一番,最后综合考虑,我们选择了web(我们选择了h5)开发.但从这两种开发 ...

  2. tnsnames.ora配置注意(连接新的数据库)

    文件地址D:\app\think\product\11.2.0\instantclient_11_2\network\admin\tnsnames.ora# tnsnames.ora Network ...

  3. mount: unknown filesystem type 'ntfs'

    mount: unknown filesystem type 'ntfs' 问题描述 # mount –t ntfs /dev/sdc1 /mnt/usb2 mount: unknown filesy ...

  4. 初识nginx

    先来一波官方站点关于nginx介绍.nginx相关历史这里不再赘述啦.   nginx 是免费,开源,高性能 HTTP 服务器和反向代理服务器,也可作为IMAP/POP3代理服务器.nginx以它的高 ...

  5. Getting Started With Hazelcast 读书笔记(第二章、第三章)

    第二章 起步 本章就相当简单粗暴了,用一个个例子说明hazelcast怎么用. 1.map,set,list这些集合类都是开箱即用的,只要从Hazelcast的实例中获取一份就行. 2.增加了Mult ...

  6. Core文件作用、设置及用法

    http://blog.csdn.net/lanmolei814/article/details/45201693 ====================================== 1.C ...

  7. 第3天作业 PoEdu MyString实现

    作业要求 代码: #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <cstring> class My ...

  8. Angular解决双向数据绑定

    <!DOCTYPE html> <html ng-app="myApp1"><body><div ng-controller=" ...

  9. python day2 字符串的方法

    1.首字母大写 name = "wuyuchao"result = name.capitalize()print(result)返回 Wuyuchao--------------- ...

  10. php和syslog

    syslog是Linux系统默认的日志守护进程.使用syslog可以方便把指定的事件写入特定文件中,可以让任何事件都登录到一台或多台服务器上. 1.简单例子,先说一下syslog怎么使用,以php为例 ...