本文是针对ZTools中异步加载工具的使用说明,包含实现过程以及如何使用

 免费下载地址:请到【 https://gitee.com/jacobkay/unity-ZTools-LoadSceneAsync】中下载

效果展示:

异步加载(2)

使用说明:

1、下载工具,导入到工程中,引用ZTools命名空间

2、制作自己心仪的loading页,可以是预制体,也可以是scene场景

3、使用下文中说明的api,传入相应的参数,即可实现异步加载功能

API说明:

1、如果loading页为预制体格式,请使用接口SceneLoadWithPrefab,传入加载场景名称,loading页面路径或者对象,加载模式,回调函数,即可完成一次异步加载

/// <summary>
/// 场景加载
/// </summary>
/// <param name="sceneName">加载场景名称</param>
/// <param name="loadObjPath">loading页面对象</param>
/// <param name="mode">加载模式</param>
/// <param name="successCallBack">加载完回调</param>
public void SceneLoadWithPrefab(string sceneName, GameObject loadObj, LoadSceneMode mode, Action successCallBack){}

2、如果loading页为scene格式,请使用接口SceneLoadWithScene,传入加载场景名称,loading页场景名称,加载模式,回调函数,即可完成一次异步加载

/// <summary>
/// 场景加载
/// </summary>
/// <param name="sceneName">加载场景名称</param>
/// <param name="loadObjPath">loading页面路径</param>
/// <param name="mode">加载模式</param>
/// <param name="successCallBack">加载完回调</param>
public void SceneLoadWithScene(string sceneName, string loadSceneName, LoadSceneMode mode, Action successCallBack){}

3、loading页可以通过LoadEvent(广播事件)获取当前加载进度,拿到进度后,可进行各种类型的动画操作,注意:该事件在加载完成之前每帧都会被调用,可以通过返回值控制场景何时加载完成,完成后,返回true即可停止调用,否则返回false

/// <summary>
/// 获取加载进度,加载成功后需返回true,否则为false;
/// </summary>
public event Func<float, bool> LoadEvent;

4、如在场景跳转时,不想每次传入那么多参数,可通过DefaultLoadingPageName(属性)设置loading页默认的预制体路径或者场景名称,之后调用加载接口时,可只传加载场景的名称

/// <summary>
/// 设置默认loading页面名称
/// </summary>
public string DefaultLoadingPageName
{set {}
}
/// <summary>
/// 场景加载,loading页面路径和名称"Resources/Loading"
/// </summary>
/// <param name="sceneName">加载场景名称</param>
public void SceneLoadWithPrefab(string sceneName){}
/// <summary>
/// 场景加载,loading页面路径和名称"Resources/Loading"
/// </summary>
/// <param name="sceneName">加载场景名称</param>
public void SceneLoadWithScene(string sceneName){}

核心实现

场景加载分为同步加载和异步加载,同步加载就是场景直接切换,如果电脑配置不够高的话,会出现卡顿的情况,而异步加载解决了这个卡顿的问题

一般来讲,异步加载的实现,视觉上需要三个场景,开始场景,跳转到的场景以及中间过度场景,过度场景可以获取场景切换的进度,拿到进度值后,使用进度条或者其他形式展现场景的过度

实现场景的异步加载分五步

1、引入命名空间UnityEngine.SceneManagement;

2、开启一个携程,使用unity提供的接口SceneManager.LoadSceneAsync加载场景,得到一个类型为AsyncOperation的返回值

3、使用SceneManager.sceneLoaded监听场景是否加载完成,完成后使用SceneManager.SetActiveScene将该场景设为启动场景

4、设置场景场景初始化时间,如果想等待loading页加载完成再初始化,则将AsyncOperation对象中的allowSceneActivation设置为false,这样场景加载完之后不会立即初始化,等待loading加载完之后,将allowSceneActivation设置为true,场景即可初始化,目前默认为loading加载完之后初始化

private AsyncOperation sceneAsync;
IEnumerator AsyncLoading(string sceneName, LoadSceneMode loadSceneMode)
{sceneAsync = SceneManager.LoadSceneAsync(sceneName, loadSceneMode);SceneManager.sceneLoaded += OnSceneLoaded;//阻止当加载完成自动切换sceneAsync.allowSceneActivation = false;yield return sceneAsync;
}
/// <summary>
/// 加载完成后设为启动场景
/// </summary>
/// <param name="a"></param>
/// <param name="mode"></param>
void OnSceneLoaded(Scene a, LoadSceneMode mode)
{SceneManager.SetActiveScene(SceneManager.GetSceneByName(a.name));
}

5、以上操作之后,可以通过2步得到的AsyncOperation对象中的progress在每帧监听加载的进度,这里需要注意的是,progress最大值是0.9,所以需要做个判断,如果大于等于0.9的时候,将值设置为1

void Update()
{if (null != sceneAsync){targetValue = targetValue >= 0.9f ? 1 : sceneAsync.progress;}if (isLoading && null != LoadEvent){if (LoadEvent.Invoke(targetValue)){StartCoroutine(LoadSuccess());}}
}

封装过程问题整理

