深入理解unity资源与ab包Word文档下载推荐.docx

上传人:b****3 文档编号:6399407 上传时间:2023-05-06 格式:DOCX 页数:7 大小:136.49KB
下载 相关 举报
深入理解unity资源与ab包Word文档下载推荐.docx_第1页
第1页 / 共7页
深入理解unity资源与ab包Word文档下载推荐.docx_第2页
第2页 / 共7页
深入理解unity资源与ab包Word文档下载推荐.docx_第3页
第3页 / 共7页
深入理解unity资源与ab包Word文档下载推荐.docx_第4页
第4页 / 共7页
深入理解unity资源与ab包Word文档下载推荐.docx_第5页
第5页 / 共7页
深入理解unity资源与ab包Word文档下载推荐.docx_第6页
第6页 / 共7页
深入理解unity资源与ab包Word文档下载推荐.docx_第7页
第7页 / 共7页
亲,该文档总共7页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

深入理解unity资源与ab包Word文档下载推荐.docx

《深入理解unity资源与ab包Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《深入理解unity资源与ab包Word文档下载推荐.docx(7页珍藏版)》请在冰点文库上搜索。

深入理解unity资源与ab包Word文档下载推荐.docx

源(Asset)对象列表和指向实际AB包数据的文件对象。

AB包文件加载完成后存放在内存中,注意只有LZ4能够以压缩格式存放在内存中。

这段内存不能直接访问,由AssetBundle对象负责管理。

AssetBundle.Unload()会释放这段内存。

Asset资源

实际上unity中并没有与资源(Asset)这个词对应的类。

我们一般把从AssetBundle中

LoadAsset()出来的对象称为资源(Asset)。

AssetBundle.LoadAsset()等接口从AssetBundle对象中解压数据反序列化构建Object。

Unity完美的序列化机制可以使任何对象都可以直接序列化为连续内存块,同样任何对象都

可以通过AssetBundle.LoadAsset()反序列化为结构化对象。

AssetBundle.LoadAsset()接口返回类型是Object。

此功能也暗示了可以将任何对象从

ab包内存中反序列化出来构建。

Prefab是什么?

创建ab包时,一般会将prefab打入到包中。

游戏中通过AssetBundle.LoadAsset()将

prefab对象加载出来。

再通过加载出来的prefab构建GameObject

思考:

代码1中m_Prefab是什么?

是什么类型?

如果是GameObject,那么这个GameObject为什么没有出现在场景中?

如果是GameObject,为什么一定要通过Instantiate再次clone一个GameObject出来?

Unity的C++代码分为两部分,Runtime和Editor。

Runtime中包含引擎的所有核心功能,Editor包含编辑器所需核心功能。

Prefab.h/cpp存放于Editor中,实现了编辑器中prefab的功能。

Prefab继承于Object,包含一个指向GameObject的指针。

其功能非常简单,仅仅只是维护编辑器中prefab之间的关联关系,用来实现编辑器中prefab修改编辑功能。

Prefab只是对GameObject在编辑器中一个功能封装。

上一段源码:

从源码判断,Prefab功能非常简单,只是实现编辑器中各prefab关联编辑功能。

结论:

因此可以推断,在最终发布环境中,

并无Prefab对象存在。

代码1中LoadAsset构建

的对象是GameObject,此GameObject并不存在于当前场景(scene)中,而是被unity放到

 

了一个空场景中。

LoadAsset构建的GameObject对象,Unity希望我们把它当作资源(asset)使用。

对比代码2中m_Prefab和m_GameObject的scene变量。

思考?

为什么不能需要构建GameObject时,直接从AssetBundle中反序列化构建呢?

推测Unity希望开发者们遵循的工程实践是,将AssetBundle中反序列化构建的

GameObject作为资源(asset)进行管理。

当游戏中需要构建GameObject时,以资源(asset)为基础构建,而不是从连续内存上反序列化去构建。

从而将对象构建与数据解压解耦。

资源(Asset)

资源(Asset)是unity希望开发者们遵循的一种工程实践规范。

1.所有AssetBundle中LoadAsset出来的对象称为资源(Asset)。

2.资源(Asset)与AssetBundle之间有强耦合关系。

3.资源(Asset)不要直接被使用在业务逻辑中。

资源(Asset)和业务中创建的对象没有功能上不同。

但在使用方法上有截然不同的区分。

资源(Asset)可以由AssetBundle.Unload(true)统一强制销毁,也可以单个销毁。

但是对于同一个AssetBundle,LoadAsset出的资源(Asset)只能被销毁一次,销毁后再重复LoadAsset()会失败。

Instantiate()

英文翻译为”实例化”,个人觉得这个接口用英文克隆”clone”描述更准确。

Object.Instantiate()可以对任何对象clone。

包括Texture、Shader、AudioClip,当然应该不会有人对这类内存占用大且不会被修改的对象clone。

所以,遵循unity暗示的工程实践规范。

所有占用大量内存且不会被修改的资源(Asset)不被clone,所有需要修改的逻辑对象会被clone出一个新的实例。

如下图所示:

贴图(Texture)则保持引用。

引用与非引用资源

非引用资源类型:

建议使用Instantiate构建新对象。

GameObject被Instantiate时,GameObject包含的非引用资源也会自动被Instantiate。

GameObject

Material

引用资源类型:

这些对象,在GameObject被Instantiate时会保持引用。

Mesh

Texture

Shader

AudioClip

Bytes

最佳工程实践(Bestpractice)

由于资源(Asset)对象被销毁后,无法重复从AssetBundle中Load出来。

因此,必须所有资源(Asset)对象不再被引用时,AssetBundle才可以被销毁。

引用新创建的实例来

非引用资源,使用instantiate创建新实例,可以使用weakreference

计数对该资源的引用

引用资源,自己实现某种ReferenceCount机制

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 人文社科 > 法律资料

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2