unity 状态机 + svn + 码云 上篇
最近刚找到在实习,忙于公司一个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 + 码云 上篇的更多相关文章
- UNITY 状态机 + SVN + 码云 下篇
上篇说到自己写的一个FSM状态机,这篇写怎么把代码和码云联系在一起! 首先,我们应该知道为什么使用码云? 码云是开源中国社区2013年推出的基于 Git 的完全免费的代码托管服务,这个服务是基于 Gi ...
- SVN+码云 简单使用流程
1.登录码云网站...
- git与svn与github与码云的区别
1.git与github(https://www.oschina.net/)的区别 Git(https://git-scm.com/)是一个版本控制工具 github是一个用git做版本控制的项目托管 ...
- 使用eclipse的SVN连接码云
码云配置: 码云的项目上,启用SVN访问 eclipse的配置,不配置这个会报错
- 码云使用svn无法提交空文件夹
错误信息: svn: E200015: Commit failed (details follow): svn: E200015: Empty directories is not supported ...
- 码云分布式之 Brzo 服务器
摘要: 码云是国内最大的代码托管平台,为了支持更大的用户规模,开发团队也在对一些组件进行大规模的重构. 前言 码云是国内最大的代码托管平台.码云基于 Gitlab 5.5 开发,经过几年的开发已经和官 ...
- idea和Webstorm上使用git和github,码云
由于之前一直使用svn,现在项目使用git,顾根据网上找的学习资料,自己梳理了下,收获蛮多,这里做个记录,如果能帮助到您那是最好不过的. 1.大致步骤 使用工具:idea,github,码云 webs ...
- 代码管理必备-----git使用上传码云
作为一个程序员,你要学会代码的管理,这是一个最基本的修养,就像是一个剑客的剑谱,代码管理,目前流行的是svn和git,但是很不好的是git如果没有插件的话,很多人都不会用git bash 来实现自己的 ...
- 在码云(gitee)上展开程序类课程教学
码云主要提供了源代码管理(Git/SVN)功能,最近又推出了高校版让普通老师也能利用起来以供教学使用. 学生与老师不仅能利用其管理代码,更重要的是我们的程序教学能通过对git的使用来引入业界流行的软件 ...
随机推荐
- spark 运行问题记录
在CDH5.5.2上运行spark1.5的程序,运行起来就直接shutdown,并报出如下的异常: INFO YarnClientSchedulerBackend: SchedulerBackend ...
- Python 9X9乘法口诀表
#乘法口诀 for i in range(1,10): for j in range(1,i+1): print ( j,'*',i,'=',j*i,'',' ',end='') print(end= ...
- MongoDB的C#官方驱动InvalidOperationException异常的解决办法
异常情况描述 有一个“文章”类,其中包含一个“List<段落>”类型的属性,“段落”类是抽象类,其子类有“副标题段落”.“文本段落”.“图像段落”.“附件段落”.“列表段落”等类型. 将“ ...
- 第二章 git 工作区与reset,revert
1.Git工作区原理图 要清楚理解git reset的三个模式的区别,首先应该搞明白Git的各个工作区的划分. 工作区(working directory):在当前仓库中,新增,更改,删除文件这些动作 ...
- [ubuntu] adb devices出现no permissions
简书排版 http://www.jianshu.com/p/46e8848c6646 今天把一款测试的华为手机带回家,发现无法联机调试 笔者操作系统是 ubuntu 14.04 如果是windows找 ...
- 关于delphi点击webbrowser中任意一点的问题
关于delphi点击webbrowser中任意一点的问题 有时候我们需要delphi载入webbrowser1打开网页的时候 需要点击某一个点的位置 可能是坐标 可能是按钮 可能是其他的控件应该如何来 ...
- Maven pom.xml 配置说明: 打jar包不包括指定资源文件和.class xml,配置不跑testCase,建pom父子项目
**maven如何配置打jar包时,一些class 或者资源文件不打进来,把classpath的xml文件打进jar <build> <!--针对资源文件--> <res ...
- 122. Best Time to Buy and Sell Stock(二) leetcode解题笔记
122. Best Time to Buy and Sell Stock II Say you have an array for which the ith element is the price ...
- 父窗口,子窗口之间的JS"通信"方法
今天需要在iframe内做一个弹窗,但使用弹窗组件的为子窗口,所以弹窗只在子窗口中显示掩膜层和定位,这样不符合需求. 后来晓勇哥指点,了解到一个以前一直没关注到的东西,每个窗口的全局变量,其实都存在对 ...
- C# 将短时间格式变长正常时间格式
DateTime dateTimeStart = TimeZone.CurrentTimeZone.ToLocalTime(new DateTime(1970, 1, 1)); ...