Unity3D-FSM有限状态机的简单设计
2014-06-14 17:23
357 查看
在之前的文章里介绍了一个基础U3D状态机框架 (Unity3D游戏开发之状态流框架) 即大Switch的枚举状态控制。这种方法虽然容易理解,编程方法也相对简单,但是弊端是当状态变得复杂之后,或需要添加一种新的状态时,会显得非常混乱并且难以下手。故我们需要引进一种更高级的状态机技术来避免这些问题。网上有一些讲述U3D-FSM状态机的文章,但都不针对基础讲解,而且大多带有冗余的与状态机不相关的代码,基础不好的读者容易看不清FSM状态机的核心所在。这里针对网上的一些文章和代码做了一个整理,意图使之简单易懂。
这里关于FSM有限状态机这类名词的解释这里就不再说明了,感兴趣的朋友可以自己去百度下,本文只说重点。
首先是状态机基类State.cs
这里关于FSM有限状态机这类名词的解释这里就不再说明了,感兴趣的朋友可以自己去百度下,本文只说重点。
首先是状态机基类State.cs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | /** * 状态基类 */ public class State[entity_type> { public entity_type Target; //Enter state public virtual void Enter (entity_type entityType) { } //Execute state public virtual void Execute (entity_type entityType) { } //Exit state public virtual void Exit (entity_type entityType) { } } 基类之所以设计成含有3个小的状态方法是因为,通常在游戏中有些行为都只是在进入或退出某个状态时出现的,并不会发生在通常的更新步骤中。这样设计就可以有效的将持续性调用语句和一次性调用语句有效的区分开来。(举例:发送技能时的特效,有些是持续性而有些又是一次性的) 接下来我们编写状态机代码,来使直接的这个基类的各个方法运作起来: using UnityEngine; using System.Collections; public class StateMachine[entity_type> { private entity_type m_pOwner; private State[entity_type> m_pCurrentState;//当前状态 private State[entity_type> m_pPreviousState;//上一个状态 private State[entity_type> m_pGlobalState;//全局状态 /*状态机构造函数*/ public StateMachine (entity_type owner) { m_pOwner = owner; m_pCurrentState = null; m_pPreviousState = null; m_pGlobalState = null; } /*进入全局状态*/ public void GlobalStateEnter() { m_pGlobalState.Enter(m_pOwner); } /*设置全局状态*/ public void SetGlobalStateState(State[entity_type> GlobalState) { m_pGlobalState = GlobalState; m_pGlobalState.Target = m_pOwner; m_pGlobalState.Enter(m_pOwner); } /*设置当前状态*/ public void SetCurrentState(State[entity_type> CurrentState) { m_pCurrentState = CurrentState; m_pCurrentState.Target = m_pOwner; m_pCurrentState.Enter(m_pOwner); } /*Update*/ public void SMUpdate () { if (m_pGlobalState != null) m_pGlobalState.Execute (m_pOwner); if (m_pCurrentState != null) m_pCurrentState.Execute (m_pOwner); } /*状态改变*/ public void ChangeState (State[entity_type> pNewState) { if (pNewState == null) { Debug.LogError ("can't find this state"); } //触发退出状态调用Exit方法 m_pCurrentState.Exit(m_pOwner); //保存上一个状态 m_pPreviousState = m_pCurrentState; //设置新状态为当前状态 m_pCurrentState = pNewState; m_pCurrentState.Target = m_pOwner; //进入当前状态调用Enter方法 m_pCurrentState.Enter (m_pOwner); } public void RevertToPreviousState () { //切换到前一个状态 ChangeState (m_pPreviousState); } public State[entity_type> CurrentState () { //返回当前状态 return m_pCurrentState; } public State[entity_type> GlobalState () { //返回全局状态 return m_pGlobalState; } public State[entity_type> PreviousState () { //返回前一个状态 return m_pPreviousState; } } 这个状态机其实还不是最简的,全局和上一个状态的相关部分都可以去掉,但同时功能上就会被削减,故这里将其保留。 现在状态基类和状态机类都有了,我们可以开始编写游戏对象的独立状态类,先编写游戏的总流程状态类,这里命名为MainState.cs
|
相关文章推荐
- Unity3D-FSM有限状态机的简单设计
- Unity3D架构系列之- FSM有限状态机设计(四)
- Unity3D架构系列之- FSM有限状态机设计四
- U3D-FSM有限状态机的简单设计
- Unity3D架构系列之FSM有限状态机设计(五)
- Unity3D架构系列之- FSM有限状态机设计一
- Unity3D架构系列之- FSM有限状态机设计六(总结)
- Unity3D架构系列之- FSM有限状态机设计(二)
- Unity3D架构系列之- FSM有限状态机设计二
- Unity3D架构系列之- FSM有限状态机设计一
- 设计模式_实现简单的有限状态机(FSM)
- Unity3D架构系列之- FSM有限状态机设计五
- Unity3D架构系列之- FSM有限状态机设计(六)(总结篇)
- Unity3D架构系列之- FSM有限状态机设计(三)
- Unity3D架构系列之-FSM有限状态机设计(一)
- 有限状态机(FSM)的设计与实现(二)
- 一个简单确有用的有限状态机(FSM) in c++
- 基于unity3d(C#)的有限状态机设计
- 基于unity3d(C#)的有限状态机设计(二)
- akka actor中FSM有限状态机的设计原则