最近刚找到在实习,忙于公司一个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. MAC 安装 Protobuf

    1.确认MAC装有g++.make.vim工具 2.安装make工具使用       brew install make 3.安装protobuf brew install protobuf 4.安装 ...

  2. PHP图片裁剪_图片缩放_PHP生成缩略图

    在制作网页过程中,为了排版整齐美观,对网页中的图片处理成固定大小尺寸的图片,或是要截去图片边角中含有水印的图片,对于图片量多,每天更新大量图,靠人工PS处理是不现实的,那么有没有自动处理图片的程序了! ...

  3. 在Sqlserver下巧用行列转换日期的数据统计

    在Sqlserver下巧用行列转换日期的数据统计 前言 在SQLSERVER 中有很多统计函数的基础语法,有使用Group By 或 partition by 后配合Sum,Count(*) 等用法. ...

  4. --with-http_realip_module选项(后台Nginx服务器记录原始客户端的IP地址 )

    转自:http://blog.itpub.net/27043155/viewspace-734234/ 通过这个模块允许我们改变客户端请求头中客户端IP地址值(例如,X-Real-IP 或 X-For ...

  5. C# 反转字符串方法

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace 反转字符 ...

  6. X-UA-Compatible失效问题

    有时候发现页面中写了<meta http-equiv="X-UA-Compatible" content="IE=8" />,但是文档模式依旧没改变 ...

  7. SAP第一轮面试总结

    1. 开始是一套面试题,可以选JAVA或C/C++两个语言的英文题.基础语法题,以指针为主. 2. 英文介绍,自由发挥.问了以下几个问题: 离职的愿意,未来五年的计划,介不介意使用ABAP langu ...

  8. vuex2.0.0爬坑记录 -- mutations的第一个参数state不能解构

    今天在学习vuex的过程中,遇到了一个很困扰人的问题,最终利用vuex的状态快照工具logger解决了问题. 问题是这样的,我在子组件中使用了mapState()函数来将状态映射至子组件中,使子组件能 ...

  9. 数据类型安全验证都交给TryParse吧

    C# 网站开发中 往往在编写后台代码中遇到从字符类型转换到其他类型.其实无需在单独验证字符串长度,是否为空等工作.直接用Tryparse转换,如果转换失败说明字符串的格式等有误.成功则再进一步验证转换 ...

  10. Android Service完全解析,关于服务你所需知道的一切(上)

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/11952435 相信大多数朋友对Service这个名词都不会陌生,没错,一个老练的A ...