unity Resources异步加载 unity异步加载原理_unity

 知识点一  Resources异步加载是什么

unity Resources异步加载 unity异步加载原理_异步加载_02

 知识点二 Resources异步加载方法

unity Resources异步加载 unity异步加载原理_加载_03

 1、通过异步加载中的完成事件监听 使用加载的资源

unity Resources异步加载 unity异步加载原理_unity Resources异步加载_04

 当我们使用Resources的LoadAsdync函数进行异步加载文件时,如果我们只是做到这一步,那么运行起来是没有任何效果的。这里完成的仅仅只是将配置环境、数据加载。这里就有一个问题了,我们如果知道它是否加载完毕?

看一下它的返回类型是一个ResourcesRequest类型,进入内部:

unity Resources异步加载 unity异步加载原理_异步加载_05

它的基类AsyncOperation,有一个事件,completed

unity Resources异步加载 unity异步加载原理_异步加载_06

 当加载完成后,这个函数会调用completed事件,通知外部加载完毕了。我们可以通过监听这个事件去检测加载是否完成。给completed事件加一个新的委托,当加载完成时系统调用completed,执行LoadOver(AsyncOperation rq)。打印加载结束。

unity Resources异步加载 unity异步加载原理_unity_07

 加载完成图片,我们需要使用它。我们在OnGUI中去使用。

unity Resources异步加载 unity异步加载原理_异步加载_08

注意这个判断是否为null,异步加载是需要一定时间去加载文件的。不是马上就完成加载。因此要做出一个条件判断。

什么时候将资源实例化呢?

unity Resources异步加载 unity异步加载原理_unity Resources异步加载_09

 当异步加载完成时,asset这个公共属性会得到加载的资源。我们通过调用asset来得到里面的内容。

注意这里需要两次as 转换

第一次as: 因为asset是ResourcesRequest的属性。所以将AsyncOperation转为ResourcesRequest

第二次as:asset返回的是Object类型,我们要用Texture去接收。所以是Object转Texture;

unity Resources异步加载 unity异步加载原理_异步加载_10

unity Resources异步加载 unity异步加载原理_游戏引擎_11

unity Resources异步加载 unity异步加载原理_游戏引擎_12

 2、通过协程使用加载的资源

首先创建一个协程:

unity Resources异步加载 unity异步加载原理_异步加载_13

 yield return 会返回一些特点的内容。将rq作为yield return的返回值。

unity Resources异步加载 unity异步加载原理_加载_14

 ResourcesRequest基类为AsyncOperation

unity Resources异步加载 unity异步加载原理_unity Resources异步加载_15

 AsyncOperation为YieldInstryction

unity Resources异步加载 unity异步加载原理_异步加载_16

WaitForSeconds基类也是YieldInstryction。

unity Resources异步加载 unity异步加载原理_游戏引擎_17

 证明ResourcesRequest 也是和协程有关系的。

unity Resources异步加载 unity异步加载原理_异步加载_18

 当资源加载完,才会执行后面的代码。资源加载完后,将图片实例化。

unity Resources异步加载 unity异步加载原理_unity_19

 测试:

unity Resources异步加载 unity异步加载原理_游戏引擎_20

 属性的使用。

unity Resources异步加载 unity异步加载原理_游戏引擎_21

 以上的两种方法,无论是通过时间completed还是通过协程,主要都是解决的一个问题,文件是否加载完成?因为我那么只有当文件加载完成,才能进行实例化。而第一种方法,是使用completed来完成加载完成实例化,第二种则是系统帮助我们完成了是否加载完成判断。

unity Resources异步加载 unity异步加载原理_异步加载_22