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的使用来引入业界流行的软件 ...
随机推荐
- gulp LiveReload middleware
用yo搭建的angular项目,用gulp自动化构建. 自动化构建主要的功能大致有: 1. 文件压缩 2. 文件重命名 3. 文件合并 4. css,js文件自动引入到html 5. 自动刷新 ... ...
- angular报$injector / unpr的错误
原因:angular引用未定义的错误,因为JS代码压缩过后找不到申明的变量,,没在使用之前定义,且代码被压缩,则报错(变量压缩后会变成单个字母无法识别,需在引用前分别定义): 解决:angular.m ...
- 关于meta标签
一.Meta标签中的format-detection属性及含义 意为:格式检测 或许你会有这样的经历:当你在制作手机端的页面中,点击了没有加任何链接的格式的数字时,这时手机会进行自动拔号提示操作! 禁 ...
- rpm常用命令
* 手动安装 rpm 包 `rpm-ivh xxxxx.rpm` 参数: --force 即使覆盖其他包的文件也没强迫安装 --nodeps 即使依赖包没安装,也被强制安装 * 查看 rp ...
- Android之ImageSwitcher
要点: (查看Api总结) 1:ImageSwitcher 继承 ViewSwitcher, (ViewSwitcher 有继承FrameLayout ) 2: 要实现切图必须实现 ViewSwitc ...
- ncurses-devel
:Install ncurses(ncurses-devel) and try again. 做一个简单的铺垫,ncurses是字符终端下屏幕控制的基本库.可能很多新开发的程序已经不再使用.假如要编译 ...
- c# - catch(Exception ex) 会丢掉StackTrace 是怎么回事?
原本这篇文章就想写写StackTrace怎么会丢的问题, 但现在的内容变成了讨论怎么处理Exception的问题. 该不该用try catch, 什么时候用?也困扰了我很久, 好像随便写写就可以, 但 ...
- 移动端HTML5<video>视频播放优化实践[转]
http://blog.csdn.net/u010918416/article/details/52705732 http://www.xuanfengge.com/html5-video-play. ...
- 用datagrid实现完整的一个页面
打怪升级真的好难,记录一点一滴,一滴一点,先上效果图. 1.想完成一个界面,先得有界面.界面是在WebRoot下的根目录文件中新建的zjqktj.jsp中建立的,再通过java在后台调用数据库取出数据 ...
- Python html.parser库学习小结
分类路径:/Datazen/DataMining/Crawler/ 前段时间,一朋友让我做个小脚本,抓一下某C2C商城上竞争对手的销售/价格数据,好让他可以实时调整自己的营销策略.自己之前也有过写 ...