提示:以下是本篇文章正文内容
异步操作协同程序。
您可以 yield 直到异步操作继续,或手动检查它已完成 (isDone) 还是正在进行 (progress)。
另请参阅:SceneManager.LoadSceneAsync、AssetBundle.LoadAssetAsync、Resources.LoadAsync。
变量名 | 作用 |
---|---|
allowSceneActivation | 允许在场景准备就绪后立即激活场景。 |
isDone | 操作是否已完成?(只读) |
priority | Priority 允许您调整执行异步操作调用的顺序。 |
progress | 获取操作进度。(只读) |
事件 | 作用 |
---|---|
completed | 操作完成时调用的事件。即使操作能够同步完成,也将在下一帧调用在创建它的调用所在的帧中注册的事件处理程序。如果处理程序是在操作完成后注册的,并且已调用 complete 事件,则将同步调用该处理程序。 |
代码案例:
using UnityEngine;
using System.Collections;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
public class AsyncScene : MonoBehaviour
{
public Text textValue;
public Slider sliderImg;
public GameObject showObj;
AsyncOperation asyncOperation;
///
/// 判断能不能异步场景加载好了没
///
private bool isLodaScene;
private bool isLodaScene1;
private void Update()
{
if (isLodaScene&& isLodaScene1)
{
if (Input.anyKeyDown)
{
asyncOperation.allowSceneActivation = true;
isLodaScene = false;
}
}
}
public void startToLoadScene()
{
//启动协程
StartCoroutine(AsuncLoad());
}
private IEnumerator AsuncLoad()
{
yield return null;
isLodaScene = true;
//显示加载UI
showObj.SetActive(true);
//获取当前活动的场景的索引+1
asyncOperation = SceneManager.LoadSceneAsync(SceneManager.GetActiveScene().buildIndex+1);
//不允许在场景准备就绪后立即激活场景。
asyncOperation.allowSceneActivation = false;
//操作是否已完成?(只读)
while (!asyncOperation.isDone && isLodaScene)
{
//如3d场景需要加载,这里练习场景没东西所以要模拟舔加延迟
yield return new WaitForSeconds(1f);
//获取操作进度。(只读)赋值Slider上
sliderImg.value = asyncOperation.progress;
//获取操作进度。(只读)赋值Text文本上
textValue.text = asyncOperation.progress * 100 + "%";
if (asyncOperation.progress >= 0.9f )
{
//如3d场景需要加载,这里练习场景没东西所以要模拟舔加延迟
yield return new WaitForSeconds(1f);
sliderImg.value = 1;
textValue.text = "场景以加载完毕,按下任意键跳转场景。";
isLodaScene = false;
}
yield return null;
}
if (sliderImg.value == 1)
{
isLodaScene = true;
isLodaScene1 = true;
}
}
}