Unity框架之状态机

1、vs 注解快捷键?

2、接口 方法、属性、字段?

3、生命周期(awake 、enable、start、update、fixedupdate、lateupdate、ongui)?

4、[HideInInspector]

第一步:IState 初步定义

 1 using UnityEngine;
 2 using System.Collections;
 3
 4 public interface IState{
 5     //获取状态机状态
 6     uint GetStateID();
 7
 8     //void OnEnter();
 9     //void OnLeave();
10     //等待补全
11     void OnEnter();
12     void OnLeave();
13
14     //Unity 生命周期
15     void OnUpdate();
16     void OnFixedUpdate();
17     void OnLateUpdate();
18 }

第二步:StateMachine 定义初步

 1 using UnityEngine;
 2 using System.Collections;
 3 using System.Collections.Generic;
 4
 5 public class StateMachine {
 6     //使用字典 存储状态
 7     private Dictionary<uint, IState> mDictionaryState;
 8     //当前状态
 9     private IState mCurrentState;
10
11     public StateMachine()
12     {
13         mDictionaryState = new Dictionary<uint, IState>();
14         mCurrentState = null;
15     }
16     //添加状态
17     public bool RegisterState(IState state)
18     {
19         if (state == null)
20         {
21             return false;
22         }
23         if (mDictionaryState.ContainsKey(state.GetStateID()))
24         {
25             return false;
26         }
27         mDictionaryState.Add(state.GetStateID(), state);
28         return true;
29     }
30     //获取状态
31     public IState GetState(uint stateID)
32     {
33         IState state = null;
34         mDictionaryState.TryGetValue(stateID, out state);
35         return state;
36     }
37     //停止状态
38     public void StopState(object param1, object param2)
39     {
40
41     }
42 }

第三步:补全 IState 替换掉步骤一中的两个函数

1     //等待补全
2     //预留两个参数备用
3     void OnEnter(StateMachine machine,IState preState,object param1,object param2);
4     void OnLeave(IState nextState,object param1,object param2);

第四步:继续完善StateMachine

  1 using UnityEngine;
  2 using System.Collections;
  3 using System.Collections.Generic;
  4
  5 public class StateMachine {
  6     //使用字典 存储状态
  7     private Dictionary<uint, IState> mDictionaryState;
  8     //当前状态
  9     private IState mCurrentState;
 10
 11     public uint CurrentStateID //获取当前状态机ID
 12     {
 13         get
 14         {
 15             return mCurrentState == null ? 0 : mCurrentState.GetStateID();
 16         }
 17     }
 18
 19     public IState CurrentState //获取当前状态机
 20     {
 21         get
 22         {
 23             return mCurrentState;
 24         }
 25     }
 26
 27     public StateMachine() // 构造函数初始化
 28     {
 29         mDictionaryState = new Dictionary<uint, IState>();
 30         mCurrentState = null;
 31     }
 32
 33     public bool RegisterState(IState state) //添加状态
 34     {
 35         if (state == null)
 36         {
 37             return false;
 38         }
 39         if (mDictionaryState.ContainsKey(state.GetStateID()))
 40         {
 41             return false;
 42         }
 43         mDictionaryState.Add(state.GetStateID(), state);
 44         return true;
 45     }
 46
 47     public IState GetState(uint stateID)//获取状态
 48     {
 49         IState state = null;
 50         mDictionaryState.TryGetValue(stateID, out state);
 51         return state;
 52     }
 53
 54     public void StopState(object param1, object param2)//停止状态
 55     {
 56         if (mCurrentState == null)
 57         {
 58             return;
 59         }
 60         mCurrentState.OnLeave(null, param1, param2);
 61         mCurrentState = null;
 62     }
 63
 64     public bool UnRegisterState(uint StateID)//取消状态注册
 65     {
 66         if (!mDictionaryState.ContainsKey(StateID))
 67         {
 68             return false;
 69         }
 70         if (mCurrentState != null && mCurrentState.GetStateID() == StateID)
 71         {
 72             return false;
 73         }
 74         mDictionaryState.Remove(StateID);
 75         return true;
 76     }
 77
 78     //切换状态
 79
 80     //切换状态的委托
 81     public delegate void BetweenSwitchState(IState from, IState to, object param1, object param2);
 82     //切换状态的回调
 83     public BetweenSwitchState BetweenSwitchStateCallBack = null;
 84     public bool SwitchState(uint newStateID, object param1, object param2)
 85     {
 86         //当前状态切当前状态 false
 87         if (mCurrentState != null && mCurrentState.GetStateID() == newStateID)
 88         {
 89             return false;
 90         }
 91         //切换到没有注册过的状态 false
 92         IState newState = null;
 93         mDictionaryState.TryGetValue(newStateID, out newState);
 94         if (newState == null)
 95         {
 96             return false;
 97         }
 98         // 退出当前状态
 99         if (mCurrentState != null)
100         {
101             mCurrentState.OnLeave(newState, param1, param2);
102         }
103
104         //状态切换间做的事
105         IState oldState = mCurrentState;
106         mCurrentState = newState;
107         if (BetweenSwitchStateCallBack != null)
108         {
109             BetweenSwitchStateCallBack(oldState, mCurrentState, param1, param2);
110         }
111         //进入新状态
112         newState.OnEnter(this, oldState, param1, param2);
113         return true;
114     }
115
116     public bool IsState(uint stateID)  //当前是否在某个状态
117     {
118         return mCurrentState == null ? false : mCurrentState.GetStateID() == stateID;
119     }
120     public void OnUpdate()
121     {
122         if (mCurrentState != null)
123         {
124             mCurrentState.OnUpdate();
125         }
126     }
127     public void OnFixedUpdate()
128     {
129         if (mCurrentState != null)
130         {
131             mCurrentState.OnFixedUpdate();
132         }
133     }
134     public void OnLateUpdate()
135     {
136         if (mCurrentState != null)
137         {
138             mCurrentState.OnLateUpdate();
139         }
140     }
141 }

