一、插件功能/ G( S: m% T! Z$ I7 N5 P
1、插件是发布AB包的工具2 u: l! F3 W+ f0 G
AssetBundle Browse可以将项目中的资源打包成AB包,发布游戏后,项目将通过加载StreamingAssets中AB包的形式,加载所需资源,而不是像之前那样,从Assets中进行加载。 1、AB包是什么
4 V$ B3 m. P T! H7 M- ?AB包全名AssetBundle(资源包)。是一种Unity提供的用于存放资源的包。通过将资源分布在不同的AB包中可以最大程度地减少运行时的内存压力,并且可以有选择地加载内容。 2、为什么要用AB包
5 V% P2 c# k5 E. j' D/ DⅠ、热更新 要热更新需要确保AB包打出来的资源具有唯一性,且相同资源的AB包检验码相同。 Ⅱ、Resources加载存在问题 Resources加载虽然简单方便,但是也有很多问题: 4 R9 `# q% L0 m2 ], u" h
- 对内存管理造成一定的负担。
- 在打开应用时加载时间很长。
- Resources文件夹下的所有资源统一合并到一个序列化文件中(可以看成统一打一个大包,巨型AB包有什么问题它就有什么问题),对资源优化有一定的限制。) P* p. w, {7 A& |7 F5 q
因此不建议大量使用Resources。
" u7 c1 O+ t% w. Y6 G: a; I" Q二、安装插件的方式
+ T: d5 }8 t& @4 G5 Z! A1、PackageManager安装; Z4 `/ z V4 T0 q; h6 O
橙子测试在Unity2019.3版本中,PackageManager中便有此插件, 同学们可以先看看自己版本的Unity是否可以直接安装。
% Q9 g6 @3 k/ [ , v0 ]4 j/ ^% t* s+ |/ |$ a
( T4 X' y( l4 j# f2、GitHub下载
- V+ Q! [5 y8 N9 f% g( D有的Unity版本是没有PackageManager的,或者PackageManager中没有此插件。 那么我们可以去GitHub下载此插件:传送门 三、插件使用方法介绍
- v8 o; c; y! B5 Z0 ?- N下面介绍如何将Assets中的资源打成AB包。 1、实现导出一个AB包+ ~% h4 X; ]0 j9 B4 U- {
我们以该模型为例,将该模型打成AB包。 5 m: Y! |5 l% n) \5 g' k9 [. }9 B
; Q; S6 V3 A5 i; s' u/ N+ Q( L2 R
' U0 U2 @( L. L% tⅠ、制成预制体,并设定AssetBundle 如下图所示。 AssetBundle名字只能是小写。
6 O8 |% F1 i; T3 D9 C, ^
5 u7 T0 v5 V8 p/ j ! h3 w% z& S/ r- Z
Ⅱ、AssetBundle Browser界面介绍 Window - AssetBundle Browser,可打开配置界面。 Configure界面" a7 K4 V" Q" U7 p
我们能看到所有被标记为AssetBundle的文件。
/ \3 @ n5 S; F; H( A8 j ; ?4 }% m* ]: q% y
k1 f$ z5 i- t) i% O
Build界面
# @! J1 S F3 @该界面是进行打包的界面。
7 {6 l2 t2 K' h6 N- E" y- Build Target:选择发布的平台
- Output Path:输出路径
- Clear Folders:构建之前清空文件夹(会把文件夹删除)
- Copy to StreamingAssets:拷贝至StreamingAssets文件夹
- Compression:选择压缩格式
& k6 V+ X1 O' N7 H9 ]- |3 e. D
7 j* Q% V8 f! k! v r
' A4 B' K: {$ o7 J! wInspect界面
: m! E" T2 l4 W+ P: w8 N: F- z- W这个界面会展示已经打成AB包的包内部信息。 选择左上角的 Add Folder,选择AssetBundle所在的目录。然后该界面左侧会列出该文件夹下的所有AB包。 在左侧展示的文件列表中任选一个AssetBundle,右边会展示AssetBundle内部的信息,包括它包含的资源,预加载的组件和依赖等等。 右上角的 -键可以从列表中删除当前选中的文件夹。
* I* B. @$ A% e2 H: I1 f; y; \ * b/ q0 U- w+ D3 H* u5 R5 H4 b
1 j7 b( G# N% N! ^& }2 d# r5 V; T
Ⅲ、完成打包 点击Build即可对当前Browser中所有的bundle进行打包,选择路径,即可在该路径下看到生成的资源文件。 若你勾选了Copy to StreamingAssets,还会自动帮你拷贝到StreamingAssets文件夹
5 b" l" W* R# U: w
$ K5 C0 d, f9 _
# t4 |3 \3 a& N0 l& x& R; C, y2、实现资源复用4 O9 v% O% r7 y8 y6 }; z" W
📢 什么是资源复用 N- o* h2 Z+ P& L* q
在打包的过程中,有很多资源都是重复的。例如:
$ u$ N+ ~% s3 U% R) a- 多个预制体使用的同一个模型,预制体只是材质颜色不同。
- 有图片,被多个预制体使用。; ?5 @2 _9 v7 c% L, r% D* A3 X( X
如果分别打AB包,这样会造成包体过大。/ U$ v; e" ^1 ?5 i( N
AssetBundleBrowser提供了解决方法,用创建共享AB包的形式,很好的解决掉了这一问题,实现了资源的复用。 Ⅰ、一个资源重复的现象
1 e& W8 B! U% f4 h; `4 O% A$ N* X我们实现一个资源重复的现象: 7 q% y. O3 s3 G$ H! g
- 制作Trigger的复制预制体,新建材质球,替换它的原始材质球。
- 给该预制体的AssetBundle重命名为tiggernew' {5 S8 U' N, Y+ J- _( y
0 w0 I$ O2 I9 M+ p9 h' A s
r2 b9 P7 O( ^ V+ X3 ?Ⅱ、创建共享AB包/ k7 Y8 s1 l4 G0 |& u* U4 N' u
我们此时再次打开AssetBundle Browser,可以看到很多感叹号。 3 e, h/ C& A. Q9 X. V5 Y# m
- 左侧预制体的感叹号,代表它们其中有重复的资源
- 右侧包体内的感叹号,代表是这些资源重复: M ~; {& |, s( B
. s1 V$ Z! U; n0 ~ + I7 Z" {9 [* v
创建res AB包: 在左侧右键,Add new bundle,创建一个res包(该名子可自行命名)。后面我们用它存储重复的资源。 8 j I+ w: R8 ]2 h
/ A3 Z4 S( ~, E- S$ R9 ^
将重复资源拖到res包内: 将tiger中的重复资源拖到res包内,我们能看到拖拽完成后,其他ab包内重复的资源也消失了。现在只有一份资源。
! K) {- ^& f8 b! o
+ o: v7 W5 a$ p w p+ @
3 J9 t0 c, d; m
& C" l8 J5 [) {) ?2 u: W9 RⅢ、完成打包
/ J0 ?# B8 N6 i1 j5 R+ W同样的操作,点击Build,完成AB包的打包。 此时AB包内容如下:
1 d1 S& k6 M+ q+ [2 _
% m$ d: I5 m5 Q2 R 0 [' F, H5 |" R3 p
四、代码实例化AB包资源
2 ~2 V8 e( S1 {2 P8 w. B# D下面我们完整做完整个流程:使用代码,去加载AB包中的老虎,完成我们的整个测试。 将该脚本挂载在场景中的物体上,运行项目时,便会加载出老虎了!, X5 E/ V9 U% X Q7 Q. f" Y
- using System.IO;
) _' d- L. C- f. x& b1 ^ - using UnityEngine;<p></p>
8 i* [& z3 A2 o; ]! j: R+ V4 u - <p style="line-height: 30px; text-indent: 2em;">public class ABTest : MonoBehaviour
& v1 c% T8 f& a; K - {
4 A! a' z* W+ `+ ~7 @ e8 l( b5 @5 C - void Start()/ \* g/ y; C% p( G8 p
- {
% f$ y0 A- y; u2 H' N$ v( D - //加载AssetBundle之前,先加载依赖的Bundle0 @: X" r0 p" K2 t
- //字符串"StandaloneWindows",是一个文件。这个文件的名字,是根据打包脚本,打包到哪个文件夹下,这个文件就叫什么名字。
, L) i. n8 J# Z. {$ {* F. B - //字符串"AssetBundleManifest",是固定写法。
. h" F7 d; v9 M" o - AssetBundle assetBundle =
, t5 h& B0 r$ K/ R% Z - AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "StandaloneWindows"));
1 U0 _1 z7 x3 j* J- a: W6 _9 G - AssetBundleManifest manifest = assetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");</p>
6 H. r/ j3 n, ? - <p style="line-height: 30px; text-indent: 2em;"> //字符串"tiger",是你要加载的老虎模型预制体的名字% q/ n, e% O$ p5 H4 G7 t3 l
- foreach (var item in manifest.GetAllDependencies("tiger"))
( l" N% S& O; K: }( N - {
$ Z2 |/ [. I5 G' g: ` Q - AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, item));- u6 A# w) W" ]3 u) H" W5 s
- }</p>. f4 r. e N# s, \: z8 C0 o
- <p style="line-height: 30px; text-indent: 2em;"> //------若要加载的文件只是一个视频或者其他,无依赖,可只做下面,直接加载Bundle文件,直接读Bundle即可------//</p>
% s( K; a6 a8 o% Y - <p style="line-height: 30px; text-indent: 2em;"> //现在便可以加载模型了
. H9 o+ u6 F/ _+ y% s - string modelPath = Path.Combine(Application.streamingAssetsPath, "tiger");7 f- n g/ W& c% _( B b
- AssetBundle useAb = AssetBundle.LoadFromFile(modelPath);
8 u0 p, u" D" e. V8 a - GameObject obj = useAb.LoadAsset<GameObject>("Tiger");</p>
1 r0 Z: t. H. j! o8 j - <p style="line-height: 30px; text-indent: 2em;"> Instantiate(obj, transform);
& n p4 V' j9 ?* H: U# f - }, m8 Y1 \# w ^, A
- }</p>
复制代码 好啦,这就是本章所有内容 ~- A' u+ S# H* z; D3 I
: N6 k# h$ C: N7 U |