调用:
public class GameLoop : MonoBehaviour
{
private SceneStateController controller = null;
void Awake()
{
DontDestroyOnLoad(this.gameObject);
}
void Start()
{
controller = new SceneStateController();
controller.SetSceneState(new StartState(controller), false);
}
void Update()
{
controller.StateUpdate();
}
}
SceneStateController:
public class SceneStateController
{
private AsyncOperation mAO = null;
private bool isRunStart = false;
// 该SceneStateController所拥有的SceneSatte
private ISceneState mSceneState;
public void SetSceneState(ISceneState sceneState, bool isLoadScene = true)
{
if (mSceneState != null)
{
mSceneState.StateEnd();
}
this.mSceneState = sceneState;
if (isLoadScene == false)
{
isRunStart = false;
mSceneState.StateStart();
}
else
{
mAO = SceneManager.LoadSceneAsync(mSceneState.MSceneName);
isRunStart = true;
}
}
public void StateUpdate()
{
if (mAO != null && mAO.isDone == false) return;
if (isRunStart == true && mAO != null && mAO.isDone == true)
{
mSceneState.StateStart();
isRunStart = false;
}
if (mSceneState != null)
{
mSceneState.StateUpdate();
}
}
}
ISceneState:
public class ISceneState
{
// 该SceneState所属于的SceneStateController
protected SceneStateController mController;
private string mSceneName;
public string MSceneName
{
get { return mSceneName; }
}
public ISceneState(string sceneName, SceneStateController controller)
{
this.mSceneName = sceneName;
this.mController = controller;
}
public virtual void StateStart() { }
public virtual void StateUpdate() { }
public virtual void StateEnd() { }
}
StartState:
public class StartState : ISceneState
{
private Image mLogo;
private float mSmoothTime = 0.008f;
private float mWaitTime = 2;
public override void StateStart()
{
mLogo = GameObject.Find("Logo").GetComponent<Image>();
mLogo.color = Color.black;
}
public override void StateUpdate()
{
mLogo.color = Color.Lerp(mLogo.color, Color.white, mSmoothTime);
mWaitTime -= Time.deltaTime;
if (mWaitTime < 0)
{
mController.SetSceneState(new MainMenuState(mController), true);
}
}
public StartState(SceneStateController controller)
: base("01StartScene", controller)
{ }
}
MainMenuState:
public class MainMenuState : ISceneState
{
public MainMenuState(SceneStateController controller)
: base("02MainMenuScene", controller)
{ }
public override void StateStart()
{
GameObject.Find("Button").GetComponent<Button>().onClick.AddListener(OnStartButonClick);
}
private void OnStartButonClick()
{
mController.SetSceneState(new BattleState(mController));
}
}
BattleState:
public class BattleState : ISceneState
{
public BattleState(SceneStateController controller)
: base("03BattleScene", controller)
{ }
}