【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();
}
简单的测试效果: