Unity3d热更新全书-加载(二)如何在不用AssetBundle的前提下动态加载预设
Unity3D的主要构成大家都知道,首先是场景图,场景图上的节点构成一颗树。
每个节点对应一个GameObject对象
然后每个GameObject有若干个组件
有一些组件会与资源产生关系,比如MeshRenderer会关联材质,材质会关联shader和贴图
场景图的一部分可以被保存为一个预设,prefab。
有时候我们会需要用预设去复用,而预设的加载似乎只能通过AB去打包,其实不然,这里我们有一个开源的库就可以解决这个问题。
为什么不使用AB,可以见上一篇,加载(一),不使用AB一份资源全平台统一,也没有痛苦的打包时间,资源依赖也很容易处置
代码在GITHUB https://github.com/lightszero/easydown
其中unity_sceneexport演示场景生成
unity演示场景加载。
一、文件生成

我们先编辑一个场景,随意一些.
然后选中他的节点,导入我们GameObject组件和MyJson组件
菜单上会多出一项,点击它
会显示出所有的节点,点击Parser
注意由于名字是很重要的信息,这里名称重复,我们的导出会有影响,需要保证,同一层次的对象名字不重复。
修改一下再导出吧。
就会把这个预设导出成我们自定义的格式。然后easydown就可以不使用AB就把这个场景加载出来。

之后会生成这些文件。
二、文件加载
例子中有这样一行,具体的设计就请自由分析了

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

三、分析
使用和加载的地方都很简单,可是这其中是如何完成的,你肯定会有一些好奇。
代码都在,可自行分析,我们这里把大体思路分析一下。
首先对于场景树和每一个组件的信息,我们都保存到了一个json内。
然后组件的保存这里做了些特殊处理,因为组件的参数可能会关联到树上的其他组件或者GameObject,这里就另外有一份关系表。
最后对于一些复用资源,如贴图、模型是独立保存的。
并且对于布局还导出了一份布局依赖资源。
这样加载布局时,先加载布局文件盒布局依赖文件,然后根据依赖文件再加载对应的资源。
最后将布局文件还原成场景树。
这并不是一个框架就能全部解决的事情,因为我们不能利用官方的组件序列化和还原的方法,所以我们需要针对每一个组件编写处理程序。

这个例子中已经带入了将一个模型渲染出来所涉及到的那些组件的处理程序。
我们项目中是用这种框架将NGUI的每一张界面打散处理。

