项目场景:
在之前的项目中,甲方突然提供了更多的数据,测试加载场景有点卡顿。它被更改为异步加载场景进行过渡。避免过于生硬的加载等待。
问题描述:
实现了场景的异步加载后,总觉得我的加载有问题。虽然可以跳到主场景,就是感觉有点问题。
通过加载发现:
加载到100后会有卡顿时间,进度条直接从0变到100,一开始以为是测试场景太小了。
原因分析:
查了很多博文,发现有以下原因:
SceneManager.LoadSceneAsync() 不是真正的后台加载unity 加载进度条,它每帧加载一些资源;将 allowSceneActivation 设置为 false 后,Unity 只会加载到 90%,其余的会等到 allowSceneActivation 设置为 true 时才加载。加载到90的时候,我们人为的控制进度条的值是100%UI界面,但是实际上并没有加载,所以会卡住; floa 类型到 int 类型的转换规则:值会四舍五入到零,1.99 会返回 1,0.9 会返回 0,所以我的进度条直接从 0 变为 100unity 加载进度条,即为什么,它总是返回 0,
类型转换规则:
当在int(假设int是32位的)、float和double格式之间进行强制类型转换时,原则如下:
1.从 int 转换成 float,数字不会溢出,但是可能被舍入。
.2从 int、float 转换成 double,能够保留精确的数值。因为 double 有更大的范围和更高的精度(有效位数)。
3.从 double 转换成 float,因为 float 范围要小一些,所以值可能溢出成 +∞ 或 -∞。另外由于float精度较小,还可能被舍入。
4.从 float、double 转换成 int,值将会向零舍入。如1.999会被转成1,-1.999会被转成-1。同时值可能会溢出。
解决方案:
注意这里 async.progress;返回 [0, 1] 之间的值。一开始我声明了一个int类型直接接收int endProgress = (int) async.progress;返回值始终为 0 ,所以存在进度条看起来怪怪的问题3D交通工具,这里我用 float 代替接收。
public Text text;
public Slider slider;
//异步加载
IEnumerator LoadAsync()
{
AsyncOperation async = SceneManager.LoadSceneAsync(1);
float nowProgress = 0;
float endProgress = 0;
async1.allowSceneActivation = false;
while (async1.progress < 0.9f)
{
endProgress = async.progress * 100f;
while (nowProgress < endProgress)
{
++nowProgress;
slider.value = nowProgress / 100;
text.text = (int)(nowProgress) + "%";
yield return new WaitForEndOfFrame();
}
}
endProgress = 100;
while (nowProgress < endProgress)
{
++nowProgress;
slider.value = nowProgress / 100;
text.text = (int)(nowProgress) + "%";
yield return new WaitForEndOfFrame();
}
async1.allowSceneActivation = true;
}
参考:场景的异步加载