|
一、插件功能( B+ K; o, Z- \ Q
1、插件是发布AB包的工具
9 ~& A) Z! o# x' v6 Z1 kAssetBundle Browse可以将项目中的资源打包成AB包,发布游戏后,项目将通过加载StreamingAssets中AB包的形式,加载所需资源,而不是像之前那样,从Assets中进行加载。 1、AB包是什么' _0 U( ?* V* b+ G- N7 S
AB包全名AssetBundle(资源包)。是一种Unity提供的用于存放资源的包。通过将资源分布在不同的AB包中可以最大程度地减少运行时的内存压力,并且可以有选择地加载内容。 2、为什么要用AB包5 K k2 k: ?. C; J6 d; s0 |
Ⅰ、热更新 要热更新需要确保AB包打出来的资源具有唯一性,且相同资源的AB包检验码相同。 Ⅱ、Resources加载存在问题 Resources加载虽然简单方便,但是也有很多问题: 9 Y& t* d/ y7 c& p' a5 H
- 对内存管理造成一定的负担。
- 在打开应用时加载时间很长。
- Resources文件夹下的所有资源统一合并到一个序列化文件中(可以看成统一打一个大包,巨型AB包有什么问题它就有什么问题),对资源优化有一定的限制。+ ^2 O0 d5 |5 A \ A
因此不建议大量使用Resources。
0 B& x# a0 v( f! R- p5 ]9 ]/ J二、安装插件的方式
9 M& |; T$ O5 w% l( a8 \6 F1、PackageManager安装 ]- C+ a1 f5 Z5 N4 v
橙子测试在Unity2019.3版本中,PackageManager中便有此插件, 同学们可以先看看自己版本的Unity是否可以直接安装。
: g2 D @4 s6 ~9 E0 P $ v% B: t- F f. l
. @. u7 C/ _2 ~. E
2、GitHub下载
/ p9 j0 X# i3 N, V2 a/ x/ F有的Unity版本是没有PackageManager的,或者PackageManager中没有此插件。 那么我们可以去GitHub下载此插件:传送门 三、插件使用方法介绍
6 w2 v8 O/ ^1 S9 [下面介绍如何将Assets中的资源打成AB包。 1、实现导出一个AB包
k5 N8 w; Y8 \7 d# h' Q4 S7 y我们以该模型为例,将该模型打成AB包。
) U% X( y$ F: o+ C. V* @0 F6 s 8 \) S% h* k1 E! p
$ [3 o Q" a8 \Ⅰ、制成预制体,并设定AssetBundle 如下图所示。 AssetBundle名字只能是小写。 * M& D6 ?( ~/ z3 _7 o
; _) k% P) Z% F Z4 W
7 N% O" r. |. y* d, u: i" M5 qⅡ、AssetBundle Browser界面介绍 Window - AssetBundle Browser,可打开配置界面。 Configure界面
! s# g, K! C( x* D我们能看到所有被标记为AssetBundle的文件。
" w1 Y, [( d; ^$ U# T- }
3 y' v% |6 @2 s) V- M
1 k/ q3 [2 v9 |9 z* ~/ PBuild界面: w; r' I! q$ ]
该界面是进行打包的界面。
/ [8 i" a' y/ A, x9 V- Build Target:选择发布的平台
- Output Path:输出路径
- Clear Folders:构建之前清空文件夹(会把文件夹删除)
- Copy to StreamingAssets:拷贝至StreamingAssets文件夹
- Compression:选择压缩格式
! R) V9 f0 |2 a2 P
- G+ m$ T, x+ s) a$ Z9 T, B1 {/ n5 h
' i: w; A- J" k+ }
Inspect界面& r* r! w/ {: E3 ]# S- [
这个界面会展示已经打成AB包的包内部信息。 选择左上角的 Add Folder,选择AssetBundle所在的目录。然后该界面左侧会列出该文件夹下的所有AB包。 在左侧展示的文件列表中任选一个AssetBundle,右边会展示AssetBundle内部的信息,包括它包含的资源,预加载的组件和依赖等等。 右上角的 -键可以从列表中删除当前选中的文件夹。 % n2 J, [% z7 Q$ d) i8 N
: G0 H% M* [2 U6 g
' T" }7 Z5 {# ^$ j+ [( J
Ⅲ、完成打包 点击Build即可对当前Browser中所有的bundle进行打包,选择路径,即可在该路径下看到生成的资源文件。 若你勾选了Copy to StreamingAssets,还会自动帮你拷贝到StreamingAssets文件夹
/ @) n* U) b: V% n
& v I- D d8 w- Q1 V4 d+ a6 { . `; ?- M X) _/ E: z' u% q/ L9 `# Y
2、实现资源复用
2 Y& w3 E3 ?* z) p+ \2 q2 e📢 什么是资源复用& V9 [/ F* c6 j; E- K
在打包的过程中,有很多资源都是重复的。例如: 3 X2 a# y$ M+ Y
- 多个预制体使用的同一个模型,预制体只是材质颜色不同。
- 有图片,被多个预制体使用。" \7 E5 F6 u9 c# g: j _' O/ f
如果分别打AB包,这样会造成包体过大。! t6 R( Z5 I5 M: d
AssetBundleBrowser提供了解决方法,用创建共享AB包的形式,很好的解决掉了这一问题,实现了资源的复用。 Ⅰ、一个资源重复的现象
* t+ A0 r$ |& r8 q我们实现一个资源重复的现象:
9 p Y7 W' W" T4 E) \) ^- 制作Trigger的复制预制体,新建材质球,替换它的原始材质球。
- 给该预制体的AssetBundle重命名为tiggernew* B" }& \! E! n% c8 i( h; G& @
6 O0 M1 }* D- v* v; s( [/ D
: s, w# e( ~. J5 z: [) CⅡ、创建共享AB包 c+ ^. e" |* L6 d* b
我们此时再次打开AssetBundle Browser,可以看到很多感叹号。 ( }1 D5 x1 Q; v# v; {
- 左侧预制体的感叹号,代表它们其中有重复的资源
- 右侧包体内的感叹号,代表是这些资源重复- l ]* `! |% ?6 Q3 N+ Z
8 ^! q5 ?- J+ Y- |
+ M- |/ m& J2 r k2 {3 k1 w6 @创建res AB包: 在左侧右键,Add new bundle,创建一个res包(该名子可自行命名)。后面我们用它存储重复的资源。 % g: |& c. I8 w `7 b0 w. _
6 h; l1 O1 a) b6 B% h
将重复资源拖到res包内: 将tiger中的重复资源拖到res包内,我们能看到拖拽完成后,其他ab包内重复的资源也消失了。现在只有一份资源。
! ]# \. R( I$ i/ {. Q3 |' [
7 r# p: T7 ]7 T6 ?# a* x7 {4 V- N / f+ R, k8 h7 l% {+ J' F" {% {
( b% z! m5 y L1 M( V
Ⅲ、完成打包9 ]$ \. b5 H: v
同样的操作,点击Build,完成AB包的打包。 此时AB包内容如下: , s7 H: J% ?6 y* d3 f
2 d- \' b+ z( F3 ?7 x 8 {5 c/ g! v. E3 [ r. b
四、代码实例化AB包资源 p" d- v% ]' T7 A! ?2 N w, y
下面我们完整做完整个流程:使用代码,去加载AB包中的老虎,完成我们的整个测试。 将该脚本挂载在场景中的物体上,运行项目时,便会加载出老虎了!
$ |9 g$ Q7 i4 P7 t9 X1 M - using System.IO;
0 Z1 O. ~) }8 ]+ k - using UnityEngine;<p></p>
! w u# ^8 p5 k& M B - <p style="line-height: 30px; text-indent: 2em;">public class ABTest : MonoBehaviour( N9 _9 d5 z- H3 \' q9 M
- {
* g; ~+ Q& g6 R p; [+ i - void Start()1 L) V1 l+ @. ~4 q2 t
- {) E* [$ A) C9 B$ t ~( R
- //加载AssetBundle之前,先加载依赖的Bundle" X( V6 g$ D2 R L; Y4 f8 b8 T! D
- //字符串"StandaloneWindows",是一个文件。这个文件的名字,是根据打包脚本,打包到哪个文件夹下,这个文件就叫什么名字。, R+ `# w/ V+ Z/ U% W$ a. y
- //字符串"AssetBundleManifest",是固定写法。: C" C9 {2 ^- r
- AssetBundle assetBundle =
7 q3 N. E5 m' ]7 A' U$ t9 A1 z% @ - AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "StandaloneWindows"));
4 ~+ G5 Y3 F$ [* i2 K - AssetBundleManifest manifest = assetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");</p>
" @; n# z- j* }! s+ g( } - <p style="line-height: 30px; text-indent: 2em;"> //字符串"tiger",是你要加载的老虎模型预制体的名字
( F- V1 ?. { F4 ]6 V/ a - foreach (var item in manifest.GetAllDependencies("tiger"))" I: f, R0 P7 ~) Q. ]
- {0 y. P* a7 ]) [* S
- AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, item));# s! `( ]7 i3 {
- }</p>
2 `8 f! T- S9 D% | - <p style="line-height: 30px; text-indent: 2em;"> //------若要加载的文件只是一个视频或者其他,无依赖,可只做下面,直接加载Bundle文件,直接读Bundle即可------//</p>
T u3 l% n, \; ?$ N" ` - <p style="line-height: 30px; text-indent: 2em;"> //现在便可以加载模型了- D1 H! R7 S( T: `8 p1 W' U' R6 M
- string modelPath = Path.Combine(Application.streamingAssetsPath, "tiger");
# y- K" V+ ?) x7 U - AssetBundle useAb = AssetBundle.LoadFromFile(modelPath);% H& I9 v! U M! _3 l
- GameObject obj = useAb.LoadAsset<GameObject>("Tiger");</p>" M6 T9 U9 O- Z( b
- <p style="line-height: 30px; text-indent: 2em;"> Instantiate(obj, transform);% K( c6 I/ L3 o. ^4 @- ?7 l
- }
2 n7 l% p+ ~, Z! ^ - }</p>
复制代码 好啦,这就是本章所有内容 ~
! m) P, t, ?9 o8 u$ c" y
3 H+ J% r. r$ Z$ {5 i( e d |