最近刚找到在实习,忙于公司一个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. JS产生随机一注彩票

    <!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8&qu ...

  2. ThinkPad L440 FN键设置

    刚入手了ThinkPad L440,用起来相当不错,嘿嘿! L440系统默认(F1-F12)键盘为系统默认功能键,主要控制音量.亮度.连接投影仪等. 因为编写程序需要调试,经常用到F10,F11等键, ...

  3. js正则获取图片的src属性及正则分割一个字符串

    try{     var str='<P>xczxzxzxcxcxc<IMG src="http://file.ynet.com/2/1612/12/12119048.jp ...

  4. WCF账户密码认证

    记录一下我实现WCF用户认证与权限控制的实现方法, 也让其他网友少走一些弯路. 内容写得非常小白(因为我也是小白嘛), 比较详细, 方便WCF知识基础薄的朋友 主要分为下面几个步骤 作为例子, 创建最 ...

  5. iava多线程详解(2)-成员变量与局部变量访问

    有两段代码 1.线程访问成员变量 public class FirstThreadTest { public static void main(String[] args) { FirstThread ...

  6. 初窥Kaggle竞赛

    初窥Kaggle竞赛 原文地址: https://www.dataquest.io/mission/74/getting-started-with-kaggle 1: Kaggle竞赛 我们接下来将要 ...

  7. IntelliJ IDEA 2016.2激活方法

    IntelliJ IDEA 2016.2激活 激活码 43B4A73YYJ-> eyJsaWNlbnNlSWQiOiI0M0I0QTczWVlKIiwibGljZW5zZWVOYW1lIjoib ...

  8. Paxos算法分析

    作者:吴香伟 发表于 2014/09/30 版权声明:可以任意转载,转载时务必以超链接形式标明文章原始出处和作者信息以及版权声明 一致性问题 如上图所示,服务器Ai(i=1,2,..5)组成存储集群, ...

  9. Web页面报错: Eval()、XPath() 和 Bind() 这类数据绑定方法只能在上下文中使用

    可以使用string.formt来避免出错. 如: <%# Convert.ToInt32(DataBinder.Eval(Container.DataItem, "Status&qu ...

  10. 将List转换为二维数组(result)

    result的数据结构为List<Map<String,Object>> //将List转换为二维数组String[][] String[][] z = new String[ ...