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的前提下动态加载预设的更多相关文章

  1. Unity3D热更新全书-PageZero

    由于深刻的认识到自己是个思维跳跃的人,深入浅出是个我还要努力很久的目标,为了让大家不至于在我乱七八糟的文字中迷失,特整理目录一份 无分类 <Unity3D热更新全书-何谓热更新,为何热更新,如何 ...

  2. Unity3D热更新全书-重头再来

    之前写了Unity3D热更新全书系列Blog 提出了下载.加载.脚本三个方面的开源类库 下载方面有EasyDown加载方面有GameObjParser脚本方面有C#Light另外有一个没有独立成库,但 ...

  3. Unity3D热更新全书FAQ

    只要有程序员朋友们问过两次的问题 就会收录在此FAQ中 1.C#Light对比LUA有什么好处 C#Light是静态类型脚本语言,语法同C#,Lua是动态类型脚本语言,这两种都有人喜欢. 我更喜欢静态 ...

  4. Unity3D热更新全书-何谓热更新,为何热更新,如何热更新

    首先来赞叹一下中文,何谓为何如何,写完才发现这三个词是如此的有规律. 为何赞叹中文?因为这是一篇针对新手程序员的文字,是一节语文课. 然后来做一下说文解字,也就是 何谓热更新 热更新,每个程序员一听就 ...

  5. Unity3d热更新全书-加载(一)从AssetBundle说起

    Unity3D动态下载资源,有没有解?有,AssetBundle就是通用解,任何一本书都会花大幅篇章来介绍AssetBundle. 我们也来说说AssetBundle 我们试全面的分析一下Unity3 ...

  6. Unity3D热更新全书-下载 唯一的一篇

    下载在这个时代实在是太平常了,每个人都深刻的理解着下载到底是什么. 这一篇文字只是把下载的代码分享并介绍,而已. 首先,下载系统担负着几个使命. 第一.是保持客户端版本库的最新. 第二.是下载要能够比 ...

  7. Unity3D热更新全书-脚本(二) 两级分化

    上篇明确了我们探讨的脚本是什么:是写在文本文件里面的代码,可以作为资源加载,取得字符串再执行. 可是为什么世界上会有那么多的脚本?而其使用方法完全看起来不一样呢?这是因为每种脚本都有自己的定位,在不同 ...

  8. Unity3D热更新全书-脚本(四) 用C#LightEvil搭建实际开发使用的脚本框架

    C#LightEvil之前提供了很多和Unity结合的例子,都是采用把脚本文件放置在StreamingAssets中的方法. 这样可以利用Unity的特性,放在这个目录中的CS文件会被编译器编译,我们 ...

  9. Unity3D热更新全书-脚本(一) 初识脚本

    开篇之前还是要先说明,这是一份给经验并不丰富的程序员阅读的文字. 有需求.有疑惑,往下看. 第一个问题什么是脚本?程序和脚本如何区分?我们给Unity编写的组件是程序还是脚本? 这些问题本文无意去解答 ...

随机推荐

  1. gcc与gdb版本兼容问题

    今天在用gdb调试C++程序的时候,想用"p i”命令打印出程序的一个局部变量i,却一直提示: No symbol "i" in current context. 我愣了 ...

  2. 本地socket使用AF_UNIX

    int socket(int domain, int type, int protocol); domain参数代表地址族,我们最常用的是TCP/IP协议通信中使用的是AF_INET,在有些情况下建立 ...

  3. javascript鸭式辩型法实现接口

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...

  4. ASP.NET页面之间传递值的几种方式

    目录 QueryString Session Cookie Application 一.QueryString QueryString是一种非常简单的传值方式,他可以将传送的值显示在浏览器的地址栏中. ...

  5. "i++"和"++i"浅析

    public class a{     public static void main(String[] args){         int k =100;         k++;//k+=,k ...

  6. PHP二维数组排序

    $arrays   要排序的数组 $sort_key 根据排序的key $sort_order 升序降序    SORT_ASC/SORT_DESC $sort_type 排序key类型 SORT_N ...

  7. mysql下载安装

    1.下载 下载地址:http://dev.mysql.com/downloads/mysql/ 根据电脑配置来选,我选了 windows(x86,64-bit),ZIP Archive这个,点击Dow ...

  8. C#基于Office组件操作Excel

    1.    内容简介 实现C#与Excel文件的交互操作,实现以下功能: a)     DataTable 导出到 Excel文件 b)     Model数据实体导出到 Excel文件[List&l ...

  9. bdb mvcc: buffer 何时可以被 看到; mvcc trans何时被移除

    # txn.h struct __db_txnregion SH_TAILQ_HEAD(__active) active_txn; SH_TAILQ_HEAD(__mvcc) mvcc_txn; # ...

  10. SAS 画折线图PROC GPLOT

    虽然最后做成PPT里的图表会被要求用EXCEL画,但当我们只是在分析的过程中,想看看数据的走势,直接在SAS里画会比EXCEL画便捷的多. 修改起来也会更加的简单,,不用不断的修改程序然后刷新EXCE ...