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编写的组件是程序还是脚本? 这些问题本文无意去解答 ...
随机推荐
- Oracle直方图的详细解析
yuanwen:http://blog.csdn.net/javacoffe/article/details/5578206 Oracle直方图解析 一. 何谓直方图: 直方图是一种统计学上的工 ...
- 当我我们用new操作符创建对象的时候,都发生了些什么?
//下面这段代码是javascript设计模式与开发实践上的一段代码 function Person( name ){ this.name = name; }; ...
- webservice jsonp格式调用
前端 $.ajax({ type: "get", url: "http://baiduzd.yihu.com.cn/APIS ...
- ArrayList与LinkedList用法与区别
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构. 2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedLis ...
- ajax基础一
AJAX AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML). AJAX 不是新的编程语言,而是一种使用现有标准的新方法. AJA ...
- BZOJ1742[Usaco2005 nov]Grazing on the Run
Description John养了一只叫Joseph的奶牛.一次她去放牛,来到一个非常长的一片地,上面有N块地方长了茂盛的草.我们可 以认为草地是一个数轴上的一些点.Joseph看到这些草非常兴奋, ...
- iOS 利用webView加载html代码,在代理中获取html页面的链接时出现的问题
getDetailWebview.loadHTMLString(webViewData as String, baseURL:NSURL(string: "\(ProBaseWeb)&quo ...
- Python 10 —— 杂
Python 10 —— 杂 科学计算 NumPy:数组,数组函数,傅里叶变换 SciPy:依赖于NumPy,提供更多工具,比如绘图 绘图 Matplitlib:依赖于NumPy和Tkinter
- CentOS常用的文件操作命令
CentOS下面常用的文件操作命令: cd pwd NO1. 显示当前路径 [root@rehat root]# pwd NO2. 返回用户主目录 [root@rehat root]# cd NO3. ...
- 简单的比大小 shell 脚本和ping
#!/bin/bash echo "输入第一个数字"read Aecho "输入第二个数字"read B if [ $A -gt $B ] thenecho & ...