设计模式之状态模式

调用:

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值