有两种做法,如果全部都是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();