第五步:使用状态机 Player(初步)

 1 using UnityEngine;
 2 using System.Collections;
 3
 4 public class Player : MonoBehaviour {
 5     [HideInInspector]
 6     public StateMachine PlayerStateMachine = new StateMachine();
 7     void Awake () {
 8     }
 9
10     void Update () {
11         PlayerStateMachine.OnUpdate();
12     }
13     void FixedUpdate()
14     {
15         PlayerStateMachine.OnFixedUpdate();
16     }
17     void LateUpdate()
18     {
19         PlayerStateMachine.OnLateUpdate();
20     }
21 }

第六步:定义两个状态 实现接口 IState,定义 枚举StateType

 1 using UnityEngine;
 2 using System.Collections;
 3
 4 public class LeftRightMove : IState {
 5     private Player player;
 6     public LeftRightMove(Player player)
 7     {
 8         this.player = player;
 9     }
10
11     public uint GetStateID()
12     {
13         return (uint)Player.StateType.LeftRight;
14     }
15
16     public void OnEnter(StateMachine machine, IState prevState, object param1, object param2)
17     {
18         if (prevState != null)
19         {
20             Debug.Log("LeftRightMove  OnEnter PrevState is :" + prevState.GetStateID());
21         }
22         else
23         {
24             Debug.Log("LeftRightMove  OnEnter");
25         }
26
27     }
28
29     public void OnLeave(IState nextState, object param1, object param2)
30     {
31         Debug.Log("LeftRightMove OnLeave NextState is : " + nextState.GetStateID());
32     }
33
34     private bool isLeft = true;
35     public void OnUpdate()
36     {
37         if (isLeft)
38         {
39             player.transform.position += new Vector3(-0.1f, 0.0f, 0.0f);
40             if (player.transform.position.x < -2f)
41             {
42                 isLeft = false;
43             }
44         }
45         else
46         {
47             player.transform.position += new Vector3(0.1f, 0.0f, 0.0f);
48             if (player.transform.position.x > 2f)
49             {
50                 isLeft = true;
51             }
52         }
53     }
54
55     public void OnFixedUpdate()
56     {
57     }
58
59     public void OnLateUpdate()
60     {
61     }
62 }
 1 using UnityEngine;
 2 using System.Collections;
 3
 4 public class Player : MonoBehaviour {
 5     [HideInInspector]
 6     public StateMachine PlayerStateMachine = new StateMachine();
 7     public enum StateType : uint
 8     {
 9         LeftRight = 0,
10         UpDown = 1
11     }
12     void Awake () {
13         PlayerStateMachine.RegisterState(new LeftRightMove(this));
14         PlayerStateMachine.RegisterState(new UpDownMove(this));
15     }
16     void OnGUI() {
17         if (GUI.Button(new Rect(0,0,200,50),"LeftRight"))
18         {
19             PlayerStateMachine.SwitchState((uint)StateType.LeftRight, null, null);
20         }
21         if (GUI.Button(new Rect(0,100,200,50),"UpDown"))
22         {
23             PlayerStateMachine.SwitchState((uint)StateType.UpDown, null, null);
24         }
25     }
26     void Update () {
27         PlayerStateMachine.OnUpdate();
28     }
29     void FixedUpdate()
30     {
31         PlayerStateMachine.OnFixedUpdate();
32     }
33     void LateUpdate()
34     {
35         PlayerStateMachine.OnLateUpdate();
36     }
37 }

Demo 见链接、使用Unity 4.6.9f1编译打包

链接:http://pan.baidu.com/s/1c03CQCo 密码:6pcp

