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> 是泛型的状态类,包含了状态和三个事件,分别为第一次进入,一直执行,退出

 1 public class MyFSMTranslation<T>
 2 {
 3     public MyState<T> fromState;
 4     /// <summary>
 5     /// 转换状态的名字
 6     /// </summary>
 7     public string name;
 8     public MyState<T> toState;
 9
10     /// <summary>
11     /// 状态跳转
12     /// </summary>
13     /// <param name="fromState"> 当前状态</param>
14     /// <param name="name"> 状态跳转的名字</param>
15     /// <param name="toState"> 下一个要进入的状态</param>
16     public MyFSMTranslation(MyState<T> fromState, MyState<T> toState, string name = null)
17     {
18         fromState = fromState;
19         toState = toState;
20         name = name;
21     }
22 }

这是一个状态跳转类注释很详细就不解释了

重点到了

  1 public class FSMS<T>
  2 {
  3
  4     private T myFsmType;
  5     public T FsmType
  6     {
  7         get
  8         {
  9             return myFsmType;
 10         }
 11
 12     }
 13
 14     public string StateName
 15     {
 16         get
 17         {
 18             return StateDict[myFsmType].name;
 19         }
 20     }
 21
 22
 23     // 状态存贮
 24     Dictionary<T, MyState<T>> StateDict = new Dictionary<T, MyState<T>>();
 25
 26
 27     /// <summary>
 28     /// 添加状态
 29     /// </summary>
 30     /// <param name="state">State.</param>
 31     public void AddState(T stateType,string name,MyState<T> State)
 32     {
 33         StateDict[stateType] = State;
 34     }
 35
 36
 37     /// <summary>
 38     /// 添加跳转
 39     /// </summary>
 40     public void AddTranslation(T fromState, MyState<T> toState,string name)
 41     {
 42         StateDict[fromState].TranslationDict[fromState] = new MyFSMTranslation<T>(StateDict[fromState], toState,name);
 43     }
 44
 45     public void AddTranslation(T fromState, MyState<T> toState)
 46     {
 47         StateDict[fromState].TranslationDict[fromState] = new MyFSMTranslation<T>(StateDict[fromState], toState);
 48     }
 49
 50
 51
 52     public bool Translate(T nextType)
 53     {
 54         MyState<T> nextstate;
 55         if (StateDict.ContainsKey(nextType))
 56         {
 57             nextstate = StateDict[nextType];
 58         }
 59         else
 60         {
 61             return false;
 62         }
 63         if (StateDict[myFsmType].TranslationDict.ContainsKey(nextType))
 64         {
 65
 66             //当期状态转换之后执行的函数
 67             //当期状态转换
 68             //下一个状态需要执行的函数
 69             //改变类里面的状态
 70             StateDict[myFsmType].DoBeforeLeave();
 71             myFsmType = nextType;
 72             nextstate.DoBeforeEntery();
 73
 74         }
 75         else
 76         {
 77             return false;
 78         }
 79
 80         return true;
 81     }
 82
 83     /// <summary>
 84     /// 执行当前状态的方法
 85     /// </summary>
 86     public void Carry()
 87     {
 88         MyState<T> nextstate = StateDict[myFsmType];
 89         nextstate.DoAct();
 90     }
 91
 92
 93     /// <summary>
 94     /// 启动状态机
 95     /// </summary>
 96     public void Start(T fsmtype)
 97     {
 98         myFsmType = fsmtype;
 99     }
100
101     /// <summary>
102     /// 清空状态机
103     /// </summary>
104     public void Clear()
105     {
106         StateDict.Clear();
107     }
108
109 }

上面都有注释,就不在解释了,大家感觉有不对的地方欢迎指出

时间: 2024-10-10 04:45:10

unity 状态机 + svn + 码云 上篇的相关文章

UNITY 状态机 + SVN + 码云 下篇

上篇说到自己写的一个FSM状态机,这篇写怎么把代码和码云联系在一起! 首先,我们应该知道为什么使用码云? 码云是开源中国社区2013年推出的基于 Git 的完全免费的代码托管服务,这个服务是基于 Gitlab 开源软件所开发的,我们在 Gitlab 的基础上做了大量的改进和定制开发,目前已经成为国内最大的代码托管系统,致力于为国内开发者提供优质稳定的托管服务. 码云除了提供最基础的 Git 代码托管之外,还提供代码在线查看.历史版本查看.Fork.Pull Request.打包下载任意版本.Is

