|
一、插件功能6 |: r8 G' V% J
1、插件是发布AB包的工具7 t8 Q; l \/ b) f+ g2 k: \
AssetBundle Browse可以将项目中的资源打包成AB包,发布游戏后,项目将通过加载StreamingAssets中AB包的形式,加载所需资源,而不是像之前那样,从Assets中进行加载。 1、AB包是什么+ @& }$ W% I, e f. L
AB包全名AssetBundle(资源包)。是一种Unity提供的用于存放资源的包。通过将资源分布在不同的AB包中可以最大程度地减少运行时的内存压力,并且可以有选择地加载内容。 2、为什么要用AB包
8 A' U ~ r( {4 u, d" vⅠ、热更新 要热更新需要确保AB包打出来的资源具有唯一性,且相同资源的AB包检验码相同。 Ⅱ、Resources加载存在问题 Resources加载虽然简单方便,但是也有很多问题:
\2 u& J0 S! W( N7 N3 f- 对内存管理造成一定的负担。
- 在打开应用时加载时间很长。
- Resources文件夹下的所有资源统一合并到一个序列化文件中(可以看成统一打一个大包,巨型AB包有什么问题它就有什么问题),对资源优化有一定的限制。. Q; [, G" s* R) b! N l. K
因此不建议大量使用Resources。. f! M0 W$ V2 A; k- V
二、安装插件的方式
! H0 w$ M) l" n ~* ]: p% O1、PackageManager安装+ z2 G/ r; \3 f
橙子测试在Unity2019.3版本中,PackageManager中便有此插件, 同学们可以先看看自己版本的Unity是否可以直接安装。 " v0 h4 z# h% e2 ]' {& x' u
( ~; D/ j8 E: y* C: s$ ? ]
1 C# y% a4 Q5 E0 m7 B/ P0 \
2、GitHub下载6 G* Z$ i" O/ F
有的Unity版本是没有PackageManager的,或者PackageManager中没有此插件。 那么我们可以去GitHub下载此插件:传送门 三、插件使用方法介绍
' J e& d2 p. H! c6 k下面介绍如何将Assets中的资源打成AB包。 1、实现导出一个AB包/ r9 \. }) s' w0 S
我们以该模型为例,将该模型打成AB包。 # A( v4 L/ E* t C7 e+ d
U( U- {/ x8 y+ _/ `) t+ H- K
1 t: ~! z+ h" X" Q+ D* K& {Ⅰ、制成预制体,并设定AssetBundle 如下图所示。 AssetBundle名字只能是小写。
' d3 ]) a* U& p0 T" y# a 4 i5 W0 ^2 H3 R: g/ X
+ T' w: C( r) ~( [# F* `
Ⅱ、AssetBundle Browser界面介绍 Window - AssetBundle Browser,可打开配置界面。 Configure界面* U7 r: h/ M5 f3 @' i* y5 b
我们能看到所有被标记为AssetBundle的文件。 8 g1 V! M5 C: @ z8 m
) D3 a% t F0 _, r# G8 Q5 q; `
4 _1 `5 ?/ q& k, `$ A1 RBuild界面
1 }+ I. T3 z8 O& \该界面是进行打包的界面。
# A. v& j. S( R" I- Build Target:选择发布的平台
- Output Path:输出路径
- Clear Folders:构建之前清空文件夹(会把文件夹删除)
- Copy to StreamingAssets:拷贝至StreamingAssets文件夹
- Compression:选择压缩格式3 z5 q$ b0 i' v8 e! I
; ~6 J6 \; _8 S w7 f! C3 @
9 a U- @ q; J$ f2 ]Inspect界面7 p! l e' b( s- a0 D: W
这个界面会展示已经打成AB包的包内部信息。 选择左上角的 Add Folder,选择AssetBundle所在的目录。然后该界面左侧会列出该文件夹下的所有AB包。 在左侧展示的文件列表中任选一个AssetBundle,右边会展示AssetBundle内部的信息,包括它包含的资源,预加载的组件和依赖等等。 右上角的 -键可以从列表中删除当前选中的文件夹。
& P) u! w4 {& E, ^
1 q/ X0 s$ ~; V+ s
1 j; k0 d" f, f7 v1 U8 |Ⅲ、完成打包 点击Build即可对当前Browser中所有的bundle进行打包,选择路径,即可在该路径下看到生成的资源文件。 若你勾选了Copy to StreamingAssets,还会自动帮你拷贝到StreamingAssets文件夹 1 }4 }" @' I+ Q- q- \2 j
9 X E" [7 i: D, w : }& k: ?# U; R* ?& ^# Y9 @
2、实现资源复用
5 U: @$ w/ j) E/ ^📢 什么是资源复用- l9 Z) i+ v( M' B- f3 j; F
在打包的过程中,有很多资源都是重复的。例如: * J( e1 x7 ~6 ~: R
- 多个预制体使用的同一个模型,预制体只是材质颜色不同。
- 有图片,被多个预制体使用。
0 V- K/ k: |, e! a 如果分别打AB包,这样会造成包体过大。' Q( q" h; _5 R1 T. P
AssetBundleBrowser提供了解决方法,用创建共享AB包的形式,很好的解决掉了这一问题,实现了资源的复用。 Ⅰ、一个资源重复的现象
- }$ h& T/ ^( {6 o' G我们实现一个资源重复的现象:
/ ~* {$ V, D4 J( I% j8 G/ H# _; _- 制作Trigger的复制预制体,新建材质球,替换它的原始材质球。
- 给该预制体的AssetBundle重命名为tiggernew3 w ^9 _2 a% y
/ B# F* {& a( I/ c
" M" u' O7 G5 p6 e; f1 T, E6 c- RⅡ、创建共享AB包
; s* L% x: N- t' `/ ]. \/ w1 n/ `/ o我们此时再次打开AssetBundle Browser,可以看到很多感叹号。 ?. j. n$ d3 x9 h
- 左侧预制体的感叹号,代表它们其中有重复的资源
- 右侧包体内的感叹号,代表是这些资源重复1 J( N2 K% ?+ J- M
# o% `8 c. x3 i' b/ P4 ^
n& C6 ], T/ `9 V/ Z
创建res AB包: 在左侧右键,Add new bundle,创建一个res包(该名子可自行命名)。后面我们用它存储重复的资源。
! Z4 B' ?% J6 @& G; F6 `. Q
* o$ I+ _5 e, Y3 x5 F+ J7 u 将重复资源拖到res包内: 将tiger中的重复资源拖到res包内,我们能看到拖拽完成后,其他ab包内重复的资源也消失了。现在只有一份资源。
) n/ R$ W9 X! Z- E
. l1 @ Z6 }+ [& S; ?
) J. |' |6 x- h. W2 t
* `& N9 J; Z0 e4 rⅢ、完成打包
, L8 w8 \$ d& u, j0 F( q" M同样的操作,点击Build,完成AB包的打包。 此时AB包内容如下: " a, s- c2 [3 I5 @9 y- u
6 B; E9 F2 ^% G6 h- ^5 k4 o
2 ?2 t* [9 p1 r" p0 o四、代码实例化AB包资源
# d$ a8 K# d& A" D/ s: k下面我们完整做完整个流程:使用代码,去加载AB包中的老虎,完成我们的整个测试。 将该脚本挂载在场景中的物体上,运行项目时,便会加载出老虎了!
% }- R0 ?" r' h - using System.IO;
. \7 \- a" q% [* s2 ?4 C6 X+ ^: m - using UnityEngine;<p></p>( F9 {$ i9 b; h- \( P# j
- <p style="line-height: 30px; text-indent: 2em;">public class ABTest : MonoBehaviour
) q. l7 l3 {$ Z( f2 M - {8 ~9 W1 \1 j( @
- void Start()* j! x Q8 L7 e5 k; y& u! a# y
- {
- h& m' u5 a7 [1 [ - //加载AssetBundle之前,先加载依赖的Bundle ^4 n1 E$ e3 h9 C5 q
- //字符串"StandaloneWindows",是一个文件。这个文件的名字,是根据打包脚本,打包到哪个文件夹下,这个文件就叫什么名字。
1 w: p, c$ {& z9 y - //字符串"AssetBundleManifest",是固定写法。
/ w" l2 O) } c* [# E - AssetBundle assetBundle =6 k+ @/ L; \! o9 F' U7 Y
- AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "StandaloneWindows"));9 U4 J& C& e) Q" |6 o7 n/ Q/ o
- AssetBundleManifest manifest = assetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");</p>9 k9 N( Z Q. ]- {1 W/ K6 I: k6 f
- <p style="line-height: 30px; text-indent: 2em;"> //字符串"tiger",是你要加载的老虎模型预制体的名字- `7 j% F" Z9 M
- foreach (var item in manifest.GetAllDependencies("tiger"))
8 Y3 c& m* r) o - {
# o7 K% b: D9 p( o4 F5 x" ? - AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, item));: m1 v. x, e* a w. z5 L+ Y% O( e
- }</p># p* q _& l- d, i
- <p style="line-height: 30px; text-indent: 2em;"> //------若要加载的文件只是一个视频或者其他,无依赖,可只做下面,直接加载Bundle文件,直接读Bundle即可------//</p>
3 X3 \. Y" o. a$ r1 r$ C - <p style="line-height: 30px; text-indent: 2em;"> //现在便可以加载模型了: I8 N# L) U5 U. ]" W7 S- S
- string modelPath = Path.Combine(Application.streamingAssetsPath, "tiger");; ]/ v; p/ E7 q& j
- AssetBundle useAb = AssetBundle.LoadFromFile(modelPath);
" H! I$ q' v- A6 r' D - GameObject obj = useAb.LoadAsset<GameObject>("Tiger");</p>7 N$ e& v; p) i; I
- <p style="line-height: 30px; text-indent: 2em;"> Instantiate(obj, transform);$ F3 a+ a. F- c. Z. z
- }' g m" e0 a% n( l( h+ D
- }</p>
复制代码 好啦,这就是本章所有内容 ~
8 I. V$ E" B8 p( }7 _ X
2 ~( E4 j D9 z |