时间: 2024-10-01 07:22:58

Unity框架之状态机的相关文章

深入理解IOC模式及Unity框架

学习IOC发现如下博客写的很清楚了,故Mark下来以便以后查阅和温习! 1.IoC模式:http://www.cnblogs.com/qqlin/archive/2012/10/09/2707075.html  这篇博客是通过一个播放器的例子来说明什么是依赖,依赖倒置,控制反转(IOC),最后实现依赖注入.通过Unity实现IOC容器.不错的一个例子 2.深入理解DIP.IoC.DI以及IoC容器 这个算是最通俗易懂的,手动实现了IOC容器  由浅入深 3.理解依赖注入(IOC)和学习Unity

Unity Animator动画状态机 深入理解(一)

接触Unity以来就已经有了Animator,Animation用的少,不过也大概理解他俩之间的一个区别于联系. 图中其实就是Animator和Animation之间的区别于联系了,啊!你肯定会告诉我这就不是Animator么. 对啊,Animator其实是由Animation组成的.比如在Animator没有出现的时候有些公司写的动画状态机其实就是代码版的Animator. Animator其实就是把Animation统一管理和逻辑状态管理的组件,而Animation就是每一个动画. 动画状态

[Solution] DI原理解析及Castle、Unity框架使用

DI介绍 控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题. 依赖注入(Dependency Injection,英文缩写为DI)是一种设计模式. 其实本质都是指同一件事,强调的内容不一样.IoC强调容器的作用,DI强调注入的作用. 通常IoC和DI可以理解为一个意思,只是指的对象不同. DI基本原理 DI本质上是通过容器来反射创建实例. 1个简单的类 1 2 3 4 5 6 7 class Person {     

Unity框架(代码结构)总结

作为一名开发人员,跟框架打交道是不可避免,比如C#有Ioc,Java有Spring,Hibernate,mybatis,structs2等等,但是Unity到现在却没有一个成熟的框架来供我们使用,所以我们只能最大限度地组织好我们的代码,以便于后期维护 1. 注释,SVN或者Git的log 2. 根据脚本功能写决定脚本模式,脚本的命名一定要通俗易懂 例如独立性功能的脚本(公用),写一个单独的脚本然后挂在对象上 还有一种是全局控制器,用单例模式,例如GameController和InputContr

IOC模式及Unity框架文章收藏

1.IoC模式:http://www.cnblogs.com/qqlin/archive/2012/10/09/2707075.html 通过Unity实现IOC容器. 2.深入理解DIP.IoC.DI以及IoC容器 3.理解依赖注入(IOC)和学习Unity 4.你真的了解Ioc与AOP吗? 5.[调侃]IOC前世今生 6.Unity系列 Unity(一):从ObjectBuilder说起 Unity(二):Unity是什么? Unity(三):快速入门 Unity(四):使用场景Ⅰ:建立类型

[Solution] AOP原理解析及Castle、Autofac、Unity框架使用

AOP介绍 面向切面编程(Aspect Oriented Programming,英文缩写为AOP),通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. AOP是OOP的延续,是软件开发中的一个热点. 常用于: Authentication Caching Lazy loading Transactions AOP基本原理 普通类 1 2 3 4 5 6 7 8 9 class Person : MarshalByRefObject {     public string Say(

基于xlua和mvvm的unity框架

1.框架简介 这两天在Github上发现了xlua的作者车雄生前辈开源的一个框架—XUUI,于是下载下来学习了一下.XUUI基于xlua,又借鉴了mvvm的设计概念.xlua是目前很火的unity热更方案,不仅支持纯lua脚本热更,也可以做 C# 代码的bug hotfix,而mvvm框架呢,在前端开发中应用很广,我周围同事在做wpf开发时也用到了mvvm框架,mvvm模式在unity开发中也同样适用,github上可以找到不少开源案例.XUUI主要有两大核心能力:一是支持MVVM的单向.双向绑

Unity框架:StrangeIOC+ToLua整合笔记(一)

1.整合的缘由?之前用的框架?缺点? 2.StrangeIOC是什么? https://github.com/strangeioc/strangeioc 3.ToLua是什么? https://github.com/topameng/tolua 4.开始整合 https://github.com/jarjin/LuaFramework_UGUI 参考了上面这个框架,我是取其精华,去其糟粕(个人认为). 4.1游戏自然有很多Manager,StrangeIOC中是如何使用的? 继承Monobeha

Unity 框架(一)

当项目需求中,后期可能接入多种输入设备的时候,可以借鉴一下以下代码 1 using System.Collections; 2 using System.Collections.Generic; 3 using UnityEngine; 4 using System; 5 6 public abstract class TInputBase : MonoBehaviour{ 7 8 public event InputSchemeEventHandler InputSchemeEvent; 9