using System.Collections; using System.Collections.Generic; using UnityEngine; /// <summary> /// 场景状态 /// </summary> public class ISceneState { //状态名称 private string m_StateName = "ISceneState"; public string StateName { get { return m_StateName; } set { m_StateName = value; } } protected SceneStateController m_Controller = null; public ISceneState(SceneStateController Controller) { m_Controller = Controller; } //开始 public virtual void StateBegin() { } //结束 public virtual void StateEnd() { } //更新 public virtual void StateUpdate() { } public override string ToString() { return string.Format("ISceneState:{0}", StateName); } }
using UnityEngine; using System.Collections; using UnityEngine.SceneManagement; /// <summary> /// 场景状态控制者 /// </summary> public class SceneStateController { private ISceneState m_State; private bool m_bRunBegin = false; public SceneStateController() { } //设定状态 public void SetState(ISceneState State, string LoadSceneName) { m_bRunBegin = false; //载入场景 LoadScene(LoadSceneName); //通知前一个状态结束 if (m_State != null) m_State.StateEnd(); //设定 m_State = State; } /// <summary> /// 载入场景 /// </summary> /// <param name="LoadScenename"></param> public void LoadScene(string LoadSceneName) { if (LoadSceneName == null || LoadSceneName.Length == 0) return; SceneManager.LoadScene(LoadSceneName); } /// <summary> /// 更新 /// </summary> public void StateUpdate() { //是否还在载入 if (Application.isLoadingLevel) return; //通知新的状态开始 if(m_State!=null&&m_bRunBegin == false) { m_State.StateBegin(); m_bRunBegin = true; } if (m_State != null) m_State.StateUpdate(); } }
using UnityEngine; using System.Collections; /// <summary> /// 游戏管理 /// </summary> public class GameLoop : MonoBehaviour { //场景状态 public SceneStateController m_SceneStateController = new SceneStateController(); public static GameLoop instance; public static int selectQiuNum; void Awake() { selectQiuNum = 0; instance = this; DontDestroyOnLoad(this.gameObject); Screen.sleepTimeout = SleepTimeout.NeverSleep; // 防止屏幕睡眠 Application.targetFrameRate = 60; } void Start() { WindowManager.instance.Initialize(); //初始化界面 WindowManager.instance.Open<LogoWnd>().Initialize(); TimerManager.instance.Invoke(1.5f, () => { m_SceneStateController.SetState(new StartState(m_SceneStateController), ""); }); } float dt; void Update() { dt = Time.deltaTime; TimerManager.instance.Update(dt); WindowManager.instance.Update(dt); m_SceneStateController.StateUpdate(); //if (Input.GetKey(KeyCode.Escape)) // Application.Quit(); } }
using System; using System.Collections.Generic; using System.Linq; using System.Text; public class LevelBattleState : ISceneState { public LevelBattleState(SceneStateController Controller) : base(Controller) { StateName = "LevelBattleState"; } public override void StateBegin() { WindowManager.instance.Close<SelectLevelWnd>(); TimerManager.instance.Invoke(2f, () => { RollController.instance.isStart = true; }); WindowManager.instance.Open<LevelWnd>().Initialize(); } public override void StateUpdate() { if (RollController.instance.isAgain) { m_Controller.SetState(new MainState(m_Controller), "Main"); } } public override void StateEnd() { WindowManager.instance.Close<LevelSuccessWnd>(); TimerManager.instance.Clear(); PoolManager.instance.Clear(); } public void SetStartState() { m_Controller.SetState(new MainState(m_Controller), "Main"); } }
m_SceneStateController.SetState(new StartState(m_SceneStateController), "");
New 一个就行了