由于开源项目不能携带NGUI,我将这些组件暂时注释掉了,但你都可以从github项目中找到他们。
另外这个演示用的框架是我另外写的,在原先的代码上做了些调制,使用这些NGUI组件处理器可能还要稍微改写。
不过对于能吃透这个机制,看懂这个框架的人来说,这都不算什么。
Unity3d热更新全书-加载(二)如何在不用AssetBundle的前提下动态加载预设的更多相关文章
- Unity3D热更新全书-PageZero
由于深刻的认识到自己是个思维跳跃的人,深入浅出是个我还要努力很久的目标,为了让大家不至于在我乱七八糟的文字中迷失,特整理目录一份 无分类 <Unity3D热更新全书-何谓热更新,为何热更新,如何 ...
- Unity3D热更新全书-重头再来
之前写了Unity3D热更新全书系列Blog 提出了下载.加载.脚本三个方面的开源类库 下载方面有EasyDown加载方面有GameObjParser脚本方面有C#Light另外有一个没有独立成库,但 ...
- Unity3D热更新全书FAQ
只要有程序员朋友们问过两次的问题 就会收录在此FAQ中 1.C#Light对比LUA有什么好处 C#Light是静态类型脚本语言,语法同C#,Lua是动态类型脚本语言,这两种都有人喜欢. 我更喜欢静态 ...
- Unity3D热更新全书-何谓热更新,为何热更新,如何热更新
首先来赞叹一下中文,何谓为何如何,写完才发现这三个词是如此的有规律. 为何赞叹中文?因为这是一篇针对新手程序员的文字,是一节语文课. 然后来做一下说文解字,也就是 何谓热更新 热更新,每个程序员一听就 ...
- Unity3d热更新全书-加载(一)从AssetBundle说起
Unity3D动态下载资源,有没有解?有,AssetBundle就是通用解,任何一本书都会花大幅篇章来介绍AssetBundle. 我们也来说说AssetBundle 我们试全面的分析一下Unity3 ...
- Unity3D热更新全书-下载 唯一的一篇
下载在这个时代实在是太平常了,每个人都深刻的理解着下载到底是什么. 这一篇文字只是把下载的代码分享并介绍,而已. 首先,下载系统担负着几个使命. 第一.是保持客户端版本库的最新. 第二.是下载要能够比 ...
- Unity3D热更新全书-脚本(二) 两级分化
上篇明确了我们探讨的脚本是什么:是写在文本文件里面的代码,可以作为资源加载,取得字符串再执行. 可是为什么世界上会有那么多的脚本?而其使用方法完全看起来不一样呢?这是因为每种脚本都有自己的定位,在不同 ...
- Unity3D热更新全书-脚本(四) 用C#LightEvil搭建实际开发使用的脚本框架
C#LightEvil之前提供了很多和Unity结合的例子,都是采用把脚本文件放置在StreamingAssets中的方法. 这样可以利用Unity的特性,放在这个目录中的CS文件会被编译器编译,我们 ...
- Unity3D热更新全书-脚本(一) 初识脚本
开篇之前还是要先说明,这是一份给经验并不丰富的程序员阅读的文字. 有需求.有疑惑,往下看. 第一个问题什么是脚本?程序和脚本如何区分?我们给Unity编写的组件是程序还是脚本? 这些问题本文无意去解答 ...
随机推荐
- tomcat 内存问题 xms xmx permsize maxPermsize
转自:http://www.cnblogs.com/koik/p/4452029.html tomcat -Xms -Xmx -XX:PermSize -XX:MaxPermSize 在做ja ...
- SQL 2005 服务器更计算机名
select @@ServerNamesp_dropserver '288-BHGKF0MF5G6' sp_addserver '288VIP124','LOCAL' select serverpro ...
- linux下的device tree
在我个人的理解,device tree就是描述硬件设备的,目前有什么配置,把这些配置信息告诉linux内核,让内核去识别,增强了内核的通用性,不用因为平台不同而每次都要编译新内核了. 配置device ...
- json数据测试接口
json数据测试接口:http://www.xiaoqiang.org/tools/JsonView/?1348068433
- 如何搭建Java开发环境(包括下载、安装和配置JDK)和Eclipse的安装
JDK的下载 1.打开网址https://www.oracle.com/index.html 2.下载JDK JDK的安装 设置环境变量(以windows 7 为例) 1. 在“计算机”图标上单击鼠标 ...
- CentOS 访问Windows7共享文件夹
在终端中输入命令mount -t cifs -o username="xxx",password="****" //192.168.1.1/share_fold ...
- Python 7 —— 扩展与嵌入
Python 7 —— 扩展与嵌入 所谓扩展是指,在Python当中调用其他语言,由于Python的问题主要是效率,这里的扩展主要是指扩展C C++程序(重点) 所谓嵌入是指,在其他语言当中可以调用P ...
- 使用git svn clone迁移svn仓库
使用git svn clone迁移svn仓库 clone命令可以指定很多参数,主要用到这些,你也可以使用git svn help查看完整的参数列表. git svn clone https://172 ...
- iOS 字符串转son json转字符串
+ (NSString*)dictionaryToJson:(NSDictionary *)dic { NSError *parseError = nil; NSData *jsonDa ...
- Navicat Premium下sql导入中文乱码解决方案
今天帮忙朋友找bug的时候,准备导入她数据库里面的数据,所以我就试图在mysql管理工具Navicat下面导入相应的mysql命令.结果发现导入的中文字符全部变成乱码,所以做了如下这种尝试: 在“连接 ...