最近刚找到在实习,忙于公司一个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. ABAP 字符串操作

    1).SHIFT:截断字符串 SHIFT {c} [BY {n} PLACES] [{mode}].: 作用:去掉字符串的前n个位置的字符,如果n未指定,默认为1,如果指定的n小于等于0,则字符串不变 ...

  2. github简单使用教程

    github是一个基于git的代码托管平台,付费用户可以建私人仓库,我们一般的免费用户只能使用公共仓库,也就是代码要公开.对于一般人来说公共仓库就已经足够了,而且我们也没多少代码来管理,O(∩_∩)O ...

  3. RHEL7.2

    在RHEL7.2中,通过以下命令设置开机进入图形界面或者命令行界面: systemctl set-default graphical.target #设置开机默认进入图形界面 systemctl se ...

  4. 121. Best Time to Buy and Sell Stock (一) leetcode解题笔记

    121. Best Time to Buy and Sell Stock Say you have an array for which the ith element is the price of ...

  5. PMI列子1

    遍历得到PMI中,是注释类型的,你可以参考一下.int num_text, thetype, thesubtype;tag_t  draft_aid_tag = NULL_TAG;UF_UI_open ...

  6. 两表(多表)关联update的写法

    SQL Server示例: update a set a.gqdltks=b.gqdltks,a.bztks=b.bztks from landleveldata a,gdqlpj b where a ...

  7. mysql:添加索引

    ALTER TABLE tb_user_type ADD INDEX user_type_index3 (report_type_id) ALTER TABLE tb_user_type ADD IN ...

  8. android图片的scaleType属性

    scaleType 保持图片原有大小 scaleType="fitXY"填满盒子 scaleType="fitStart"保持纵横比缩放放在左上角 scaleT ...

  9. LeetCode(124) Binary Tree Maximum Path Sum

    题目 Given a binary tree, find the maximum path sum. For this problem, a path is defined as any sequen ...

  10. 封装ios静态库碰到的一些问题(二)

    在静态库建立好了之后呢,于是应用程序就引用它,加上拷贝的h文件,但是引用之后Build之后提示很多sybmbol 重复 于是进行检查,确实由于是从其他工程修改过来的,很多基础库都引用了,删除之,最后就 ...