搜索
查看
编辑修改
首页
UNITY
NODEJS
PYTHON
AI
GIT
PHP
GO
CEF3
JAVA
HTML
CSS
搜索
Gausst松鼠会
这个屌丝很懒,什么也没留下!
关注作者
热门标签
jquery
HTML
CSS
PHP
ASP
PYTHON
GO
AI
C
C++
C#
PHOTOSHOP
UNITY
iOS
android
vue
xml
爬虫
SEO
LINUX
WINDOWS
JAVA
MFC
CEF3
CAD
NODEJS
GIT
Pyppeteer
article
热门文章
1
深入理解Linux文件系统与日志分析(内涵理论与XFS、EXT文件数据恢复实验)_run/user/42注销gdm
2
大型国有金融企业研发中心DevOps规划与实践
3
javaScript进阶 ES6 详细全解,解构赋值,Proxy,箭头函数,class类, 模块,export和import,Promise,then 方法,async等等_es6 class proxy
4
自然语言处理:解密人工智能的语言革命
5
23种设计模式总结_23种设计模式哪个最常用
6
贪心算法——最小生成树
7
如何登录无线web认证服务器,路由器如何设置web认证的方式连接免费WIFI
8
Jira配置LDAP实现统一认证_jira 与ldap对接配置
9
navigator.userAgent.toLowerCase()判断浏览器的类型_window.navigator.useragent.tolowercase()
10
关于tkinter下点击按钮界面未响应的解决办法_python tkinter 点击button后页面没有反应
当前位置:
article
> 正文
unity5.X AssetBundle资源打包(一 )_unity 5.x资源包
作者:Gausst松鼠会 | 2024-02-22 00:48:06
赞
踩
unity 5.x资源包
之前曾经写了一篇博客介绍Unity5的AssetBundle,结果似乎很受关注。不过似乎很多人看了之后都不懂,主要是因为不太明白AssetBundle是什么,它的依赖关系和结构是什么的,就直接想拿代码去用,而导致了很多人说看不懂啊,说什么有错误啊,诸如此类。我想了一下,还是应该从最基础的东西说起,不厌其烦的说,才会省去大家加我QQ问问题了,毕竟平时上班忙,看到一些人把我当翻译词典查,我肯定会态度不好的。
一、什么是AssetBundle
估计很多人只知道Unity的模型之类的东西可以导出成一种叫做AssetBundle的文件,然后打包后可以在Unity程序运行的时候再加载回来用。
那么AssetBundle是一个什么样的东西呢?其实AssetBundle只是一种使用LZMA压缩方式压缩的资源文件。具体LZMA是什么请百度,你可以理解成就是一种压缩文件就行了,至于它的后缀名是什么,一点关系都没有,你可以自己定。
AssetBundle打包的时候,你可以指定一个mainAsset,那么加载完之后就可以通过AssetBundle.mainAsset来获取到了。你也可以不指定mainAsset,直接打包一堆内容进去,然后加载后通过AssetBundle.LoadAsset指定名字的读取出来。
在资源之间,存在着依赖的关系。你可以把资源拆分得很细,比如一个模型,由网格模型、材质、贴图构成,你可以把每一个小部分都拆开,各自打包成压缩文件。当Unity需要加载使用的时候,把该模型的所有依赖的小资源都加载起来,然后根据依赖关系组装,就变回了我们看到的资源了。
二、AssetBundle的依赖结构
要说明依赖关系结构,我们还是使用上面的例子,一个模型,分为了
网格模型、材质、贴图。那么他们是怎样依赖的呢?然后在Unity5的打包里面,他们是怎样表现出依赖关系的呢?
接下来做一个小小的实验:
我准备了4张贴图,分别叫做t1、t2、t3、t4,然后建立了两个材质球,分别是m1、m2,m1材质使用了t1、t2、t3三张贴图,m2材质使用了t4贴图。
最后建立两个模型,我就使用unity内置的模型了。obj1是一个cube,obj2是一个quad。obj1使用了m1材质,obj2使用了m2材质。然后obj1和obj2都做成了预设,放在了
Assets/Resources/Obj/下面
那么现在他们的结构应该是这样的:
接下来,先只设置obj1的assetBundleName,然后导出
导出之后,我们看看AssetBundle.manifest
里面只有一个Info,就是刚才我们命名的obj1.ab,而obj1.ab下面的Dependencies是空的,也就是它没有任何依赖了。
再看看obj1.ab.manifest
它里面包含了类型的哈希码、Assets资源的路径,和依赖。这里它的依赖还是空的。
接下来把obj2也赋予AssetBundleName:
再导出,会发现除了刚才的文件以外,会多了2个文件,就是obj2.ab和
obj2.ab.manifest。
还是打开
AssetBundle.manifest看看,会发现
这次的Info变成了2个,分别是obj1.ab和obj2.ab
打开
obj1.ab.manifest
发现和刚才没什么变化。
再看看
obj2.ab.manifest
它的结构和
obj1.ab.manifest差不多。
刚才只是把2个模型设置了导出AssetBundle,接下来我会把两个材质和四张贴图都设置导出
不厌其烦的把图贴上来:
这时候导出,我们的所有依赖关系都应该存在了。导出之后,多了很多文件,是这样的:
再来看
AssetBundle.manifest
这次看到的Info有7个了,其实我们设置了多少个AssetBundleName导出,它就应该有多少个Info。
看
obj1.ab.manifest
这次看到它的Dependencies,会看到有依赖了,写的是一个本地的地址。有人会说,这个绝对路径有问题啊,我把这个文件放到cdn上面,路径就会不对啊。这个先不急,下面会说明是什么回事。
看m1.ab.manifest
会发现结构差不多,但依赖列表里面会有三个地址,就是我们三张贴图的地址了。
看obj2.ab.manifest 和 m2.ab.manifest情况会差不多
接下来,要做最后一步试验了,比如刚才我已经是整个项目的导出了,现在我突然需要改动其中的一个小部分,现在我就把t4不导出了。
那么现在我们再整个项目的AssetBundle导出,会怎样?
导出完之后,看目录,会发现文件和刚才是一样多的,t4.ab并没有被删掉。
再看
AssetBundle.manifest
Info变成6个了,而里面某些项的依赖列表变了
看obj1.ab.manifest
和刚才没有变化
看obj2.ab.manifest
和刚才也是没有变化的
看m2.ab.manifest
这里的依赖列表没有了。
这其实就是AssetBundle的链式结构和增量打包了。一个小的部分改变了,它将会改变的地方只有总的A
ssetBundle.manifest,还有直接依赖于它本身的manifest。其他不依赖的部分是不需要重新打包的。
还有一点需要注意的地方是,除了manifest文件以外,还有一个没有后缀名称的AssetBundle文件。这个文件其实才是包含了所有的依赖关系的总的依赖关系配置文件,刚才我们能用txt打开的manifest文件,都只是用来做本地依赖关系和增量打包的时候用的。我们加载AssetBundle的时候,完全不需要加载那些manifest文件的,只需要那个
没有后缀名称的AssetBundle文件就行了,它代表的是该项目的所有AssetBundle的依赖关系。
所以,刚才我们看到manifest里面用的都是本地的绝对路径,那是针对你本地打包时用的,和加载无关。
三、导出AssetBundle和自动设置名称
刚才我们都是直接的输入AssetBundleName来导出AssetBundle的,其实这一步可以使用代码自动完成
在Unity项目内部,每一个小的资源(网格、材质、贴图、声音等),都会有一个唯一的哈希Id的,是一串很长的字母和数字组合。我们可以通过AssetDatabase.AssetPathToGUID来获得这个ID。
那么自动设置就变得简单了,可以通过以下的代码,我们可以设置一个总的prefab的AssetBundleName,然后自动获得它身上的所有依赖,然后获得每个依赖资源的唯一Id,再赋予AssetBundleName就行了
四、加载AssetBundle的步骤
通过上面导出AssetBundle的说明,估计现在想要把它加载起来就变得简单了。
首先需要明白一个规则,资源的依赖关系组装是unity本身会自动完成的。比如一个资源A,它是依赖于资源B和资源C的,那么如果我们需要加载资源A进来并正确的显示出来,我们必须先把资源B和资源C加载,然后再加载资源A。当资源A加载进来之后,发现内存里面已经有资源B和资源C了,它会自动的组装起来。
那么再看看加载的步骤了:
1、获得总的依赖配置
刚才已经说明了,真的有用的依赖配置文件是
没有后缀名称的AssetBundle文件,所以我们需要加载的就是这个文件了。
string mUrl = Cdn + "AssetBundle";
然后www加载。
之后很多人看不懂,说我这个Cdn是什么东西,“AssetBundle”又是什么东西,现在应该明白了吧?Cdn就是你的资源服务器路径,“AssetBundle”就是文件名,它没有后缀。
加载后,通过AssetBundle.LoadAsset("AssetBundleManifest"),就可以把刚才那个没有后缀名的文件转成AssetBundleManifest对象
mainfest。
2、根据名称找到目标加载资源的所有依赖
获得了AssetBundleManifest对象
mainfest
之后,比如我们实际上是需要加载obj1.ab的,这在刚才的AssetBundle.manifest里面可以知道,它的Info里面就有obj1.ab。然后我们通过
string[] dps = mainfest.GetAllDependencies("obj1.ab");
就可以获取到obj1.ab的所有依赖了,包括了子依赖,比如它依赖于m1.ab,然后m1.ab依赖于t1.ab、t2.ab、t3.ab,那么这里获取到的就应该是4个依赖了。分别是m1.ab、t1.ab、t2.ab、t3.ab。
3、加载所有依赖的资源
获取到obj1.ab的所有依赖之后,就应该逐个的去加载他们了。分别www加载他们,然后保存他们的AssetBundle。
4、加载目标加载资源
当加载了所有的依赖资源之后,就可以光明正大 的去加载目标资源了,这里我们的目标资源就是obj1.ab。
5、实例化显示
obj1.ab加载完之后,你爱怎样用都可以,直接实例化出来吧。
由于AssetBundle是不能重复加载的,如果你需要多次加载一个资源,你有2个选择,要么加载了就Unload(false)卸载了它。要么你可以把它存起来,当需要相同名字的AssetBundle的时候,直接取出来。
五、最后的建议
1、Unity5的新版AssetBundle好像是一套全新的系统,其实和旧系统的差别并没有很大,只是自动生成了依赖配置文件而已。这一个步骤实际上完全可以自己实现的,那些配置文件可以用自己喜欢的格式生成,然后加载的时候再自己想办法把依赖关系找回来就行了。
2、个人觉得把AssetBundle拆得太碎并不是一件好事情。为什么这么说呢?用过电脑的人都知道,拷贝文件的时候是一个个碎的文件拷贝快?还是把一堆文件压缩成一个包,然后拷贝快?如果加载一个模型,需要分别加载十几次依赖资源,才能显示,这个过程中发送这么多的www或者http请求,过程有点危险。至于说冗余文件的问题,自己考虑一下分布策略吧。
2、
一般来说,这种东西都需要配合着一套资源管理的系统来用的,所以在上一篇博客里面,我只是介绍新AssetBundle的特性,不太可能整一套系统都搬出来,只写了几句有代表性的关键方法当做伪代码来说明
声明:
本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:
https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/127672
推荐阅读
article
Unity
Shader 字段
类型
_
unity
shader
定义
float2
类型
...
1. 外部可设置值的
类型
格式: [可选属性]内部使用名字(“外部显示名字”,
类型
) = 默认值_Mask(“Mask T...
赞
踩
article
unity
shader
入门(
一
) 基本
结构
和变量
声明
_
unity
shader
bool
怎么
声明
...
文章目录前言
一
、pandas是什么?前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这...
赞
踩
article
【
Unity
Shader
实战】
卡通
风格
的
Shader
(一)
_
卡通
shader
...
呜,其实很早就看到了这类
Shader
,
_
卡通
shader
卡通
shader
写在前面 本系列其他...
赞
踩
article
Unity
Shader
入门 一《
Shader
变量》
_
unity
shader
bool
...
CG类型CG支持7种数据类型: float 32位浮点数half 16位浮点数int 32位整形数fixed 12位定点...
赞
踩
article
unity
-
shader
(入门)
_
unity
3d
shader
...
Legacy Shaders/Particles/Additive 实现部分叠加效果,并非完全叠加,没有Addtive明...
赞
踩
article
【
Unity
Shaders】
Alpha
Test
和
Alpha
Blending
_
alphatest
...
写在前面关于alpha的问题一直是个比较容易摸不清头脑的事情,尤其是涉及到半透明问题的时候,总是不知道为什么A就遮挡了B...
赞
踩
article
Unity
URP管线之
Cull
(表面剔除)
Cull
off &
Cull
back &
Cull
...
shader
Lab语句说明
Cull
Off不剔除
Cull
Back(默认)剔除背面(内表面)
Cull
Front
剔除正面...
赞
踩
article
Unity
Shader
Toggle
Drawer 布尔开关变量 [
Toggle
]
设置
属性
,真机失...
把一个类型的
属性
显示为一个开关,它的值要么是0要么是1。当选中它时,
Unity
还会
设置
一个名为大写
属性
名_ON(可以自定...
赞
踩
article
Unity
shader
入门之
数据类型
_
shader
float3
数组
...
包括基本
数据类型
向量
数组
结构体一.基本
数据类型
float half fixedfloat 32位 half 16 ...
赞
踩
article
【
Unity
Shaders
】
Transparency
—— 使用alpha通道创建透明效果_uni...
本系列主要参考《
Unity
Shaders
and Effects Cookbook》一书(感谢原书作者),同时会加上一...
赞
踩
article
【
Unity
Shader
s】初探
Surface
Shader
背后
的机制_
surfaceshader
...
转载请注明出处!写在前面一直以来,
Unity
Surface
Shader
背后
的机制一直是初学者为之困惑的地方。Unit...
赞
踩
article
Unity
Shader
初涉之
--
布尔值控制
Shader
使用哪种计算_
unityshader
申...
最近开始学习
Shader
,深深被它的功能所折服,而在使用时会产生一个需求,能不能用一个布尔值去控制
Shader
的运算逻辑...
赞
踩
article
【
Unity
Shader
】
Properties
属性定义中
bool
类型无法使用的替代_
unity
s...
在
shader
中,无法使用
bool
类型变量,如下写法会报错。_IsTrue("Istrue",
bool
) = true...
赞
踩
article
Unity
Toon
Shader 卡通
着色器
_
unity
卡通
着色器
...
一直对非真实感渲染 (Non-Photorealistic Rendering) 很感兴趣,正好发现某社出的新游戏中可以...
赞
踩
article
Unity
Shader
- 实现类似UI顺逆时针的
遮罩
,
还可以调整
遮罩
的颜色_
unity
旋转
遮罩
...
运行效果思路先将UV转换
,
如下图只需要下面代码
,
就可以将上、下翻转Y坐标轴了uv = fixed2(uv.x, 1 - ...
赞
踩
article
【Unity Shaders】
Vertex
& Fragment Shader入门_
unity
ve...
写在前面_
unity
vertex
shader
传参给
fragment
shader
unity
vertex
sha...
赞
踩
article
Unity
Shader
实现卡通渲染
效果
_
unityshader
刷墙
效果
...
这次实现一下一个卡通着色器
效果
_
unityshader
刷墙
效果
unityshader
刷墙
效果
...
赞
踩
article
Unity
Wireframe
shader
线框
材质
使用教程_
unity
模型科技线条...
????
线框
助力科技感_
unity
模型科技线条
unity
模型科技线条 ...
赞
踩
article
Unity
Shader
卡通渲染 (五):仿日式
赛璐珞
风格
Shader
(
顶点
外扩
描边
)_shad...
上一篇传送门:https://blog.csdn.net/qq_27534999/article/details/101...
赞
踩
article
unity
ShaderLab
基础之【
透明
测试
AlphaTest
】
AlphaTest
详解_unit...
一 基础介绍1
透明
度当一个具有
透明
度的物体挡住另一个可见问题时,光线会穿过带有
透明
度的物体,使我们能看到后面那个物体的...
赞
踩
相关标签
unity
游戏引擎
shader
矩阵
线性代数
游戏开发
unity3d
着色器
Unity Shader
Unity Shader UI图表遮罩
卡通渲染
Unity
线框材质
wireframe