我们在进行Unity开发时,场景切换是不可避免的。例如MOBA从组队房间到游戏场景,MMO传送,以及吃鸡的从素质广场到荒岛,场景的切换势必要加载大量的数据以及各个模块的初始化工作。那么,如果要加载的场景过大,而用户的硬盘或者其他硬件性能不够强劲,那么画面就会卡住,等待很长一段时间,非常影响用户体验。
场景切换中间的过渡就在所难免。
比如这个(很赞吧~哈哈哈(旁白:又犯病了))
那么我们今天也实现一下
首先是场景制作
注意要在每一个场景都要加上这些组件。并且将他们初始设为不可见
然后是代码,用到了SceneManager的异步加载,不了解的小伙伴可以去看一下
https://blog.csdn.net/qq_15020543/article/details/84261358
代码(无需挂载)
using UnityEngine;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
namespace Scenes.Scripts.StatePattern.RealSample
{
public class SceneStateController
{
private ISceneState m_State;
private bool m_bRunBegin = false;
/// <summary>
/// 异步加载
/// </summary>
private AsyncOperation _asyncOperation;
/// <summary>
/// 加载UI
/// </summary>
private GameObject _loadingPanel;
/// <summary>
/// 加载进度条
/// </summary>
private Slider _loadingSlider;
/// <summary>
/// 文本
/// </summary>
private Text _loadingText;
public SceneStateController()
{
}
public void SetState(ISceneState state, string LoadSceneName)
{
m_bRunBegin = false;
LoadScene(LoadSceneName);
if (m_State != null)
{
m_State.StateEnd();
}
m_State = state;
}
/// <summary>
/// 加载场景
/// </summary>
/// <param name="loadSceneName">场景名</param>
private void LoadScene(string loadSceneName)
{
if (string.IsNullOrEmpty(loadSceneName))
{
return;
}
_loadingPanel = GameObject.Find("Canvas").transform.Find("Loading").gameObject;
_loadingPanel.SetActive(true);
_loadingSlider = _loadingPanel.transform.Find("Slider").GetComponent<Slider>();
_loadingText = _loadingPanel.transform.Find("Slider/Text").GetComponent<Text>();
_asyncOperation = SceneManager.LoadSceneAsync(loadSceneName);
}
/// <summary>
/// 每帧更新
/// </summary>
public void StateUpdate()
{
//如果上一个场景还没有加载完,那就让他继续加载
if (_asyncOperation != null)
{
_asyncOperation.allowSceneActivation = false;
//因为场景很小,所以一下子就加载完了,所以这里让它加载完不自动跳转,等用户按下鼠标左键再跳转
if (_asyncOperation.progress >= 0.85)
{
_loadingSlider.value = 1;
}
else
{
_loadingSlider.value = _asyncOperation.progress;
}
if (_loadingText)
{
if (_loadingSlider.value != 1.0f)
_loadingText.text = "加载中。。。" + (_loadingSlider.value * 100).ToString() + "%";
}
if (Input.GetMouseButtonDown(0))
{
_asyncOperation.allowSceneActivation = true;
}
if (!_asyncOperation.isDone)
return;
}
if (m_State != null && m_bRunBegin == false)
{
m_State.StateBegin();
m_bRunBegin = true;
}
if (m_State != null)
{
m_State.StateUpdate();
}
}
}
}
运行截图
可能有的小伙伴没看懂,欢迎提问。
完整工程