Unity3d热更新全书-资源加载(二):不用AssetBundle的前提下动态加载prefab预设

 

本篇文章我们继续来探讨unity3d热更新,如何在不使用AssetBundle的前提下动态加载prefab预设,下面开始!

Unity3D的主要构成大家都知道,首先是场景图,场景图上的节点构成一颗树。

每个节点对应一个GameObject对象

然后每个GameObject有若干个组件

有一些组件会与资源产生关系,比如MeshRenderer会关联材质,材质会关联shader和贴图

场景图的一部分可以被保存为一个预设prefab。

有时候我们会需要用预设去复用,而预设的加载似乎只能通过AssetBundle去打包,其实不然,这里我们有一个开源的库就可以解决这个问题。

为什么不使用AssetBundle,可以见上一篇《Unity3d热更新全书-资源加载(一):从AssetBundle说起》,不使用AssetBundle一份资源全平台统一,也没有痛苦的打包时间,资源依赖也很容易处置

代码在githubhttps://github.com/lightszero/easydown

其中unity_sceneexport演示场景生成

unity演示场景加载。

一、文件生成

image

我们先编辑一个场景,随意一些.

然后选中他的节点,导入我们GameObject组件和MyJson组件

image菜单上会多出一项,点击它

image会显示出所有的节点,点击Parser

注意由于名字是很重要的信息,这里名称重复,我们的导出会有影响,需要保证,同一层次的对象名字不重复。

修改一下再导出吧。

就会把这个预设导出成我们自定义的格式。然后easydown就可以不使用AB就把这个场景加载出来。

image

之后会生成这些文件。

二、文件加载

例子中有这样一行,具体的设计就请自由分析了

image

如果正常执行这个场景就会被加载出来。

image

三、分析

使用和加载的地方都很简单,可是这其中是如何完成的,你肯定会有一些好奇。

代码都在,可自行分析,我们这里把大体思路分析一下。

首先对于场景树和每一个组件的信息,我们都保存到了一个json内。

然后组件的保存这里做了些特殊处理,因为组件的参数可能会关联到树上的其他组件或者GameObject,这里就另外有一份关系表。

最后对于一些复用资源,如贴图、模型是独立保存的。

并且对于布局还导出了一份布局依赖资源。

这样加载布局时,先加载布局文件盒布局依赖文件,然后根据依赖文件再加载对应的资源。

最后将布局文件还原成场景树。

 

这并不是一个框架就能全部解决的事情,因为我们不能利用官方的组件序列化和还原的方法,所以我们需要针对每一个组件编写处理程序。

image

这个例子中已经带入了将一个模型渲染出来所涉及到的那些组件的处理程序。

 

我们项目中是用这种框架将NGUI的每一张界面打散处理。

image

由于开源项目不能携带NGUI,我将这些组件暂时注释掉了,但你都可以从github项目中找到他们。

另外这个演示用的框架是我另外写的,在原先的代码上做了些调制,使用这些NGUI组件处理器可能还要稍微改写。

不过对于能吃透这个机制,看懂这个框架的人来说,这都不算什么。好了本篇unity3d教程到此结束,下篇我们再会!