设计模式——状态模式
适用场景:
1.可以用于控制游戏加载不同的场景
public class GameLoop : MonoBehaviour
{
public SceneStateController controller =null;
private void Awake()
{
DontDestroyOnLoad(this.gameObject);
}
// Start is called before the first frame update
void Start()
{
controller = new SceneStateController();
controller.SetState(new StartState(controller), false);//设置默认状态
}
// Update is called once per frame
void Update()
{
controller.StateUpdate();
}
}
public class ISceneState
{
private string mSceneName;
protected SceneStateController mController;
public string SceneName
{
get
{
return mSceneName;
}
}
public ISceneState(string sceneName,SceneStateController controller)
{
mSceneName = sceneName;
mController = controller;
}
public virtual void StateStart() { }
public virtual void StateEnd() { }
//在update里调用
public virtual void StateUpdate() { }
}
class StateA : ISceneState
{
public StateA(SceneStateController controller) : base("01StartScene", controller)
{
}
public override void StateStart()
{
//具体业务逻辑
}
public override void StateUpdate()
{
//具体业务逻辑
}
public override void StateEnd()
{
//具体业务逻辑
}
}
class StateB : ISceneState
{
public StateB(SceneStateController controller) : base("01StartScene", controller)
{
}
public override void StateStart()
{
//具体业务逻辑
}
public override void StateUpdate()
{
//具体业务逻辑
}
public override void StateEnd()
{
//具体业务逻辑
}
}
public class SceneStateController
{
private ISceneState mState;
private AsyncOperation mAO = null;
private bool mIsRunStart;
public void SetState(ISceneState sceneState, bool isLoadScene = true)
{
if (mState != null)
{
mState.StateEnd();//让上一个场景状态做一下清理工作
}
mState = sceneState;//赋值新场景
if (isLoadScene)
{
mAO = SceneManager.LoadSceneAsync(mState.SceneName);//异步加载新场景
mIsRunStart = false;
}
else
{
mState.StateStart();
mIsRunStart = true;
}
}
public void StateUpdate()
{
if (mAO != null && mAO.isDone == false)//异步加载新场景未完成直接返回
{
return;
}
//异步加载新场景完毕后调用StateStart()来初始化
if (mAO != null && mAO.isDone == true && mIsRunStart == false)
{
mState.StateStart();
mIsRunStart = true;
}
if (mState != null)
{
mState.StateUpdate();
}
}
}