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

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中的方法  形如

 public class MenuStatus : Status 
{
////////////////////////////////////////////////////////////
public override void OnCreate()
{
Debug.Log("Im MenuStatus");
}

public override void OnExecute()
{
ClientCore.GetInstance.ChangeStatus(typeof(GameStatus));
}

public override void OnExit()
{
}
}

 

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;

 private Status m_CurrentState;

public static ClientCore GetInstance
{
get
{
return m_Instance;
}
}

 


更改状态的实现   很简单  当前状态结束   下一状态开始

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();
}

 

简单的测试效果:

posted @ 2012-04-17 17:14  渡蓝  阅读(780)  评论(0编辑  收藏  举报