|
一、插件功能. ]) o7 B* C" o& F
1、插件是发布AB包的工具% n5 V3 _* Q5 P5 m; O
AssetBundle Browse可以将项目中的资源打包成AB包,发布游戏后,项目将通过加载StreamingAssets中AB包的形式,加载所需资源,而不是像之前那样,从Assets中进行加载。 1、AB包是什么
( @8 W4 s- J2 E- `AB包全名AssetBundle(资源包)。是一种Unity提供的用于存放资源的包。通过将资源分布在不同的AB包中可以最大程度地减少运行时的内存压力,并且可以有选择地加载内容。 2、为什么要用AB包+ k; m; ?/ W' _
Ⅰ、热更新 要热更新需要确保AB包打出来的资源具有唯一性,且相同资源的AB包检验码相同。 Ⅱ、Resources加载存在问题 Resources加载虽然简单方便,但是也有很多问题: z2 L5 j4 @8 r2 ]; n( x& B
- 对内存管理造成一定的负担。
- 在打开应用时加载时间很长。
- Resources文件夹下的所有资源统一合并到一个序列化文件中(可以看成统一打一个大包,巨型AB包有什么问题它就有什么问题),对资源优化有一定的限制。6 N+ G- v. }9 A- \1 I
因此不建议大量使用Resources。
/ \1 d+ t! L3 u/ U二、安装插件的方式$ }6 I( Q$ a% d5 R; Q! h# R
1、PackageManager安装) W0 w3 o; _8 U! Z
橙子测试在Unity2019.3版本中,PackageManager中便有此插件, 同学们可以先看看自己版本的Unity是否可以直接安装。 - N ~; n0 X' ]+ v, O4 r7 b
) D: ^1 r) J5 G1 c9 A# Q
% V6 Q) n9 m4 K+ n/ y$ `
2、GitHub下载: v) V) \8 b% N# s! I
有的Unity版本是没有PackageManager的,或者PackageManager中没有此插件。 那么我们可以去GitHub下载此插件:传送门 三、插件使用方法介绍
5 @! w$ j& W6 N$ f: {下面介绍如何将Assets中的资源打成AB包。 1、实现导出一个AB包
! a Y+ q( r3 a. j* ~+ b我们以该模型为例,将该模型打成AB包。
& W$ e' f6 h% \; B1 ~8 { : s% C, v( L. |6 D: E) E
S) N2 Z$ k3 h
Ⅰ、制成预制体,并设定AssetBundle 如下图所示。 AssetBundle名字只能是小写。 / N& r, Z: T* L' L& P! T
9 e0 K/ @0 r4 x" W K3 V9 f
8 X9 T8 \# [+ i% W1 o% }Ⅱ、AssetBundle Browser界面介绍 Window - AssetBundle Browser,可打开配置界面。 Configure界面% K7 t1 g I. a
我们能看到所有被标记为AssetBundle的文件。 ; t0 O4 T- H/ c) Z
- [ ]' {! t/ T3 B$ {
# U+ G! U7 G6 W) e9 LBuild界面, k7 S2 ^2 F0 `. K4 E8 z( n
该界面是进行打包的界面。
/ {" k" O, |# x( G' A5 A- v9 L' I- Build Target:选择发布的平台
- Output Path:输出路径
- Clear Folders:构建之前清空文件夹(会把文件夹删除)
- Copy to StreamingAssets:拷贝至StreamingAssets文件夹
- Compression:选择压缩格式 C, Y# n1 ?) P; b! S; w! w
1 ^$ [$ q% u0 x4 ]8 ~9 w4 K0 G- k 2 C8 m7 E$ a; v! R; X
Inspect界面
. t, f; d; _! R8 V$ X: y这个界面会展示已经打成AB包的包内部信息。 选择左上角的 Add Folder,选择AssetBundle所在的目录。然后该界面左侧会列出该文件夹下的所有AB包。 在左侧展示的文件列表中任选一个AssetBundle,右边会展示AssetBundle内部的信息,包括它包含的资源,预加载的组件和依赖等等。 右上角的 -键可以从列表中删除当前选中的文件夹。
9 U" X% ~0 a2 R2 T H1 t6 P8 j ; w! z7 x6 x% S1 r! \
, d$ \1 m& H2 q2 J3 bⅢ、完成打包 点击Build即可对当前Browser中所有的bundle进行打包,选择路径,即可在该路径下看到生成的资源文件。 若你勾选了Copy to StreamingAssets,还会自动帮你拷贝到StreamingAssets文件夹
. W. a, D3 V6 ^$ n
7 | s7 V& X! ]( ?9 [
& Q5 `7 X: p- {/ _+ U2、实现资源复用
' v/ n7 P5 S2 g6 p& y📢 什么是资源复用
* |* \% T4 e' H' ~在打包的过程中,有很多资源都是重复的。例如:
; e2 P' e1 R# V7 c! \- 多个预制体使用的同一个模型,预制体只是材质颜色不同。
- 有图片,被多个预制体使用。
4 |3 [6 M: a% p 如果分别打AB包,这样会造成包体过大。
- v4 ~! Z" s* I, k! D. rAssetBundleBrowser提供了解决方法,用创建共享AB包的形式,很好的解决掉了这一问题,实现了资源的复用。 Ⅰ、一个资源重复的现象
4 u! D( [) T ?' w2 n0 `8 B7 D. Z6 @我们实现一个资源重复的现象:
, ~* J5 R" Z+ U- 制作Trigger的复制预制体,新建材质球,替换它的原始材质球。
- 给该预制体的AssetBundle重命名为tiggernew
$ l+ m Z+ U# _0 A2 v$ |' g( a4 J) w
& S; b. I* r5 l; R' a- ~ $ c/ U7 ?4 T! b! A
Ⅱ、创建共享AB包( J) F- b, H2 A4 O$ n% o7 H4 k
我们此时再次打开AssetBundle Browser,可以看到很多感叹号。 . t: c; g; u' m$ d0 d
- 左侧预制体的感叹号,代表它们其中有重复的资源
- 右侧包体内的感叹号,代表是这些资源重复
9 p- O9 ]% P* r( W) Q$ r
4 K! H4 L1 n! d& @+ v 2 ^8 J# O3 ?/ j) O0 ?( M
创建res AB包: 在左侧右键,Add new bundle,创建一个res包(该名子可自行命名)。后面我们用它存储重复的资源。 & s% E0 O3 A! b5 s- _1 g+ o
1 j* q8 U1 c& y* s0 Y! B! W
将重复资源拖到res包内: 将tiger中的重复资源拖到res包内,我们能看到拖拽完成后,其他ab包内重复的资源也消失了。现在只有一份资源。
( L! ]) S% _" O0 |3 p2 Z8 n0 L4 v$ M6 S' k% C6 ?; }: ~
7 I9 o# E; U9 I9 Z! l
3 q7 G. F6 O: Z$ ^+ j9 rⅢ、完成打包
2 g/ ^+ j4 A# L+ H' E; k% R同样的操作,点击Build,完成AB包的打包。 此时AB包内容如下:
" P, ]" r1 ` a5 K/ _
# t& E% M1 s5 w% v / R$ o8 ?* L) G5 k6 S5 I" |! n3 a
四、代码实例化AB包资源4 V+ [8 k: ^$ V& J4 A
下面我们完整做完整个流程:使用代码,去加载AB包中的老虎,完成我们的整个测试。 将该脚本挂载在场景中的物体上,运行项目时,便会加载出老虎了!
" @+ Q( y/ X0 g3 E. x - using System.IO;
. W& r6 p R9 `* V) Y4 o# X: i - using UnityEngine;<p></p>
, j7 Q4 [ E5 Z" {' o$ J5 p; u4 r - <p style="line-height: 30px; text-indent: 2em;">public class ABTest : MonoBehaviour5 ?% @) \) i+ R; [1 P; U9 Q# H
- {; J* V' {( [/ @' z/ H* I# c
- void Start()
7 d& `* d% k* D9 Z - {/ G( c5 b9 A% U# g: F; C: W$ X
- //加载AssetBundle之前,先加载依赖的Bundle
+ N8 @6 F. n+ ~ - //字符串"StandaloneWindows",是一个文件。这个文件的名字,是根据打包脚本,打包到哪个文件夹下,这个文件就叫什么名字。 B1 ?/ w& U( N5 G1 d( X! ?
- //字符串"AssetBundleManifest",是固定写法。
( n0 a, H4 v+ n3 ^9 v/ I - AssetBundle assetBundle =
5 E9 w: N9 S% F. E5 d! J - AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "StandaloneWindows"));
- s0 z) {( W& o, h& I1 } - AssetBundleManifest manifest = assetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");</p># x* B7 H7 z# H
- <p style="line-height: 30px; text-indent: 2em;"> //字符串"tiger",是你要加载的老虎模型预制体的名字
8 k, a/ d% T x - foreach (var item in manifest.GetAllDependencies("tiger"))( p! @0 o+ m2 O, k: i
- {
/ A" Z8 O, S V2 F$ L5 f - AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, item));
6 x" D: t; E! I# \' l - }</p>
0 _5 Y/ I, c! D' p2 P8 H# Z - <p style="line-height: 30px; text-indent: 2em;"> //------若要加载的文件只是一个视频或者其他,无依赖,可只做下面,直接加载Bundle文件,直接读Bundle即可------//</p>' m4 t9 G7 e& ?& N7 \) p+ S
- <p style="line-height: 30px; text-indent: 2em;"> //现在便可以加载模型了
% o! T$ h7 r3 @% w5 G- j: J# f - string modelPath = Path.Combine(Application.streamingAssetsPath, "tiger");
' Y( H% ]% L+ Y. S - AssetBundle useAb = AssetBundle.LoadFromFile(modelPath);
, K, X4 S! E- F! s: k5 [$ S" X' d - GameObject obj = useAb.LoadAsset<GameObject>("Tiger");</p>
R4 j* Y% \) `, i, B* x - <p style="line-height: 30px; text-indent: 2em;"> Instantiate(obj, transform);# Q# ?( o' Z3 M
- }4 B( h0 H- [4 j5 g" } U
- }</p>
复制代码 好啦,这就是本章所有内容 ~+ r4 G$ ]* {1 e5 C
# f8 p* l# N& n" D4 @1 g8 E( F- {
|