搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
凡人多烦事01
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
Tensorflow构建自己的图片数据集TFrecords_tensorflow 自己的图片 数组
2
群晖 Docker版qbittorrent 下载显示错误 解决方法_qbittorrent下载错误
3
IOS下的横竖屏切换研究_ios 下的横竖屏切换研究
4
面试经典150题——矩阵置零
5
在 Linux 中安装 Cassandra
6
RuntimeError: Expected all tensors to be on the same device, but found at least two devices
7
mybatis typehandler的使用_type-handlers-package
8
ModuleNotFoundError: No module named ‘sklearn‘_modulenotfounderror: no module named 'sklearn
9
学习会员上线啦,快来看看会有哪些权益吧~_scdn 学员收益:
10
【个人笔记】OpenCV4 C++ 快速入门 26课_【个人笔记 - 目录】opencv c++ 快速入门 30讲
当前位置:
article
> 正文
Unity3d中制作Loading场景进度条所遇到的问题_unity3d导入出现while loadong问题
作者:凡人多烦事01 | 2024-02-18 00:11:55
赞
踩
unity3d导入出现while loadong问题
背景
通常游戏的主场景包含的资源较多,这会导致加载场景的时间较长。为了避免这个问题,可以首先加载Loading场景,然后再通过Loading场景来加载主场景。因为Loading场景包含的资源较少,所以加载速度快。在加载主场景的时候一般会在Loading界面中显示一个进度条来告知玩家当前加载的进度。在Unity中可以通过调用Application.LoadLevelAsync函数来异步加载游戏场景,通过查询AsyncOperation.progress的值来得到场景加载的进度。
尝试——遇到问题
第一步当加载完Loading场景后,调用如下的LoadGame函数开始加载游戏场景,使用异步加载的方式加载场景1(Loading场景为0,主场景为1),通过Unity提供的Coroutine机制,我们可以方便的在每一帧结束后调用SetLoadingPercentage函数来更新界面中显示的进度条的数值。
public void LoadGame() {
StartCoroutine(StartLoading_1(1));
}
private IEnumerator StartLoading_1(int scene) {
AsyncOperation op = Application.LoadLevelAsync(scene);
while(!op.isDone) {
SetLoadingPercentage(op.progress * 100);
yield return new WaitForEndOfFrame();
}
}
最后进度条的效果显示如下:
进度条并没有连续的显示加载的进度,而是停顿一下切换一个数字,再停顿一下切换一个数子,最后在没有显示100%就情况下就切换到主场景了。究其原因在于Application.LoadLevelAsync并不是真正的后台加载,它在每一帧加载一些游戏资源,并给出一个progress值,所以在加载的时候还是会造成游戏卡顿,AsyncOperation.progress的值也不够精确。当主场景加载完毕后Unity就自动切换场景,所以上述代码中的while循环体内的代码是不会被调用的,导致进度条不会显示100%。
修补——100%完成
为了让进度条能显示100%,取巧一点的办法是将AsyncOperation.progress的值乘上2,这样当加载到50%的时候界面上就显示100%了。缺点是当界面上显示100%的时候,用户还要等待一段时间才会进入游戏。其实Unity提供了手动切换场景的方法,把AsyncOperation.allowSceneActivation设为false就可以禁止Unity加载完毕后自动切换场景,修改后的StartLoading_2代码如下:
// this function is not work
private IEnumerator StartLoading_2() {
AsyncOperation op = Application.LoadLevelAsync(1);
op.allowSceneActivation = false;
while(!op.isDone) {
SetLoadingPercentage(op.progress * 100);
yield return new WaitForEndOfFrame();
}
op.allowSceneActivation = true;
}
我们首先将AsyncOperation.allowSceneActivation设为false,当加载完成后再设为true。代码看上去没有错,但是执行的结果是进度条最后会一直停留在90%上,场景不会切换。通过打印log发现AsyncOperation.isDone一直为false,AsyncOperation.progress的值增加到0.9后就保持不变了,也就是说场景永远不会被加载完毕。
在这个帖子中找到了答案,原来把allowSceneActivation设置为false后,Unity就只会加载场景到90%,剩下的10%要等到allowSceneActivation设置为true后才加载,这不得不说是一个坑。所以代码改为如下。当AsyncOperation.progress到达0.9后,就直接把进度条的数值更新为100%,然后设置AsyncOperation.allowSceneActivation为ture,让Unity继续加载未完成的场景。
private IEnumerator StartLoading_3() {
AsyncOperation op = Application.LoadLevelAsync(1);
op.allowSceneActivation = false;
while(op.progress < 0.9f) {
SetLoadingPercentage(op.progress * 100);
yield return new WaitForEndOfFrame();
}
SetLoadingPercentage(100);
yield return new WaitForEndOfFrame();
op.allowSceneActivation = true;
}
最后的效果如下:
打磨——增加动画
上述的进度条虽然解决了100%显示的问题,但由于进度条的数值更新不是连续的,所以看上去不够自然和美观。为了看上去像是在连续加载,可以每一次更新进度条的时候插入过渡数值。这里我采用的策略是当获得AsyncOperation.progress的值后,不立即更新进度条的数值,而是每一帧在原有的数值上加1,这样就会产生数字不停滚动的动画效果了,迅雷中显示下载进度就用了这个方法。
private IEnumerator StartLoading_4() {
int displayProgress = 0;
int toProgress = 0;
AsyncOperation op = Application.LoadLevelAsync(1);
op.allowSceneActivation = false;
while(op.progress < 0.9f) {
toProgress = (int)op.progress * 100;
while(displayProgress < toProgress) {
++displayProgress;
SetLoadingPercentage(displayProgress);
yield return new WaitForEndOfFrame();
}
}
toProgress = 100;
while(displayProgress < toProgress){
++displayProgress;
SetLoadingPercentage(displayProgress);
yield return new WaitForEndOfFrame();
}
op.allowSceneActivation = true;
}
displayProgress用来记录要显示在进度条上的数值,最后进度条的动画如下:
对比第一种的进度条
总结
如果在加载游戏主场景之前还需要解析数据表格,生成对象池,进行网络连接等操作,那么可以给这些操作赋予一个权值,利用这些权值就可以计算加载的进度了。如果你的场景加载速度非常快,那么可以使用一个假的进度条,让玩家看上几秒钟的loading动画,然后再加载场景。总之进度条虽然小,但要做好也是不容易的。
参考
阿高.Unity 显示Loading(加载)进度 对于网上流行的方法进行更正
Unity3d官方论坛.using allowSceneActivation
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/凡人多烦事01/article/detail/102664
推荐阅读
article
Unity3d
windows平台基于3D
Web
View for
Windows
and macO...
之前
Unity3d
的程序在win pc上打开
网页
一般使用Embedded
Browser
插件,也算是比较好用的,不过经过查...
赞
踩
article
[
unity3d
]
发布
网页
版
Unity
自适应
网页
大小
_
unity3d
web
页面
大小
设置
...
发布
网页
版,
Unity
3D自适应
网页
大小
。这个问题困扰了我很长时间,今天终于把他解决了,给大家分享一下。这里用Uinty...
赞
踩
article
Unity3D
-
Canvas
-UIScaleMode...
Unity
Canvas
UI自适应部分用
Canvas
下的自适应UI Scale Mode:Constant Pixel S...
赞
踩
article
Unity3D
场景
编辑器
扩展学习笔记-
EditorWindow
_
guipointtoworldra...
今天可以说是有点成果了,可喜可贺~先上图本节内容涉及到的类:
EditorWindow
, Physics, Handle...
赞
踩
article
「
Unity3D
」(12)
EditorWindow
使用
ScriptableObject
绘制
界面_ed...
通常
绘制
EditorWindow
需要手动一个个手动
绘制
控件和布局,但是联想到Inspector可以根据Serialize...
赞
踩
article
Unity3D
-
EditorWindow
应用学习01_
unity
editorwindow
初始化
...
目标绘制传感器读入的一组数据,在线(实时)绘制成折线图,效果类似下面这样(当然这个图是Excel的了)参考了很多教程&博...
赞
踩
article
Unity3D
:
向量
运算_
unity
计算
垂直
向量
...
Unity3D
:
向量
运算,物体转向和位置判断_
unity
计算
垂直
向量
unity
计算
垂直
向量
...
赞
踩
article
unity
3d
:向量
计算
,
摄像机
与
目标
位置
_
unity
计算
目标
位置
...
目标
与摄像头,摄像头重新出现在两者连线方向的距离
目标
10m处 Vector3 oldPos = transform....
赞
踩
article
Unity3D
数学知识 (
向量
,
坐标系
转换,
欧拉角
,
四元
数)_
unity
有极点、
四元
数算出
直角坐标
...
模:
向量
的长度=>sqr(x^2+y^2+z^2) //各
向量
的平方相加,在开方Unity API: Vector.ma...
赞
踩
article
Unity3D
-----
三维
数学(
向量
)_
三维
向量
的
模...
Unity3d
-----
->
三维
数学之
向量
一、
向量
1、什么是
向量
2、
向量
的
形式3、
向量
的
大小4、
向量
的
方向二、
向量
运算1...
赞
踩
article
Unity3D
-
向量
(
Vector
)_
unity
使用
vector
要引入
的
包...
向量
(
又称矢量)是游戏开发过程中非常重要
的
概念,它是用于描述具有大小和方向两个属性
的
物理量,例如物体运动
的
速度、加速度、...
赞
踩
article
Unity3D
-
向量
(
Vector
)_
unity
代码
victor
...
向量
(又称矢量)是游戏开发过程中非常重要的概念,它是用于描述具有大小和方向两个属性的物理量,例如物体运动的速度、加速度、...
赞
踩
article
Unity3D
关于
模型
变形
技术代码
实现
_
unity
形变
模拟
...
本篇博客给读者介绍关于如何
实现
模型
的
变形
,在项目开发中经常会涉及到
模型
的
变形
操作,比如如下效果图: 第一部分准备工作 首...
赞
踩
article
Unity3D
C#
数学系列之
变换
矩阵
推导
_
unity3d
编程
变换
矩阵
...
1 仿射
变换
与齐次坐标《
Unity3D
C#
数学系列之
矩阵
基础》中我们说到一个4×4的
矩阵
可以用来对三维空间中的点或向量...
赞
踩
article
Unity3d
插件
着色器
(Shader)报错T
o
o
many
texture
interp
o
lat...
如图的问题出现在别人分享的一些插件在不同版本的情况下会出现
着色器
的报错问题。而且使用该
着色器
材质的模型都没法正常显示。问...
赞
踩
article
unity
3d
Attribute
的探索_
unity
获取
attribute
...
1.AddComponentMenu 直面解释就是这个脚本能够在Component菜单栏里找到using System....
赞
踩
article
【
Unity3D
】
Inspector
界面
属性
显隐控制(条件控制)_
unity
自定义
inspect...
前言(可以不看)早之前写
自定义
GroupLayout的时候就想要有个
Inspector
界面
属性
显隐控制(条件控制)的东西...
赞
踩
article
「
Unity3D
」(2)
射线
检测
与
EventSystem
判断
UI
点击_
射线
检测
点击和
event
检测
...
按照传统的做法,
EventSystem
用做
UI
的事件处理,
射线
检测
用做非
UI
碰撞的判断,但需要手动添加Collider。...
赞
踩
article
Unity3D
-场景中3D
物体
添加
点击
事件
_
unity3d
球体内部
添加
事件
...
x欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插...
赞
踩
article
unity
3d
文件批量
转为
UTF8
_
unity
保存
shdaer
文件是
utf8
格式...
使用visual studio创建一个控制台程序using System; using System.IO; using...
赞
踩
相关标签
Unity内嵌网页
Unity网页通信
Unity VR 网页
Unity Web交互
Unity内置浏览器
ui
游戏
编辑器
unity3d
扩展
Unity
Inspector
EidtorWindow
ScriptableObject
Unity扩展
unity
c#
向量计算
摄像机
目标
lookat
游戏开发
几何学