vuforia官方案例自学,只为学习交流,肯定会有错误与肤浅之处,仅供参考
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using UnityEngine.SceneManagement;
public class LoadingScreen : MonoBehaviour
{
/// <summary>
/// m_SpinnerImage:RawImage组件,用于显示“加载场景”的图片
/// m_AsyncOperation:异步操作协同线,此处用于异步加载场景
/// </summary>
RawImage m_SpinnerImage;
AsyncOperation m_AsyncOperation;
bool m_SceneReadyToActivate;
public static string SceneToLoad { get; set; }
public static void Run()
{
SceneManager.LoadSceneAsync("2-Loading");
}
/// <summary>
/// 获取RawImage组件
/// ThreadPriority:线程优先,是一个枚举类,值分别是Low,BelowNormal,Normal,High,低优先级意味着后台操作运行更少,占用时间也更少,进度会更慢。
/// Application.backgroundLoadingPriority:后台加载线程的优先级
/// </summary>
void Start()
{
m_SpinnerImage = GetComponentInChildren<RawImage>();
Application.backgroundLoadingPriority = ThreadPriority.Low;
StartCoroutine(LoadNextSceneAsync());
}
/// <summary>
/// 如果存在RawImage组件,并且还未能加载下一个场景,让“加载”图片旋转,如果已经准备好可以加载下一个场景,将“加载”图片的Raw Image组件禁用掉
/// m_AsyncOperation.progress:返回异步操作的进度,返回操作离完成有多近,当进度达到1.0f并且调用isDone时,表示异步操作已经完成
/// 如果异步操作(在后台加载场景)进度大于0.9,表明已经准备好可以加载下一个场景了
/// m_AsyncOperation.allowSceneActivation:允许场景一旦加载后就立刻激活
/// </summary>
void Update()
{
if (m_SpinnerImage)
{
if (!m_SceneReadyToActivate)
m_SpinnerImage.rectTransform.Rotate(Vector3.forward, 90.0f * Time.deltaTime);
else
m_SpinnerImage.enabled = false;
}
if (m_AsyncOperation != null)
{
if (m_AsyncOperation.progress < 0.9f)
Debug.Log("Scene Loading Progress: " + m_AsyncOperation.progress * 100 + "%");
else
{
m_SceneReadyToActivate = true;
m_AsyncOperation.allowSceneActivation = true;
}
}
}
/// <summary>
/// 异步加载下一个场景
/// 获取当前场景在“building and setting”中“Scene in build”的索引值,令其+1得到下一个要加载的场景的索引值
/// SceneManager.LoadSceneAsync:在后台异步加载场景
/// m_AsyncOperation.allowSceneActivation:允许场景一旦加载后就立刻激活
/// </summary>
/// <returns></returns>
IEnumerator LoadNextSceneAsync()
{
int nextSceneIndex = SceneManager.GetActiveScene().buildIndex + 1;
if (string.IsNullOrEmpty(SceneToLoad))
m_AsyncOperation = SceneManager.LoadSceneAsync(nextSceneIndex);
else
m_AsyncOperation = SceneManager.LoadSceneAsync(SceneToLoad);
m_AsyncOperation.allowSceneActivation = false;
yield return m_AsyncOperation;
}
}