Unity进度条场景载入的制作思路

有两种做法,如果全部都是AssetsBundle动态载入,可以自己管控加载和释放。还有一种是借助Unity的Level(场景)。

 

我选择第二种做法,其中有2个问题要注意下

 

第一个问题是如何检测

 

如果直接A-B场景切换,我比较担心加载峰值过高,所以用一个中间场景:A-L-B。L是进度条专用场景

OnLevelWasLoaded可以判断是否新场景加载完了,并调用Application.LoadLevelAsync(...)进行加载,可以通过返回对象获取到加载进度

使用时发现一个比较奇怪的事情,当场景很小秒载的时候,加载进度条执行OnDestroy,加载进度才0.9。

而通过FixedUpdate判断加载进度是否isDone会发现,AsyncOperation的操作对象已经被释放了

但非Additive加载的情况下,新场景载入完又会销毁进度条,所以也取不到OnLevelWasLoaded的消息。

所以既不能通过OnDestroy也不能通过Update判断场景是否加载完

 

最终做法是把进度条做成新场景载入不释放的对象DontDestroyOnLoad(...),然后手动控制销毁即可。

这样就可以通过OnLevelWasLoaded判断是否加载完成

 

第二个问题是,秒载进度条速度太快,有时候0.2秒,0.3秒用户体验也不好。所以需要做一个差值,给一个最快时间限制。大体思路各人有各人的做法,这里提供一个伪代码:

var realTime = ...//真实时间0-1
var simTime = ...//模拟时间0-1
var minValue = Math.Min(realTime,simTime);
var maxValue = Math.Min(realTime,simTime);
var lerpLoading = Mathf.Lerp(minValue, maxValue, Math.Min(simTime, realTime));


//...label.text = (lerpLoading * 100).ToString();

 

你可能感兴趣的:(unity)