A场景是当前场景,B场景是异步加载的过渡场景,C场景是要前往的目标场景
在A场景的任意一个脚本中添加一个方法,并在要用的按钮出传入数值即可
void LoadNewScene(string nextSceneName, string goSceneName)
{
//保存需要加载的目标场景
AppDefine.nextSceneName = nextSceneName;
//前往中转场景
SceneManager.LoadScene(goSceneName);
}
在B场景中新建脚本
public class WaitScene : MonoBehaviour
{
Slider loadingSlider;
Text loadingText;
private float loadingSpeed = 1;
private float targetValue;
private AsyncOperation operation;
private void Awake()
{
loadingSlider = transform.Find("Slider").GetComponent<Slider>();
loadingText = transform.Find("Text1").GetComponent<Text>();
}
void Start()
{
loadingSlider.value = 0.0f;
if (SceneManager.GetActiveScene().name == "Waiting")
{
//启动协程
StartCoroutine(AsyncLoading());
}
}
IEnumerator AsyncLoading()
{
operation = SceneManager.LoadSceneAsync(AppDefine.nextSceneName);
//阻止当加载完成自动切换
operation.allowSceneActivation = false;
yield return operation;
}
// Update is called once per frame
void Update()
{
targetValue = operation.progress;
if (operation.progress >= 0.9f)
{
//operation.progress的值最大为0.9
targetValue = 1.0f;
}
if (targetValue != loadingSlider.value)
{
//插值运算
loadingSlider.value = Mathf.Lerp(loadingSlider.value, targetValue, Time.deltaTime * loadingSpeed);
if (Mathf.Abs(loadingSlider.value - targetValue) < 0.01f)
{
loadingSlider.value = targetValue;
}
}
loadingText.text = ((int)(loadingSlider.value * 100)).ToString() + "%";
if ((int)(loadingSlider.value * 100) == 100)
{
//允许异步加载完毕后自动切换场景
operation.allowSceneActivation = true;
}
}
}
场景名称建一个脚本,把它在其中当作静态变量,需要的时候改写即可
public class AppDefine
{
public static string nextSceneName;
}
这样就可以满足需求啦,如下图