1、Hierarchy中除了DontDestroyOnLoad场景,必须有一个启动场景,比如新加载的场景在没有初始化之前,开始场景是无法卸载的,如果加载模式为Additive,必须将新加载的场景设置为启动场景,否则当前所有配置项仍为前场景的

2、因为场景切换是需要时间的,所以如果loading页为prefab时,即便场景初始化发生在loading关闭之后,也会出现loading页关闭后,场景切换的动作,所以这里使用了携程,先场景初始化,0.1s之后关闭loading页(此处的处理方式有问题,如果有大佬知道如何处理,也烦请指出,谢谢)

联系我

为了更好的沟通组件使用问题或者有更好意见提出,烦请各位大佬打开文档中的HELP

Unity可自定义loading页的异步加载工具,免费下载,使用说明相关推荐

  1. 新手教程:不写JS,在MIP页中实现异步加载数据

    从需求谈起:在 MIP 页中异步加载数据 MIP(移动网页加速器) 的 加速原理 除了靠谱的 MIP-Cache CDN 加速外,最值得一提的就是组件系统.所有 JS 交互都需要使用 MIP 组件实现 ...

  2. UNITY所谓的异步加载几乎全部是协程,不是线程;MAP3加载时解压非常慢

    UNITY所谓的异步加载几乎全部是协程,不是线程;MAP3加载时解压非常慢 实践证明,以下东西都是协程,并非线程(thread): 1,WWW 2,AssetBundle.LoadFromFileAs ...

  3. ECharts 异步加载数据及loading 动画

    异步加载 echarts 示例中的数据是在初始化后setOption中直接填入的,但是很多时候可能数据需要异步加载后再填入.ECharts 中实现异步数据的更新非常简单,在图表初始化后不管任何时候只要 ...

  4. 【Unity】场景异步加载、卸载

    场景异步加载.卸载: using System.Collections; using System.Collections.Generic; using UnityEngine; using Unit ...

  5. unity的异步加载

    本文主要是代码上的理解,关于场景跳转时UI方面的Image进度条以及百分比表示进度比较简单,暂时不讨论 在unity中加载场景要先引入命名空间 using UnityEngine.SceneManag ...

  6. Unity异步加载场景

    using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Sce ...

  7. Unity 制作翻书电子书,外部异步加载千张图片(二)

    Unity 制作翻书电子书,外部异步加载千张图片(二) Hello!这是我的第二篇文章,希望在你阅读这篇文章之后对你能有帮助. 上文完成的程序,我说过只是解决了当前的问题,存在了很多瑕疵.例如:1.替 ...

  8. Echarts 图表在异步加载数据时,增加loading动画,提升用户体验感

    文章目录 一.简介 二.增加loading加载动效 2.1 实现原理 2.2 实现步骤 2.3 实现效果图 三.完整源代码及解析 一.简介 Echarts 图表在异步请求数据时,如果加载时间较长,一个 ...

  9. zTree异步加载(自定义图片)

    zTree官网:点击打开链接 一:文件下载 点击首页右下角的ztree download,选择Guihub下载 点击Clone or download下载 二:相关包介绍 jquery.ztree.c ...

最新文章

  1. java ftp下载文件源码_java实现ftp文件下载的源代码
  2. 自己写编译器学习总结
  3. js中split字符串分割示例
  4. c语言中freopen函数,fopen和freopen_C中freopen和fopen的区别(用法+详解+区别)
  5. Java.lang.Boolean类
  6. spring配置主库从库_spring下的数据库主从分离(下)
  7. poj2337 欧拉路径
  8. “后序遍历二叉运算树进行Lambda演算的化简”带来的联系
  9. ASC II 完整码表及简介
  10. 软件测试(十二)—— 界面测试和易用性测试
  11. JavaCV的摄像头实战之六:保存为mp4文件(有声音)
  12. thing JS笔记
  13. 创建表的几种方式(语法总结)
  14. 编辑时英文出现大间隔
  15. Javascript 10进制转16进制补0 ,16进制转10进制
  16. vue h5手机网站支付宝支付 - 前端
  17. KVM 虚机镜像操作, 扩容和压缩
  18. 极客日报:​​​字节员工操纵抖音热榜被判刑;微信群聊可直接访问电商外链;JetBrains发布新一代编辑器Fleet
  19. 社交新零售时代,你跟上了吗?
  20. 计算机科学教育专业自考,计算机科学与技术自考本科科目有哪些

热门文章

  1. 中国人唯一不认可的成功——就是家庭的和睦,人生的平淡(做为程序员的我们又追求什么样的人生呢?)值得思考???
  2. 电脑小技巧:win10我的电脑图标怎么调出来
  3. 营销手段promotion
  4. c不能做oracle关键字,C语言中的关键字不能作变量名,但可以作为函数名。
  5. 经典法定K型归一化LPF设计学习记录
  6. 搭建达梦数据库数据守护-实时主备
  7. Xcode工程,蓝色文件夹、黄色文件夹以及 .bundle文件的区别
  8. 展望计算机体系结构的未来发展方向(学院作业)随便写的
  9. unity动态生成预制体
  10. mysql 同步失败_mysql 同步失败解决方法 (错误:1236)