在unity中,如果加载的资源过大的话,使用同步加载便会产生卡顿的现象,为了保证玩家的游戏体验,我们法通常采用多线程或者使用引擎本身自带的异步加载方法,接下来,就让我带领大家一起去了解一下异步加载吧
我们在Unity 中新建两个场景,分别命名为OneScene,TwoScene,接下来,我们会利用异步加载从场景TwoScene跳转到OneScene;
这是TwoScene场景,注意下,要将Image Type的类型改为 Filled,我们会通过改变fillAmount值改变数据加载进度
接下来我们开始敲代码(将代码挂在Canvas上)
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using System;
public class LoadingWnd : MonoBehaviour
{
public LoadingWnd loadingWnd; //加载界面
public const string OneScene = "OneScene"; //需要跳转的场景
public Text txtFG; //文本的数据显示
public Image ImgFG; //图片的显示
public void Start()
{
DontDestroyOnLoad(this); //加载完成后不销毁UI
EnterLogin(); //跳转
LodWnd(); //初始化
}
public void EnterLogin()
{
loadingWnd.gameObject.SetActive(true); //显示UI
AsyneLoadScene(OneScene); //通过异步加载跳转到OneScene
}
public Action prgCB = null; //封装好委托,用于更新的回调
public void AsyneLoadScene(string sceneName)
{
AsyncOperation sceneAsync = SceneManager.LoadSceneAsync(sceneName); //通过异步加载的接口拿到异步操作
prgCB = () =>
{
float val = sceneAsync.progress; //代表异步加载的值
loadingWnd.SetProgress(val);
if (val == 1) //当值为一时,完成异步
{
prgCB = null;
sceneAsync = null;
loadingWnd.gameObject.SetActive(false);
}
};
}
public void LodWnd()
{
txtFG.text = "0"; //文字初始化为0
ImgFG.fillAmount = 0; //进度条初始化
}
public void SetProgress(float prg)
{
txtFG.text = (int)(prg * 100) + "%"; //文本的计算方法
ImgFG.fillAmount = prg;
}
private void Update() //更新的回调,每帧调用
{
if(prgCB!=null)
{
prgCB();
}
}
}
最后放上源码,大家有不懂得可以评论区问我哦