|
一、插件功能
6 Y8 T: B) h* h4 N9 v8 \9 c1、插件是发布AB包的工具
& S, S5 @% Y$ |6 \( I2 a4 lAssetBundle Browse可以将项目中的资源打包成AB包,发布游戏后,项目将通过加载StreamingAssets中AB包的形式,加载所需资源,而不是像之前那样,从Assets中进行加载。 1、AB包是什么
Q) j% x) `7 z6 bAB包全名AssetBundle(资源包)。是一种Unity提供的用于存放资源的包。通过将资源分布在不同的AB包中可以最大程度地减少运行时的内存压力,并且可以有选择地加载内容。 2、为什么要用AB包
0 y; m/ S! c; ]Ⅰ、热更新 要热更新需要确保AB包打出来的资源具有唯一性,且相同资源的AB包检验码相同。 Ⅱ、Resources加载存在问题 Resources加载虽然简单方便,但是也有很多问题:
7 ]9 C1 n, }! T; v7 F+ g- 对内存管理造成一定的负担。
- 在打开应用时加载时间很长。
- Resources文件夹下的所有资源统一合并到一个序列化文件中(可以看成统一打一个大包,巨型AB包有什么问题它就有什么问题),对资源优化有一定的限制。
, M& K$ F8 m# @! X* B 因此不建议大量使用Resources。, D; _1 k% ^( L( P
二、安装插件的方式
n9 I* i# Y+ W+ j1、PackageManager安装
, T8 P$ r3 r* z4 r橙子测试在Unity2019.3版本中,PackageManager中便有此插件, 同学们可以先看看自己版本的Unity是否可以直接安装。
0 N% r1 V7 [" \5 s' X9 G- p ( a* G8 F7 ]0 \+ J# K5 q2 x
6 U; ~5 \. L; v- k1 w# ]2、GitHub下载; z* [ C4 H+ K' e' u& \
有的Unity版本是没有PackageManager的,或者PackageManager中没有此插件。 那么我们可以去GitHub下载此插件:传送门 三、插件使用方法介绍! t6 q \( o' r$ R- ]
下面介绍如何将Assets中的资源打成AB包。 1、实现导出一个AB包% y* f9 ?, `) y! S3 Z) Y
我们以该模型为例,将该模型打成AB包。 ! L( v5 l b6 y/ l/ \
8 w/ L+ U+ n) W# O, y& l
1 {, v) M4 M% n' _6 {/ d/ jⅠ、制成预制体,并设定AssetBundle 如下图所示。 AssetBundle名字只能是小写。
' F k+ q T/ M) o2 L : H% z9 t8 t9 f# }
& w+ N* O9 d% [- Q
Ⅱ、AssetBundle Browser界面介绍 Window - AssetBundle Browser,可打开配置界面。 Configure界面
6 v, s0 ^$ H% {( X* k" e" }我们能看到所有被标记为AssetBundle的文件。 2 l) n! Y% z. j! s4 ~
& [6 ~: v" z9 c t
3 Y3 a1 p- y% \( {Build界面! G/ J+ ^% q: Q! Y2 d+ H: H
该界面是进行打包的界面。
, ?! l2 S, u, B/ u% b- Build Target:选择发布的平台
- Output Path:输出路径
- Clear Folders:构建之前清空文件夹(会把文件夹删除)
- Copy to StreamingAssets:拷贝至StreamingAssets文件夹
- Compression:选择压缩格式9 R7 E$ d( Z8 f1 Q8 `1 R; U" t/ V
: W; S4 s+ o; a. D% M
# [1 d* ~7 ]" j/ I$ f; g
Inspect界面" N/ }; ~8 i7 @6 z+ a
这个界面会展示已经打成AB包的包内部信息。 选择左上角的 Add Folder,选择AssetBundle所在的目录。然后该界面左侧会列出该文件夹下的所有AB包。 在左侧展示的文件列表中任选一个AssetBundle,右边会展示AssetBundle内部的信息,包括它包含的资源,预加载的组件和依赖等等。 右上角的 -键可以从列表中删除当前选中的文件夹。 / p7 x9 f4 r! W) S7 Z5 O
# Q3 z. r9 s( C' C
& k, Q& Y- `2 }5 i/ K/ E
Ⅲ、完成打包 点击Build即可对当前Browser中所有的bundle进行打包,选择路径,即可在该路径下看到生成的资源文件。 若你勾选了Copy to StreamingAssets,还会自动帮你拷贝到StreamingAssets文件夹
) @" d: w' O5 Z+ f
2 f# m" u5 X' S& V A( J/ z
5 f n" f& P0 R; I( J' l2、实现资源复用0 s, N% R+ ^3 }, O. X( M
📢 什么是资源复用
0 b; T7 c' O" s" a% n& n4 t在打包的过程中,有很多资源都是重复的。例如: A' J! W- {% G) t# Z4 L2 t
- 多个预制体使用的同一个模型,预制体只是材质颜色不同。
- 有图片,被多个预制体使用。& X9 n% K4 W5 S" g# J# |* K6 H
如果分别打AB包,这样会造成包体过大。
i! G6 G& g4 w- t3 P5 z }+ mAssetBundleBrowser提供了解决方法,用创建共享AB包的形式,很好的解决掉了这一问题,实现了资源的复用。 Ⅰ、一个资源重复的现象9 Y$ G: g" U+ W1 n) \/ C
我们实现一个资源重复的现象:
1 F, p( j4 p5 j2 H7 _0 o* ]- 制作Trigger的复制预制体,新建材质球,替换它的原始材质球。
- 给该预制体的AssetBundle重命名为tiggernew
1 a( t" s& N8 ?2 k* f; ^2 ~
{6 p9 X& x0 K$ o' L% x9 f
" U: _4 _/ y3 g/ a) v8 }& V! e$ U' A1 \Ⅱ、创建共享AB包# Z5 J' _1 r, `$ C7 H
我们此时再次打开AssetBundle Browser,可以看到很多感叹号。 1 S, ~2 b f G! R# x. g( R3 v
- 左侧预制体的感叹号,代表它们其中有重复的资源
- 右侧包体内的感叹号,代表是这些资源重复
$ A" Q+ v! U5 V- P
5 O7 Q; c0 P9 C1 @& h+ ]4 g0 k 2 l9 P" m* k$ i; x4 _
创建res AB包: 在左侧右键,Add new bundle,创建一个res包(该名子可自行命名)。后面我们用它存储重复的资源。
$ \. y. Q2 _3 z$ ~# |2 q7 s3 t 6 U1 E4 l0 Q# X0 q, B5 Z: u
将重复资源拖到res包内: 将tiger中的重复资源拖到res包内,我们能看到拖拽完成后,其他ab包内重复的资源也消失了。现在只有一份资源。
6 O D/ X8 n* F% s* e
3 [9 C0 \! J& ]4 h$ M u. f4 @) C8 A
9 @8 ?" Q% a2 C6 q( ~- g$ B2 D
4 E& w1 p4 S+ B3 q6 @7 V+ QⅢ、完成打包
9 U/ }5 c# A+ m( T* U n: m同样的操作,点击Build,完成AB包的打包。 此时AB包内容如下:
( r. k, X! ^# E 2 t& l# o4 E6 p0 ~6 r3 r
! G. M' _3 b* Q" l' J& ^
四、代码实例化AB包资源* P: y [& ^5 o% ]6 |2 q! O
下面我们完整做完整个流程:使用代码,去加载AB包中的老虎,完成我们的整个测试。 将该脚本挂载在场景中的物体上,运行项目时,便会加载出老虎了!
( Z8 g) D @! I2 u" ]8 Y# b3 m4 d - using System.IO;9 x1 y1 g7 }5 L. Y3 R# N; m
- using UnityEngine;<p></p>
+ k* `" X; j6 ]2 Z$ |/ D& N. B0 u - <p style="line-height: 30px; text-indent: 2em;">public class ABTest : MonoBehaviour
" T1 q; r0 u5 N - {: v, {5 ~8 s4 Y; ~9 g# U0 x/ E; c
- void Start(). u9 b6 y/ i; Z! H
- {/ ]) E' b% T7 U: z0 G" x* I
- //加载AssetBundle之前,先加载依赖的Bundle
$ ~' r$ C0 B5 L! F8 e r2 R - //字符串"StandaloneWindows",是一个文件。这个文件的名字,是根据打包脚本,打包到哪个文件夹下,这个文件就叫什么名字。
: K( a# @. e# I- h - //字符串"AssetBundleManifest",是固定写法。
6 P9 k/ i% H+ Y: M1 p M( Z) u, v - AssetBundle assetBundle =( p4 h7 D( R8 E3 Y, z& I4 V* S
- AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "StandaloneWindows"));5 _0 _) c2 y4 V: D
- AssetBundleManifest manifest = assetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");</p>
3 I3 t3 \" U' f$ X - <p style="line-height: 30px; text-indent: 2em;"> //字符串"tiger",是你要加载的老虎模型预制体的名字. w& ]# E8 G/ _# y
- foreach (var item in manifest.GetAllDependencies("tiger"))
) y, D+ |6 r/ z& O4 h" m - {# ?8 S2 g1 d2 F- i* M% c; F# q
- AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, item));
1 O5 x$ \- j( B* l - }</p>
' n+ ?. ?' b$ N8 r& R: z( n/ v+ r) b - <p style="line-height: 30px; text-indent: 2em;"> //------若要加载的文件只是一个视频或者其他,无依赖,可只做下面,直接加载Bundle文件,直接读Bundle即可------//</p>
6 m' U/ E+ J7 E# y- _* O. J5 `3 U% y - <p style="line-height: 30px; text-indent: 2em;"> //现在便可以加载模型了3 l7 M! f. F7 o- Z* b0 M2 I) M
- string modelPath = Path.Combine(Application.streamingAssetsPath, "tiger");
5 O4 R8 r; J/ K% L3 U& ^6 P - AssetBundle useAb = AssetBundle.LoadFromFile(modelPath);
* E8 j5 Q; ]6 z6 E* q1 S1 ^ - GameObject obj = useAb.LoadAsset<GameObject>("Tiger");</p>
& J- @: M I, G; }! G) v - <p style="line-height: 30px; text-indent: 2em;"> Instantiate(obj, transform);5 ]# P/ @; U/ w# m- {) {- k- q
- }; z S3 o/ v/ m* h& U$ ^) [
- }</p>
复制代码 好啦,这就是本章所有内容 ~
% n5 _- p q0 ^/ d7 Y4 \" |4 r5 q. Z" a- I( s) E
|