Unity 异步加载 进度条
当我们进行游戏开发时,时常会进行场景切换,如果下个场景较大,切换时就会出现卡顿现象,甚至看起来像是"死机",非常影响用户体验,我们这时就可以运用异步加载,在界面上显示加载的进度条以提升用户体验,接下来我们就简略聊聊异步加载吧.
我要实现的功能是这样的:首先,第一个场景是一个UI界面,点击"开始加载"按钮进行加载下一场景,场景加载完成后自动跳转,通过文本和进度条显示加载进度,如图:
然后,第二个场景,也就是我们要加载的场景名为"Demo Valley",注意此场景必须加入到unity的build中才行(File->Build Setting):
接下来就该上代码了,如下(此脚本挂于Canvas上):
1 using UnityEngine;
2 using UnityEngine.SceneManagement;//注意引用命名空间
3 using System;
4 using UnityEngine.UI;
5
6 public class LoadScene : MonoBehaviour
7 {
8 Slider slider;//滑动条
9 Text text;//文本
10 Button but;//按钮
11 // 加载进度
12 float loadPro = 0;
13
14 // 用以接受异步加载的返回值
15 AsyncOperation AsyncOp = null;
16
17 void Start()
18 {
19 Debug.Log("开始加载");
20
21 slider = transform.Find("Slider"). GetComponent<Slider>();
22 slider.value = 0;
23 text = transform.Find("Text").GetComponent<Text>();
24 but = transform.Find("Button").GetComponent<Button>();
25 but.onClick.AddListener(StartLoad);//绑定按钮事件
26
27 }
28
29 //点击按钮,开始加载下一场景,文本和进度条显示加载进度
30 void StartLoad()
31 {
32 AsyncOp = SceneManager.LoadSceneAsync("Demo Valley",LoadSceneMode.Single);//异步加载场景名为"Demo Valley"的场景,LoadSceneMode.Single表示不保留现有场景
33 AsyncOp.allowSceneActivation = false;//allowSceneActivation =true表示场景加载完成后自动跳转,经测,此值默认为true
34 }
35
36 void Update()
37 {
38 if (AsyncOp!=null)//如果已经开始加载
39 {
40 loadPro = AsyncOp.progress; //获取加载进度,此处特别注意:加载场景的progress值最大为0.9!!!
41 }
42 if (loadPro >= 0.9f)//因为progress值最大为0.9,所以我们需要强制将其等于1
43 {
44 loadPro = 1;
45 }
46 slider.value = Mathf.Lerp(slider.value, loadPro,1*Time.deltaTime);//滑动块的value以插值的方式紧跟进度值
47 if (slider.value > 0.99f)
48 {
49 slider.value = 1;
50 AsyncOp.allowSceneActivation = true;
51 }
52 text.text =string.Format("{0:F0}%", slider.value*100);//文本中以百分比的格式显示加载进度
53 }
54 }
此处需要注意的地方有以下几点:
- 加载场景的progress值最大为0.9!!!不知道其用意为何.
- AsyncOp.allowSceneActivation 表示场景加载完成后,是否自动跳转,为true时自动跳转.网上有说当其为false时,场景进度只加载至0.9不再加载,当将其更改为true后,继续加载剩下的0.1,因为没有想出合适的检测方法,所有没有检测真假。
- 本文提到的异步加载本身就是运用的协程进行的加载!网上有些用Coroutine和LoadSceneAsync合用进行的异步加载,不明其意.
- 在实际开发中,进度条的显示有可能会安排在一个新建的过度场景中,原理跟本文的原理相同,无非就是把异步加载的脚本挂在过度场景的Start()函数中而已.
- 此案例中加载场景我们用的SceneManager.LoadSceneAsync()来加载场景,当我们只加载一些预制体时,Resources.LoadAsync()的用法和注意事项与其基本相同.
- 我们之所以在StartLoad函数中将AsyncOp.allowSceneActivation = false,等slider.value > 0.99f时再使其为true,是为了避免UI中进度条还未达到100%时场景已经跳转的情况出现;而使用插值的方式使进度条的值趋近实际的加载进度是为了避免UI中进度条已经达到100%,但是场景还未加载完成的情况出现,也就是说,我们使用插值实际上就是在为场景加载的最后0.1争取时间.
Unity 异步加载 进度条的更多相关文章
- Unity 异步加载进度条
public class View_LoadingScene : MonoBehaviour { //场景加载进度条对象 public GameObject loadingProgressBar; / ...
- Unity异步加载进度条
先上代码: using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngi ...
- JS -- 异步加载进度条
今天在博客园问答里面看到博友问道怎么实现Ajax异步加载产生进度条. 很好奇就自己写了一个. 展现效果: 1) 当点击Load的时候,模拟执行异步加载. 浏览器被遮挡. 进度条出现. 实现思路: 1. ...
- unity WWW加载进度条
using UnityEngine; using System.Collections; public class testProgress : MonoBehaviour { void Start ...
- css3 linear-gradient实现页面加载进度条效果
最终效果图: html结构: <div> <p class="p1"> <span></span> < ...
- ajax页面加载进度条插件
下面两个都是youtube视频的加载进度条效果的ajax插件 一.官网:http://ricostacruz.com/nprogress/官网 github:https://github.com/rs ...
- pace.js – 加载进度条插件
这儿只是简单介绍一下这个插件pace.js. 在页面中引入Pace.js,页面就会自动监测你的请求(包括Ajax请求),在事件循环滞后,会在页面记录加载的状态以及进度情况.此插件的兼容性很好,可以兼容 ...
- 仿UC浏览器图片加载进度条
前几天用UC浏览器看新闻(无意中给UC打了广告),看到它的图片加载进度条,正好最近有时间,所以就自己写了一个. 效果图如下 进度条的底色和填充颜色都可以调整. 首先中间的笑脸作为一个整体,其实现代码如 ...
- 【Web前沿技术】纯 CSS3 打造的10个精美加载进度条动画
之前向大家介绍8款优秀的 jQuery 加载动画和进度条插件,今天这篇文章向大家推荐10个纯 CSS3 代码实现精美加载进度条动画效果的方案.加载动画和进度条在网站和 Web 应用中的使用非常流行,特 ...
随机推荐
- 普里姆(Prim)算法
概览 普里姆算法(Prim算法),图论中的一种算法,可在加权连通图(即"带权图")里搜索最小生成树.即此算法搜索到的边(Edge)子集所构成的树中,不但包括了连通图里的所有顶点(V ...
- 小米华为vivooppo手机记录隐私证据查询
1.在拨号界面输入:*#*#4636#*#* 2.在输入代码之后 手机会自动跳转到下面这个页面 就可以查看她到底拿着手机在干嘛 2 输入下面代码可以检测小米手机的各种信息 *#*#64663#*#*
- reboot 就是 poweroff 然后power on
halt Shut down and halt the system poweroff Shut down and power-off the system reboot [ARG] Shut dow ...
- Wordpress用文件记录访客 IP和访问量
1.记录访问量,显示访客IP [php原码] <?php /*打开文件用于记录访问量,如果文件不存在自动创建*/ $counterFile = "counter.txt"; ...
- shell基础之pxe批量部署
通过安装及配置DHCP,tftp-server,xinetd,httpd,syslinux来实现批量安装Linux系统 #!/bin/bash #检查环境 se_state=`getenforce` ...
- 【转-备忘】scatter函数
1.scatter函数原型 2.其中散点的形状参数marker如下: 3.其中颜色参数c如下: 4.基本的使用方法如下: #导入必要的模块 import numpy as np import matp ...
- readlink 函数用法 -(转自 JK198310的专栏)
相关函数: stat, lstat, symlink 表头文件: #include <unistd.h> 定义函数:ssize_t readlink(const char *path, c ...
- flink反压的监控
反压在流式系统中是一种非常重要的机制,主要作用是当系统中下游算子的处理速度下降,导致数据处理速率低于数据接入的速率时,通过反向背压的方式让数据接入的速率下降,从而避免大量数据积压在flink系统中,最 ...
- Docker学习(2) 安装
1 在Ubanru中安装 简单安装: 2 windows安装docker 3 OS X 安装docker
- 使用Apache TVM将机器学习编译为WASM和WebGPU
使用Apache TVM将机器学习编译为WASM和WebGPU TLDR 在Apache TVM深度学习编译器中引入了对WASM和WebGPU的支持.实验表明,在将模型部署到Web时,TVM的WebG ...