首先创建一个脚本GameLoop 这个脚本需要挂到游戏物体上,用来控制场景得切换和更新。
GameLoop脚本得代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class GameLoop : MonoBehaviour
{
private SceneController controller = null;
private void Awake()
{
DontDestroyOnLoad(this.gameObject);
}
// Use this for initialization
void Start () {
controller = new SceneController();
controller.SetState(new StartScene(controller),false);
}
// Update is called once per frame
void Update ()
{
controller.StateUpdate();
}
}
接着比如有三个场景要进行切换,则需要有三个分别控制得脚本,再建立一个接口,让这三个场景都继承这个接口
ISceneState接口代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ISceneState {
private string mSceneName;
public SceneController mController;
public ISceneState(string sceneName, SceneController controller)
{
mSceneName = sceneName;
mController = controller;
}
public string SceneName
{
get { return mSceneName; }
}
//每次进入到这个状态得时候调用
public virtual void StateUpdate()
{
}
public virtual void StateStart()//这个方法可能会用在当场景进入的时候使用,进行初始化
{
}
public virtual void StateEnd()//这个方法可能会用在当场景切换到其他场景时做一些释放的工作
{
}
}
开始场景代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine.UI;
using UnityEngine;
public class StartScene:ISceneState
{
public StartScene(SceneController controller) : base("startScene", controller)
{
}
private Image mLogo;
private float mSmoothingSpeed = 2;
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, mSmoothingSpeed * Time.deltaTime);
mWaitTime -= Time.deltaTime;
if (mWaitTime <= 0)
{
mController.SetState(new MainMenuScene(mController));
}
}
}
菜单按钮场景代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using UnityEngine;
using UnityEngine.UI;
class MainMenuScene : ISceneState
{
public MainMenuScene(SceneController controller):base("menuScene",controller)
{
}
public override void StateStart()
{
GameObject.Find("StartButton").GetComponent<Button>().onClick.AddListener(() =>
{
mController.SetState(new BattleScene(mController));
});
}
private void OnStartButtonClick()
{
mController.SetState(new BattleScene(mController));
}
}
战斗场景代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
class BattleScene:ISceneState
{
public BattleScene(SceneController controller):base("battleScene",controller)
{
}
}
最后还需要一个 场景控制者,代码如下
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.SceneManagement;
public class SceneController
{
private ISceneState mState;
private AsyncOperation mAo;
private bool mIsRunStart = false;
public void SetState(ISceneState state,bool isLoadScene =true)
{
if (mState != null)
{
mState.StateEnd();//让上一个场景状态做一下清理工作
}
mState = state;
if (isLoadScene)
{
mAo = SceneManager.LoadSceneAsync(mState.SceneName);
mIsRunStart = false;
}
else
{
mState.StateStart();
mIsRunStart = true;
}
}
public void StateUpdate()
{
if (mAo != null && mAo.isDone == false) return;
//mIsRunStart 是否加载完成
if (mIsRunStart == false&& mAo != null && mAo.isDone == true)
{
mState.StateStart();
mIsRunStart = true;
}
if (mState != null)
{
mState.StateUpdate();
}
}
}