您的位置:首页 > 移动开发 > Unity3D

【Unity3d】为Unity添加游戏状态管理GameStatus

2015-05-06 11:21 465 查看
1 状态接口 每个状态的基类 这里要注意C#的abstract和C++中的virtual的区别 网上讲解的很多



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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: