设计模式之状态模式

来源:互联网 发布:亚马逊云计算业务 编辑:程序博客网 时间:2024/05/17 09:05

调用:

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)    { }}