|
一、插件功能
9 Q! W* a( h6 P! z+ B4 M1、插件是发布AB包的工具
# r* N5 h/ o6 W" e8 GAssetBundle Browse可以将项目中的资源打包成AB包,发布游戏后,项目将通过加载StreamingAssets中AB包的形式,加载所需资源,而不是像之前那样,从Assets中进行加载。 1、AB包是什么1 n, p* Z) J {9 ~. D! i) P
AB包全名AssetBundle(资源包)。是一种Unity提供的用于存放资源的包。通过将资源分布在不同的AB包中可以最大程度地减少运行时的内存压力,并且可以有选择地加载内容。 2、为什么要用AB包
- T* k5 w2 m( ^, xⅠ、热更新 要热更新需要确保AB包打出来的资源具有唯一性,且相同资源的AB包检验码相同。 Ⅱ、Resources加载存在问题 Resources加载虽然简单方便,但是也有很多问题: * K0 `: Q; z& ~% B5 I
- 对内存管理造成一定的负担。
- 在打开应用时加载时间很长。
- Resources文件夹下的所有资源统一合并到一个序列化文件中(可以看成统一打一个大包,巨型AB包有什么问题它就有什么问题),对资源优化有一定的限制。# V% a6 n! w8 R( P
因此不建议大量使用Resources。
4 L: v7 |2 X& H* U _二、安装插件的方式' H+ y% J) R% [% l7 y5 U
1、PackageManager安装 N( g) ^1 d n5 g2 b
橙子测试在Unity2019.3版本中,PackageManager中便有此插件, 同学们可以先看看自己版本的Unity是否可以直接安装。
% W, o0 h' o+ n% y3 {' t3 e 9 @5 n, a7 n6 l
' N' Y, F& }6 b7 g
2、GitHub下载) t3 U6 D2 L% V8 ~( |) q0 |% W
有的Unity版本是没有PackageManager的,或者PackageManager中没有此插件。 那么我们可以去GitHub下载此插件:传送门 三、插件使用方法介绍
0 B2 H3 {: i( l% t# T7 w1 t0 }: Q下面介绍如何将Assets中的资源打成AB包。 1、实现导出一个AB包* S1 U7 E1 ~9 Z, ~( a3 o
我们以该模型为例,将该模型打成AB包。 7 G" T5 \$ s# t& E
7 C' |# u l! j% Y6 i) _
% @: |) C/ h3 F, n6 EⅠ、制成预制体,并设定AssetBundle 如下图所示。 AssetBundle名字只能是小写。
; [: ?' m& O! T0 y, ]# P
& F5 S9 z# v) Q0 J( Q) A j
4 _) u" E! @0 y( K0 ~6 [' g; SⅡ、AssetBundle Browser界面介绍 Window - AssetBundle Browser,可打开配置界面。 Configure界面5 g( t' d% T; H. D2 D
我们能看到所有被标记为AssetBundle的文件。
1 n; A ^5 z9 W4 P" t, l: M: a
0 ]) D, ?: W( h) n8 k2 L g( H ) ]; |2 E) t) T
Build界面: j, ^3 v; R% y s0 u
该界面是进行打包的界面。 $ p+ i7 l/ ^: b( I
- Build Target:选择发布的平台
- Output Path:输出路径
- Clear Folders:构建之前清空文件夹(会把文件夹删除)
- Copy to StreamingAssets:拷贝至StreamingAssets文件夹
- Compression:选择压缩格式. Q" J9 D, }$ k; q3 _ M
: E: }6 b" X" d3 }4 [% b5 P) _3 I5 \
0 F/ z5 z8 |) @1 q& `. i
Inspect界面 G4 C! V8 _8 b _2 e
这个界面会展示已经打成AB包的包内部信息。 选择左上角的 Add Folder,选择AssetBundle所在的目录。然后该界面左侧会列出该文件夹下的所有AB包。 在左侧展示的文件列表中任选一个AssetBundle,右边会展示AssetBundle内部的信息,包括它包含的资源,预加载的组件和依赖等等。 右上角的 -键可以从列表中删除当前选中的文件夹。
) N1 i0 \2 T* I% j7 q1 d# ~% K
% |+ I, ~! b$ ~7 Q0 n! U % ? ]/ a* `' j; `$ \9 f, r6 L
Ⅲ、完成打包 点击Build即可对当前Browser中所有的bundle进行打包,选择路径,即可在该路径下看到生成的资源文件。 若你勾选了Copy to StreamingAssets,还会自动帮你拷贝到StreamingAssets文件夹
7 _$ L- J( w5 e/ | 2 t% E" G. }# w3 t
& W* o! N" B- V& X- m; k6 z4 A2、实现资源复用
! G5 S+ r4 h* C( Z8 d📢 什么是资源复用9 e5 f5 p: j; Z# N9 x/ C
在打包的过程中,有很多资源都是重复的。例如: 9 K; D& U& R# A4 y& V) O F
- 多个预制体使用的同一个模型,预制体只是材质颜色不同。
- 有图片,被多个预制体使用。
* D* X" w& V7 j7 q* B1 ~4 i/ e 如果分别打AB包,这样会造成包体过大。; J* y! K. ?" ^
AssetBundleBrowser提供了解决方法,用创建共享AB包的形式,很好的解决掉了这一问题,实现了资源的复用。 Ⅰ、一个资源重复的现象
6 Y( z8 f9 P, J我们实现一个资源重复的现象: " w3 g% W, E7 O1 C: b! x8 G
- 制作Trigger的复制预制体,新建材质球,替换它的原始材质球。
- 给该预制体的AssetBundle重命名为tiggernew
) A: p1 E; n3 }2 V- F* w/ ^
2 D5 {2 d5 W2 z, Q# N1 m/ a
; b' M( [9 Q% m% l2 M3 wⅡ、创建共享AB包
x8 x6 k" R/ c, F8 m( j4 }3 B我们此时再次打开AssetBundle Browser,可以看到很多感叹号。 ! P( A# j \* D; H1 c. E) h/ m, z
- 左侧预制体的感叹号,代表它们其中有重复的资源
- 右侧包体内的感叹号,代表是这些资源重复
O- \; ~7 J: y, ^2 [8 J7 V9 n
: j! ]* c1 `7 g: o 1 q- d* Z! Q8 N; i
创建res AB包: 在左侧右键,Add new bundle,创建一个res包(该名子可自行命名)。后面我们用它存储重复的资源。
+ G" f5 j- d/ ]
* e: K8 d( q) S( h 将重复资源拖到res包内: 将tiger中的重复资源拖到res包内,我们能看到拖拽完成后,其他ab包内重复的资源也消失了。现在只有一份资源。
; L4 X- n+ y4 y U E# e
7 C* u8 B9 N1 }- M, i
, } d" M8 x/ i0 X7 K! b 8 h+ L0 W! `# T- A0 l+ y, j
Ⅲ、完成打包; m' q: f4 l' Z% V! I2 z7 T
同样的操作,点击Build,完成AB包的打包。 此时AB包内容如下: ; U" \- Q ?; X/ L. _
7 |2 Q% h) A( g5 e' ]9 Z. U
, S2 h% q. j( g- a四、代码实例化AB包资源% M. Y3 U( W9 n: K4 Z
下面我们完整做完整个流程:使用代码,去加载AB包中的老虎,完成我们的整个测试。 将该脚本挂载在场景中的物体上,运行项目时,便会加载出老虎了!
4 l, ~( | @: n5 H! F5 H - using System.IO;
! ^5 {1 [7 t( }& O - using UnityEngine;<p></p>- H% {9 w5 |8 I' e7 d9 i
- <p style="line-height: 30px; text-indent: 2em;">public class ABTest : MonoBehaviour6 p3 e/ X& ~4 N- G4 E9 J
- {8 A) V7 D( E5 e$ ?* N
- void Start()
4 w2 ~! j$ \1 g3 @, N# ]1 u - {
' h) D4 |/ R5 E2 C/ m( z - //加载AssetBundle之前,先加载依赖的Bundle
- y* G, f( U m/ j - //字符串"StandaloneWindows",是一个文件。这个文件的名字,是根据打包脚本,打包到哪个文件夹下,这个文件就叫什么名字。
% g+ u1 v' \8 z - //字符串"AssetBundleManifest",是固定写法。
( z# _$ I+ ]4 D: [ - AssetBundle assetBundle =
& _3 q3 H& ^$ ^# N! ?, q* W - AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "StandaloneWindows"));# N, b6 c1 v+ l2 C s' Q- u
- AssetBundleManifest manifest = assetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");</p>: K/ i y; m, `7 U5 x& b
- <p style="line-height: 30px; text-indent: 2em;"> //字符串"tiger",是你要加载的老虎模型预制体的名字
+ t$ q- G7 U2 g' Z, U! k/ E - foreach (var item in manifest.GetAllDependencies("tiger"))
- w5 J; E+ N0 |7 C4 b( y - {
+ P5 ?( w( A' T! H; y/ |. O2 } - AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, item));" E# Y3 F, b t8 ^
- }</p>
$ R" Z2 J% i; l/ ^' b- r4 R - <p style="line-height: 30px; text-indent: 2em;"> //------若要加载的文件只是一个视频或者其他,无依赖,可只做下面,直接加载Bundle文件,直接读Bundle即可------//</p>
2 W9 o3 Y4 z$ g- H7 S6 d - <p style="line-height: 30px; text-indent: 2em;"> //现在便可以加载模型了
0 a# Z9 H9 w6 C2 c8 e) e+ h" ?; u - string modelPath = Path.Combine(Application.streamingAssetsPath, "tiger");
& |% Q4 \9 @2 {+ G0 N/ x1 R - AssetBundle useAb = AssetBundle.LoadFromFile(modelPath);/ A$ ]. \3 w8 l3 Y
- GameObject obj = useAb.LoadAsset<GameObject>("Tiger");</p>
% [8 ~# ` l2 ]# J - <p style="line-height: 30px; text-indent: 2em;"> Instantiate(obj, transform);( Y* H/ x2 j0 u* o
- }
S9 I4 M% B9 |0 N2 a - }</p>
复制代码 好啦,这就是本章所有内容 ~+ t W: V3 x/ y! g' i
8 K1 l5 O% E1 B$ ]! |% o5 Q |