当我们进行游戏开发时,时常会进行场景切换,如果下个场景较大,切换时就会出现卡顿现象,甚至看起来像是"死机",非常影响用户体验,我们这时就可以运用异步加载,在界面上显示加载的进度条以提升用户体验,接下来我们就简略聊聊异步加载吧.

我要实现的功能是这样的:首先,第一个场景是一个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 }

此处需要注意的地方有以下几点:

  1. 加载场景的progress值最大为0.9!!!不知道其用意为何.
  2. AsyncOp.allowSceneActivation 表示场景加载完成后,是否自动跳转,为true时自动跳转.网上有说当其为false时,场景进度只加载至0.9不再加载,当将其更改为true后,继续加载剩下的0.1,因为没有想出合适的检测方法,所有没有检测真假。
  3. 本文提到的异步加载本身就是运用的协程进行的加载!网上有些用Coroutine和LoadSceneAsync合用进行的异步加载,不明其意.
  4. 在实际开发中,进度条的显示有可能会安排在一个新建的过度场景中,原理跟本文的原理相同,无非就是把异步加载的脚本挂在过度场景的Start()函数中而已.
  5. 此案例中加载场景我们用的SceneManager.LoadSceneAsync()来加载场景,当我们只加载一些预制体时,Resources.LoadAsync()的用法和注意事项与其基本相同.
  6. 我们之所以在StartLoad函数中将AsyncOp.allowSceneActivation = false,等slider.value > 0.99f时再使其为true,是为了避免UI中进度条还未达到100%时场景已经跳转的情况出现;而使用插值的方式使进度条的值趋近实际的加载进度是为了避免UI中进度条已经达到100%,但是场景还未加载完成的情况出现,也就是说,我们使用插值实际上就是在为场景加载的最后0.1争取时间.

Unity 异步加载 进度条的更多相关文章

  1. Unity 异步加载进度条

    public class View_LoadingScene : MonoBehaviour { //场景加载进度条对象 public GameObject loadingProgressBar; / ...

  2. Unity异步加载进度条

    先上代码: using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngi ...

  3. JS -- 异步加载进度条

    今天在博客园问答里面看到博友问道怎么实现Ajax异步加载产生进度条. 很好奇就自己写了一个. 展现效果: 1) 当点击Load的时候,模拟执行异步加载. 浏览器被遮挡. 进度条出现. 实现思路: 1. ...

  4. unity WWW加载进度条

    using UnityEngine; using System.Collections; public class testProgress : MonoBehaviour { void Start ...

  5. css3 linear-gradient实现页面加载进度条效果

    最终效果图: html结构: <div>    <p class="p1">        <span></span>    < ...

  6. ajax页面加载进度条插件

    下面两个都是youtube视频的加载进度条效果的ajax插件 一.官网:http://ricostacruz.com/nprogress/官网 github:https://github.com/rs ...

  7. pace.js – 加载进度条插件

    这儿只是简单介绍一下这个插件pace.js. 在页面中引入Pace.js,页面就会自动监测你的请求(包括Ajax请求),在事件循环滞后,会在页面记录加载的状态以及进度情况.此插件的兼容性很好,可以兼容 ...

  8. 仿UC浏览器图片加载进度条

    前几天用UC浏览器看新闻(无意中给UC打了广告),看到它的图片加载进度条,正好最近有时间,所以就自己写了一个. 效果图如下 进度条的底色和填充颜色都可以调整. 首先中间的笑脸作为一个整体,其实现代码如 ...

  9. 【Web前沿技术】纯 CSS3 打造的10个精美加载进度条动画

    之前向大家介绍8款优秀的 jQuery 加载动画和进度条插件,今天这篇文章向大家推荐10个纯 CSS3 代码实现精美加载进度条动画效果的方案.加载动画和进度条在网站和 Web 应用中的使用非常流行,特 ...

随机推荐

  1. Nginx导航

    简介 最近都在弄微服务的东西,现在来记录下收获.我从一知半解到现在能从0搭建使用最大的感触有两点 1.微服务各大组件的版本很多,网上很多博客内容不一定适合你的版本,很多时候苦苦琢磨都是无用功 2.网上 ...

  2. Redis 安装和启动

    Redis 安装 安装准备: redis 压缩包 官网下载地址:https://redis.io/download 安装步骤: 第一步:安装 gcc 编译器 官网发布的 Redis 压缩包是 C 语言 ...

  3. Lua中的异常处理pcall、xpcall、debug使用实例

    如果需要在Lua中处理错误,必须使用函数pcall(protected call)来包装需要执行的代码. pcall接收一个函数和要传递个后者的参数,并执行,执行结果:有错误.无错误:返回值true或 ...

  4. Linux shell用sed批量更改文件名的相关内容

    示例 去除特定字符 目标:将指定目录下文件名中sprint替换为dev 方法: [root@Skip-ftp test]# for i in `ls` > do > name=`echo ...

  5. Git指令大全

    仓库 # 在当前目录新建一个Git代码库 $ git init # 下载一个项目和它的整个代码历史 $ git clone [url] 配置 # 显示当前的Git配置 $ git config --l ...

  6. 基于开源Tars的动态负载均衡实践

    一.背景 vivo 互联网领域的部分业务在微服务的实践过程当中基于很多综合因素的考虑选择了TARS微服务框架. 官方的描述是:TARS是一个支持多语言.内嵌服务治理功能,与Devops能很好协同的微服 ...

  7. fragment之间相互传数据、共享数据

    在 Fragment 之间共享数据 Activity 中的两个或更多 Fragment 需要相互通信是一种很常见的现象.想象一下拆分视图 (master-detail) Fragment 的常见情况, ...

  8. Navigation activity回退到fragment失败

    我有一个activity--MainActivity, 布局中设置了一个 <androidx.fragment.app.FragmentContainerView android:layout_ ...

  9. CodeGen融合核心扩展定制文件

    CodeGen融合核心扩展定制文件 融合核心定制文件 Harmony核心环境的各个方面都可以通过创建一个定制文件来定制,该文件是一个名为Harm的JSON文件onyCoreCustomization. ...

  10. NSight Compute 用户手册(上)

    NSight Compute 用户手册(上) 非交互式配置文件活动 从NVIDIA Nsight Compute启动目标应用程序 启动NVIDIA Nsight Compute时,将出现欢迎页面.单击 ...