最近由于工作原因 一直在研究Unity引擎 唯一感觉不舒服的就是ShaderLab 可能也是磨合的时间不够吧 总觉得写起来别扭
废话不多说 为游戏添加GameStatus 方便游戏各个状态的管理 大致思路和我的毕业设计差不多 只是换作C#在Unity中实现了而已
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(); }
简单的测试效果: