(一)状态模式
相关链接:http://www.cnblogs.com/wangjq/archive/2012/07/16/2593485.html
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class StateDemo : MonoBehaviour
{
void Start()
{
Context context= new Context();
context.SetState(new ConcreteStateA(context));
context.Handle(20);
context.Handle(3);
}
}
public interface IState
{
void Handle(int arg);
}
public class Context
{
private IState mState;
public void SetState(IState state)
{
mState = state;
}
public void Handle(int arg)
{
mState.Handle(arg);
}
}
public class ConcreteStateA : IState
{
private Context mContext;
public ConcreteStateA(Context context)
{
this.mContext = context;
}
public void Handle(int arg)
{
if (arg >= 10)
{
Debug.Log("arg >= 10");
mContext.SetState(new ConcreteStateB(mContext));
}
}
}
public class ConcreteStateB : IState
{
private Context mContext;
public ConcreteStateB(Context context)
{
this.mContext = context;
}
public void Handle(int arg)
{
if (arg < 10)
{
Debug.Log("arg < 10");
mContext.SetState(new ConcreteStateA(mContext));
}
}
}
(二)状态模式例子: 实现通过改变状态来改变场景
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GameLoop : MonoBehaviour {
private SceneStateController stateController;
// Use this for initialization
void Start () {
DontDestroyOnLoad(this);
stateController = new SceneStateController();
stateController.SetSceneState(new StartState(stateController),false);
}
// Update is called once per frame
void Update () {
if (stateController != null)
stateController.SceneStateUpdate();
}
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ISceneState
{
private string mSceneNmae; //场景名字
protected SceneStateController mController;
public string SceneName
{
get { return mSceneNmae; }
}
public ISceneState(string SceneNmae, SceneStateController controller)
{
mSceneNmae = SceneNmae;
mController = controller;
}
public virtual void SceneStateUpdate() { }
public virtual void SceneStateStart() { }
public virtual void SceneStateEnd() { }
}
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class SceneStateController
{
private ISceneState mSceneState;
private AsyncOperation mAO ; // 异步加载场景
private bool mIsRunning = false; //是否正在加载场景
public void SetSceneState(ISceneState SceneState,bool isLoadScene = true)//isLoadScene为是否需要加载场景
{
if (mSceneState != null)
{
mSceneState.SceneStateEnd();//让上个场景状态做一下清理工作
}
mSceneState = SceneState;
if (isLoadScene)//需要加载场景
{
Debug.Log("需要加载场景");
mAO = SceneManager.LoadSceneAsync(mSceneState.SceneName);// 异步加载场景
mIsRunning = false;
}
else // 不需要加载场景(第一次开启时)
{
Debug.Log("不需要加载场景");
mSceneState.SceneStateStart();
mIsRunning = true;
}
}
public void SceneStateUpdate()
{
if (mAO != null && mAO.isDone == false) return; //当需要加载场景且场景加载未结束时return
if ( mAO != null && mIsRunning == false && mAO.isDon