git与svn与github与码云的区别

1.git与github(https://www.oschina.net/)的区别 Git(https://git-scm.com/)是一个版本控制工具 github是一个用git做版本控制的项目托管平台. 2.码云(http://git.oschina.net/)简介 码云是开源中国社区2013年推出的基于 Git 的完全免费的代码托管服务,这个服务是基于 Gitlab 开源软件所开发的,我们在 Gitlab 的基础上做了大量的改进和定制开发,目前已经成为国内最大的代码托管系统,致力于为国内开

安装git连接码云,云svn

1.下载githttps://blog.csdn.net/ai1362425349/article/details/82119889 2.安装目录不能有中文,就放c盘吧 3.创建git的存储目录,E:\gitHome 4.生产密钥的的命令行:ssh-keygen -t rsa -C "[email protected]" 5.查看密钥cat ~/.ssh/id_rsa.pub也可以打开C:\Users\Administrator.SC-201605302031\.ssh\id_rsa.

Eclipse连接码云SVN

Eclipse连接码云的SVN需要修改Eclipse中的SVN接口,打开Team -- > SVN,修改右边的SVN接口为下图即可 原文地址:https://blog.51cto.com/1197822/2461269

Myeclipse10.7安装git插件并将Java项目上传到码云(github)

注:本文来源:外匹夫的<Myeclipse10.7安装git插件并将Java项目上传到码云(github)> 一.先说说安装egit插件的步骤(安装egit不成功的原因主要是下载的egit版本不适合当前使用的Myeclipse版本). 通过上网搜索安装eclipse插件主要有以下三种方式: 第一种方式: 对于不同版本的eclipse和myeclipse可能有所不同,主要是有以下两种情况: 1. EGit插件地址:http://download.eclipse.org/egit/updates

代码管理必备-----git使用上传码云

作为一个程序员,你要学会代码的管理,这是一个最基本的修养,就像是一个剑客的剑谱,代码管理,目前流行的是svn和git,但是很不好的是git如果没有插件的话,很多人都不会用git bash 来实现自己的代码管理,自己不断尝试,今天终于总结出一个很好的方法,供各位剑客参考一下,望尔等使用后,脱离天天来回背电脑的苦逼命运. 1.下载git 这里大家要注意下系统的配置: windows看这里:windows的git下载地址 2.安装git 自己选择安装路径或者默认就可以了 3.配置git 给github

Linux、Debian、Jenkins、GIT、Nginx、码云安装,自动化部署前后端分离项目

1.安装Jenkins i:下载Jenkins安装包(war文件):https://jenkins.io/download/ ii:这里采用Tomcat的war包方式安装,讲下载好的安装包放到Tomcat的webapps目录中 iii:启动Tomcat 如遇到报错:AWT is not properly configured on this server. Perhaps you need to run your container with "-Djava.awt.headless=true&

Django项目: 项目环境搭建 ---- 三、在码云平台创建项目&amp;推送到码云上

三.在码云平台创建项目 git服务平台: 主要使用github(最主流) 国内访问速度慢 托管私有项目收费 国内一般使用码云gitee 国内访问速度快 托管私有项目免费(限制开发人数) 公司中使用gitlab或者svn来搭建 创建步骤 1.注册码云账号注册 2.创建仓库 登录码云后,通过网站右上角的「+」号,选择「新建仓库」,进入新建仓库页面 2.填写仓库信息 3.点击「创建」,即可在码云上创建你的第一个仓库. 3.生成ssh公钥 ssh-keygen -t rsa -C '[email pro

git 码云

版本控制器 """ 完成 协同开发 项目,帮助程序员整合代码 i)帮助开发者合并开发的代码 ii)如果出现冲突代码的合并,会提示后提交合并代码的开发者,让其解决冲突 软件:SVN . GIT(都是同一个人的个人项目) github.gitee(两个采用git版本控制器管理代码的公共平台) git:集群化.多分支 """ git 简介 """ 什么是git:版本控制器 - 控制的对象是开发的项目代码 代码开发时间轴:需