【Unity3d】为Unity添加游戏状态管理GameStatus
2015-05-06 11:21
465 查看
1 状态接口 每个状态的基类 这里要注意C#的abstract和C++中的virtual的区别 网上讲解的很多
2 各个状态类 由于继承了Status 因此需要实现Status中的方法 形如
3 状态的管理 实际上这里只是各个状态的填充 方便核心代码去操作
4 核心代码中的使用 定义一个Status的对象 由于这里更改状态方法ChangeStatus是放在核心代码中实现 因此核心代码为各个状态提供一个唯一实例singleton
别忘了在Awake()函数中为m_Instance赋值 m_Instance = this;
更改状态的实现 很简单 当前状态结束 下一状态开始
在即将开始主循环的时候要激活第一个状态 当然 也可以激活第二个状态 (有人问:那就不能激活第三个状态吗? 。。。可以的 ) 这里要注意参数类型
接着 在主循环中让当前状态执行就可以了
简单的测试效果:
from:http://www.cnblogs.com/dosomething/archive/2011/11/17/2253330.html
public abstract class Status : MonoBehaviour { public abstract void OnCreate(); public abstract void OnExecute(); public abstract void OnExit(); }
2 各个状态类 由于继承了Status 因此需要实现Status中的方法 形如
1 public class MenuStatus : Status 2 { 3 //////////////////////////////////////////////////////////// 4 public override void OnCreate() 5 { 6 Debug.Log("Im MenuStatus"); 7 } 8 9 public override void OnExecute() 10 { 11 ClientCore.GetInstance.ChangeStatus(typeof(GameStatus)); 12 } 13 14 public override void OnExit() 15 { 16 } 17 }
3 状态的管理 实际上这里只是各个状态的填充 方便核心代码去操作
1 [RequireComponent(typeof(IntroStatus))] 2 [RequireComponent(typeof(LoginStatus))] 3 [RequireComponent(typeof(MenuStatus))] 4 [RequireComponent(typeof(LoadingStatus))] 5 [RequireComponent(typeof(GameStatus))] 6 public class StatusManager : MonoBehaviour 7 { 8 //////////////////////////////////////////////////////////// 9 private static IntroStatus m_IntroStatus; 10 private static LoginStatus m_LoginState; 11 private static MenuStatus m_MenuStatus; 12 private static LoadingStatus m_LoadingStatus; 13 private static GameStatus m_GameStatus; 14 //////////////////////////////////////////////////////////// 15 public IntroStatus GetIntroStatus 16 { 17 get 18 { 19 return m_IntroStatus; 20 } 21 } 22 public LoginStatus GetLoginStatus 23 { 24 get 25 { 26 return m_LoginState; 27 } 28 } 29 public MenuStatus GetMenuStatus 30 { 31 get 32 { 33 return m_MenuStatus; 34 } 35 } 36 public LoadingStatus GetLoadingStatus 37 { 38 get 39 { 40 return m_LoadingStatus; 41 } 42 } 43 public GameStatus GetGameStatus 44 { 45 get 46 { 47 return m_GameStatus; 48 } 49 } 50 51 void Awake () 52 { 53 m_IntroStatus = GetComponent<IntroStatus>(); 54 m_LoginState = GetComponent<LoginStatus>(); 55 m_MenuStatus = GetComponent<MenuStatus>(); 56 m_LoadingStatus = GetComponent<LoadingStatus>(); 57 m_GameStatus = GetComponent<GameStatus>(); 58 59 DontDestroyOnLoad(gameObject); 60 } 61 }
4 核心代码中的使用 定义一个Status的对象 由于这里更改状态方法ChangeStatus是放在核心代码中实现 因此核心代码为各个状态提供一个唯一实例singleton
别忘了在Awake()函数中为m_Instance赋值 m_Instance = this;
1 private Status m_CurrentState; 2 3 public static ClientCore GetInstance 4 { 5 get 6 { 7 return m_Instance; 8 } 9 }
更改状态的实现 很简单 当前状态结束 下一状态开始
1 public void ChangeStatus(System.Type newStatus) 2 { 3 if (null != m_CurrentState) 4 m_CurrentState.OnExit(); 5 6 m_CurrentState = GetComponentInChildren(newStatus) as Status; 7 if (null != m_CurrentState) 8 m_CurrentState.OnCreate(); 9 }
在即将开始主循环的时候要激活第一个状态 当然 也可以激活第二个状态 (有人问:那就不能激活第三个状态吗? 。。。可以的 ) 这里要注意参数类型
ChangeStatus(typeof(IntroStatus));
接着 在主循环中让当前状态执行就可以了
void Update () { if (null != m_CurrentState) m_CurrentState.OnExecute(); }
简单的测试效果:
from:http://www.cnblogs.com/dosomething/archive/2011/11/17/2253330.html
相关文章推荐
- 【unity】RPG游戏鼠标指针管理系统【单利模式】(游戏中,不同状态对于不同指针)
- unity3D游戏开发二之unity编辑器一
- unity3D -- 给游戏体添加组件
- 状态添加Android游戏开发十日通(4)-行走,跳跃,碰撞检测
- 浅析游戏引擎的资源管理机制——扒一扒Unity3D中隐藏在背后的资源管理
- unity3D游戏开发二之unity编辑器一
- 如何添加AdMob广告到现有的Unity3D ios游戏
- 游戏状态管理之C++实现
- Unity-BattleStar丨5.给BattleStar游戏添加UI
- unity3d 给游戏添加音源 Unity3d adds a sound source to the game
- Unity3D游戏开发框架-创建txt文件,管理prefab路径
- [Unity3D ARPG网络游戏编程实践] 网络连接 :unity NetWork与socket的对比(一)
- 【Unity】const管理游戏标签
- 【Unity3d游戏开发】Unity中的Time.timeScale
- Blend ---- 给Button添加自定义状态模板(视觉状态管理)
- 游戏状态自动管理框架 BOARDGAME.IO
- Unity 2D游戏开发教程之游戏中精灵的跳跃状态
- 如何添加AdMob广告到现有的Unity3D ios游戏
- 京城游戏人-Day14: Unity 中为 Sprite 添加点击事件
- UNITY3D对象之间实现消息通信管理[源码转载自unity wiki]