一、插件功能( T9 u4 N% _* d+ z. Q
1、插件是发布AB包的工具5 S, \6 b* @8 O( N+ K; a: R
AssetBundle Browse可以将项目中的资源打包成AB包,发布游戏后,项目将通过加载StreamingAssets中AB包的形式,加载所需资源,而不是像之前那样,从Assets中进行加载。 1、AB包是什么. \8 J* M. x" Z. g+ t9 z' Z9 P* d
AB包全名AssetBundle(资源包)。是一种Unity提供的用于存放资源的包。通过将资源分布在不同的AB包中可以最大程度地减少运行时的内存压力,并且可以有选择地加载内容。 2、为什么要用AB包+ R9 b" _- [/ [. u/ [; A
Ⅰ、热更新 要热更新需要确保AB包打出来的资源具有唯一性,且相同资源的AB包检验码相同。 Ⅱ、Resources加载存在问题 Resources加载虽然简单方便,但是也有很多问题: % K/ o) }* _$ V& v% b7 V& W w# ]
- 对内存管理造成一定的负担。
- 在打开应用时加载时间很长。
- Resources文件夹下的所有资源统一合并到一个序列化文件中(可以看成统一打一个大包,巨型AB包有什么问题它就有什么问题),对资源优化有一定的限制。6 o; Q, G/ T, S1 l4 }
因此不建议大量使用Resources。
1 E+ A& u j* r二、安装插件的方式
+ [4 O$ e, q( C1、PackageManager安装
% r7 Q! f( A4 d) u. b$ A6 X橙子测试在Unity2019.3版本中,PackageManager中便有此插件, 同学们可以先看看自己版本的Unity是否可以直接安装。 3 o) M; `+ K1 E+ x. \ n
1 B7 g% E5 q. Z$ }6 X. Y! t/ v
& K k! o+ a0 L% _0 p/ F3 K+ G6 D2、GitHub下载
6 c1 a4 W8 @* p3 D5 k3 _( M6 h有的Unity版本是没有PackageManager的,或者PackageManager中没有此插件。 那么我们可以去GitHub下载此插件:传送门 三、插件使用方法介绍6 T0 }( J0 ~5 D+ o; i
下面介绍如何将Assets中的资源打成AB包。 1、实现导出一个AB包% Z7 Y& G) B" c( Y2 u9 V$ _: Q( n
我们以该模型为例,将该模型打成AB包。
- k2 }+ }! }6 w: W8 I- P! t- i: j- ^% I) }4 o3 O: n7 r! Z( M
. Q. j6 b+ U1 H
Ⅰ、制成预制体,并设定AssetBundle 如下图所示。 AssetBundle名字只能是小写。 * C! I' p+ p6 [& d' Z
; h" ]: \4 \. W5 P7 v. b
2 [4 |2 U4 ^: F7 H) jⅡ、AssetBundle Browser界面介绍 Window - AssetBundle Browser,可打开配置界面。 Configure界面' K5 I4 W% z+ [# r9 z; x
我们能看到所有被标记为AssetBundle的文件。 " }% h0 o3 v# A/ d; ?6 ]. Q
1 {* |3 H9 a! a+ Z: w* }, N " z9 E$ P- j- L! T9 A
Build界面' q, l$ A4 F3 v7 d2 i
该界面是进行打包的界面。
# }' z9 H/ \: P' c: _5 k; T) W& E- Build Target:选择发布的平台
- Output Path:输出路径
- Clear Folders:构建之前清空文件夹(会把文件夹删除)
- Copy to StreamingAssets:拷贝至StreamingAssets文件夹
- Compression:选择压缩格式
: z6 j) r) _* h
' ?3 z% O5 D; P8 F! I" t) e
3 |" q: K: v, V$ s7 D% r4 a. {Inspect界面. _, X; x# A% o1 ?
这个界面会展示已经打成AB包的包内部信息。 选择左上角的 Add Folder,选择AssetBundle所在的目录。然后该界面左侧会列出该文件夹下的所有AB包。 在左侧展示的文件列表中任选一个AssetBundle,右边会展示AssetBundle内部的信息,包括它包含的资源,预加载的组件和依赖等等。 右上角的 -键可以从列表中删除当前选中的文件夹。
P3 A6 o/ } ]! @6 m/ w+ C4 f( k1 ~ Q' q5 y' E
: R2 D7 r( k: V) O" i3 B2 r" ^0 k
Ⅲ、完成打包 点击Build即可对当前Browser中所有的bundle进行打包,选择路径,即可在该路径下看到生成的资源文件。 若你勾选了Copy to StreamingAssets,还会自动帮你拷贝到StreamingAssets文件夹 7 A0 p& Z- Y+ o- @7 N
5 t3 a+ N; m$ Z- J
7 e* Y) j! i8 ` _2、实现资源复用
7 C* g1 w8 l) M) I1 D📢 什么是资源复用' C! T% ~, I+ c% C4 M
在打包的过程中,有很多资源都是重复的。例如: # q4 y5 t1 F, b& @4 j
- 多个预制体使用的同一个模型,预制体只是材质颜色不同。
- 有图片,被多个预制体使用。! a7 x; D4 v: {) t1 I
如果分别打AB包,这样会造成包体过大。9 ]" {6 R% [. b" `2 l
AssetBundleBrowser提供了解决方法,用创建共享AB包的形式,很好的解决掉了这一问题,实现了资源的复用。 Ⅰ、一个资源重复的现象
2 ~1 b i z) T7 E我们实现一个资源重复的现象: 6 x. m& v( l0 u2 e O8 M
- 制作Trigger的复制预制体,新建材质球,替换它的原始材质球。
- 给该预制体的AssetBundle重命名为tiggernew; R1 l7 E9 H; [6 d0 i, A
$ d2 g/ @0 k% W
. k' h; s' H- B7 o
Ⅱ、创建共享AB包& ~" p( L; F1 R( |6 l& M
我们此时再次打开AssetBundle Browser,可以看到很多感叹号。 8 m7 M/ T) H% [
- 左侧预制体的感叹号,代表它们其中有重复的资源
- 右侧包体内的感叹号,代表是这些资源重复+ R: t$ ]( ` b0 p* `. S
0 u1 z+ V9 r2 V* T; F( c
. E/ |' }" A1 H
创建res AB包: 在左侧右键,Add new bundle,创建一个res包(该名子可自行命名)。后面我们用它存储重复的资源。 1 n( c* j: q8 I `7 m# o
" e6 L% v, P! ]' D* g( t 将重复资源拖到res包内: 将tiger中的重复资源拖到res包内,我们能看到拖拽完成后,其他ab包内重复的资源也消失了。现在只有一份资源。' |6 X4 O* w: W! T
8 A( M+ `8 H# k% D# [! j6 j8 w" F
+ h& I* Q0 ?6 M/ U 2 X) Y) O& y. ^9 f" n
Ⅲ、完成打包
1 E- Q. E8 o+ ]1 G! A) q- t! I同样的操作,点击Build,完成AB包的打包。 此时AB包内容如下:
( p4 ?1 c5 |7 E% G/ {' E
- j! ]4 A' s Q. v* K5 H
9 L! M5 n: @1 I v' E四、代码实例化AB包资源9 l6 c7 G5 |4 R- ^$ y; i. e. p4 v/ h
下面我们完整做完整个流程:使用代码,去加载AB包中的老虎,完成我们的整个测试。 将该脚本挂载在场景中的物体上,运行项目时,便会加载出老虎了!
3 c0 A8 T2 `, J) Z% p; d - using System.IO;7 V7 Q% Z2 e# t% T7 R/ x
- using UnityEngine;<p></p>
. J* L& ?0 A1 I9 E9 r8 v - <p style="line-height: 30px; text-indent: 2em;">public class ABTest : MonoBehaviour
( @, h/ v+ V% r9 N) V3 X. E$ i9 J - {
3 ~. `6 W' e: b z- c: Q9 @) e, r - void Start()
$ J7 f' {& \, O; t" ]% Y - {
- M2 h* g5 x5 \: K - //加载AssetBundle之前,先加载依赖的Bundle
( ^+ O T% I7 o& [% ~+ L - //字符串"StandaloneWindows",是一个文件。这个文件的名字,是根据打包脚本,打包到哪个文件夹下,这个文件就叫什么名字。3 D) P, t6 Y! t( G, e
- //字符串"AssetBundleManifest",是固定写法。
+ i: o& U& k+ W5 T: U- ~ ?& D - AssetBundle assetBundle =9 ~9 t! g R: b" W+ a
- AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "StandaloneWindows"));9 Q5 }- N4 y8 s3 E, H
- AssetBundleManifest manifest = assetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");</p>
$ {8 c7 F# p2 f8 d - <p style="line-height: 30px; text-indent: 2em;"> //字符串"tiger",是你要加载的老虎模型预制体的名字
; k& p) P4 B8 @- K4 p - foreach (var item in manifest.GetAllDependencies("tiger"))
5 F* x; l) b9 ]* d7 l; N6 q - {5 o# c5 p! U" x2 \, B4 I0 o
- AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, item));
8 [8 s1 D" d4 l - }</p>
" ^! ~/ p* s% h7 D5 a - <p style="line-height: 30px; text-indent: 2em;"> //------若要加载的文件只是一个视频或者其他,无依赖,可只做下面,直接加载Bundle文件,直接读Bundle即可------//</p>
+ `9 @' @5 B# z" j. ]& n& E - <p style="line-height: 30px; text-indent: 2em;"> //现在便可以加载模型了
& C# B# x9 P. C3 {. _2 A+ W - string modelPath = Path.Combine(Application.streamingAssetsPath, "tiger");
. D& D) a% @+ @6 w! w) C" } - AssetBundle useAb = AssetBundle.LoadFromFile(modelPath);
+ t6 ?/ x9 G0 b1 ~0 ], ]+ T - GameObject obj = useAb.LoadAsset<GameObject>("Tiger");</p>
9 g* B7 Y2 N) H+ O0 v. e - <p style="line-height: 30px; text-indent: 2em;"> Instantiate(obj, transform);
6 \/ T$ K ]& |1 {$ H - }
7 _0 O; |5 K1 k& P) k - }</p>
复制代码 好啦,这就是本章所有内容 ~& j6 x3 T, v! F5 |. ?8 n% g/ K
$ Z& i; r* r& ]) y( T0 ^ |