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编写的组件是程序还是脚本? 这些问题本文无意去解答 ...
随机推荐
- SQL语句性能测试
/* --Sqlserver 清楚执行缓存, 用于SQL语句性能测试 DBCC DROPCLEANBUFFERS DBCC FREEPROCCACHE */
- jsp jsp指令
JSP 由HTML和java语句拼接而成的文本,后缀名为.jsp 1.Jsp翻译成servlet:先翻译,Tomcat将翻译后的文件放置在安装目录下(所有JSP页面本质上就是Servlet程序) 2. ...
- UITableViewCell的highlighted 和selected 属性1
将UITableViewCell的selectedBackgroundView设置为按下图片的状态,同时不支持多选的情况下,遇到如下问题: 如果默认第一个cell处于selected状态,然后再点击其 ...
- webservice jsonp格式调用
前端 $.ajax({ type: "get", url: "http://baiduzd.yihu.com.cn/APIS ...
- UWP中GridView右击选中的实现
问题帖子 https://social.msdn.microsoft.com/Forums/windowsapps/en-US/68d0e47d-c974-47b9-a6b8-d55b4989d732 ...
- hdoj 2022 海选女主角
Problem Description potato老师虽然很喜欢教书,但是迫于生活压力,不得不想办法在业余时间挣点外快以养家糊口.“做什么比较挣钱呢?筛沙子没力气,看大门又不够帅...”potato ...
- Spring overview
引子 接触Java很多年了,各种framework,却从未系统的去了解过.最近突然想清楚一件事,就是当下的目标——Focus on Java-based RESTful WS & JS.而之于 ...
- 图片预加载和AJAX的图片预加载
利用js实现图片预加载,加载所需要图片的路径与名称即可,很容易实现,该方法尤其适用预加载大量的图片: <div class="hidden"> <script t ...
- Don't Block on Async Code【转】
http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html This is a problem that is brough ...
- 关于display: box 和 box-flex
这两天做手机项目,使用到这个css3新属性.现在还不为所有浏览器支持,所以使用的时候要加上前缀.使用方法见下面: html代码: <div class="s-indLine" ...