一、插件功能
: X7 I2 L! h! X8 O8 s. g6 j0 k1、插件是发布AB包的工具/ G) G0 Y: v0 ]& }
AssetBundle Browse可以将项目中的资源打包成AB包,发布游戏后,项目将通过加载StreamingAssets中AB包的形式,加载所需资源,而不是像之前那样,从Assets中进行加载。 1、AB包是什么/ \1 v; I- \" z( F) R
AB包全名AssetBundle(资源包)。是一种Unity提供的用于存放资源的包。通过将资源分布在不同的AB包中可以最大程度地减少运行时的内存压力,并且可以有选择地加载内容。 2、为什么要用AB包' Q6 I y' ?. v! @! [& E/ I1 B
Ⅰ、热更新 要热更新需要确保AB包打出来的资源具有唯一性,且相同资源的AB包检验码相同。 Ⅱ、Resources加载存在问题 Resources加载虽然简单方便,但是也有很多问题:
& w9 }4 i# X+ E. n/ z' D" Z- 对内存管理造成一定的负担。
- 在打开应用时加载时间很长。
- Resources文件夹下的所有资源统一合并到一个序列化文件中(可以看成统一打一个大包,巨型AB包有什么问题它就有什么问题),对资源优化有一定的限制。5 d2 ` `. v, p' j. w# Y" H; r
因此不建议大量使用Resources。
2 v' \. g6 @+ W$ U0 \二、安装插件的方式
/ X& C) S; d7 x: s9 C3 J" S1、PackageManager安装
1 E# q6 w0 d) j. C6 H2 @( H橙子测试在Unity2019.3版本中,PackageManager中便有此插件, 同学们可以先看看自己版本的Unity是否可以直接安装。 * }! }/ N1 r2 J; T/ a2 g
$ h8 i) Z* C& k) Y' \6 Z. G/ E4 R
6 Z. B9 e' ^0 H9 |0 \# W
2、GitHub下载
- L1 D* }: F( L有的Unity版本是没有PackageManager的,或者PackageManager中没有此插件。 那么我们可以去GitHub下载此插件:传送门 三、插件使用方法介绍* {- \+ m) Z# D9 p$ }) ~7 @
下面介绍如何将Assets中的资源打成AB包。 1、实现导出一个AB包5 |* }6 Y( J- S) J8 k+ B' x
我们以该模型为例,将该模型打成AB包。 / |- N$ x X, ^% Z
; r1 v: K7 ?4 Q " \! s8 _2 E: z) I! i7 x* E; `9 J
Ⅰ、制成预制体,并设定AssetBundle 如下图所示。 AssetBundle名字只能是小写。
3 G8 i: V/ }$ S5 D3 ]% j9 x/ | % n- x5 [! r+ ^* E3 P
1 X# t( f v; i% R' }3 W$ f9 gⅡ、AssetBundle Browser界面介绍 Window - AssetBundle Browser,可打开配置界面。 Configure界面( U7 \" j/ W2 L0 X4 G+ `
我们能看到所有被标记为AssetBundle的文件。
2 Y+ _& D4 \3 X4 N H0 ^; J9 ]
( q; r6 }8 R9 @* L# T/ C9 ?, x
$ f& C2 K% S5 r8 ~6 t5 `: x2 V0 OBuild界面
& h* D2 Q1 c2 e* f该界面是进行打包的界面。
2 ?5 U+ t2 Z+ w- Build Target:选择发布的平台
- Output Path:输出路径
- Clear Folders:构建之前清空文件夹(会把文件夹删除)
- Copy to StreamingAssets:拷贝至StreamingAssets文件夹
- Compression:选择压缩格式! K7 j% H! E _$ _
5 j$ V! Q9 |" p+ T& Q( @5 M0 E9 z$ ^
0 h: v0 ~* J C2 E, y8 m
Inspect界面
: |% j! x2 X; d: E* O这个界面会展示已经打成AB包的包内部信息。 选择左上角的 Add Folder,选择AssetBundle所在的目录。然后该界面左侧会列出该文件夹下的所有AB包。 在左侧展示的文件列表中任选一个AssetBundle,右边会展示AssetBundle内部的信息,包括它包含的资源,预加载的组件和依赖等等。 右上角的 -键可以从列表中删除当前选中的文件夹。 6 f0 m4 |2 {7 p8 Q4 v# G' ^% v
6 h( i- C1 S) ?# O! p
; b9 T' P M, ^/ mⅢ、完成打包 点击Build即可对当前Browser中所有的bundle进行打包,选择路径,即可在该路径下看到生成的资源文件。 若你勾选了Copy to StreamingAssets,还会自动帮你拷贝到StreamingAssets文件夹 / G. T3 H8 B* ?" `3 ]) G4 z3 Q0 F
. R" e# j9 o% u3 B! A/ f7 m
5 |1 r' G! ]. E1 z6 @$ M9 U- b6 ]2、实现资源复用* t0 L( e, h4 @# u4 k4 X
📢 什么是资源复用 [* p/ x. @$ b8 V3 m% y, M
在打包的过程中,有很多资源都是重复的。例如:
' j: ~' ~5 _- d" e: \0 d) E7 m. x# G- 多个预制体使用的同一个模型,预制体只是材质颜色不同。
- 有图片,被多个预制体使用。. f3 p/ S; a- a1 b
如果分别打AB包,这样会造成包体过大。
( [, q9 B* G2 I( C+ y" B oAssetBundleBrowser提供了解决方法,用创建共享AB包的形式,很好的解决掉了这一问题,实现了资源的复用。 Ⅰ、一个资源重复的现象
J% u5 }' l( a, F2 p0 T我们实现一个资源重复的现象: " ^) [/ W+ f1 Z# V0 m
- 制作Trigger的复制预制体,新建材质球,替换它的原始材质球。
- 给该预制体的AssetBundle重命名为tiggernew s. \2 f7 }3 n
7 E# ?7 X' M2 M/ y v! j5 }
3 ?" k9 l" j" u6 I4 p$ }
Ⅱ、创建共享AB包; `7 I0 m8 W% ^+ @9 w- @
我们此时再次打开AssetBundle Browser,可以看到很多感叹号。 . p; M4 d0 K0 u6 ]8 x( j
- 左侧预制体的感叹号,代表它们其中有重复的资源
- 右侧包体内的感叹号,代表是这些资源重复9 x e O( B$ b9 x9 U- i/ [
1 ]; O* Q5 H7 o( Z" ~! n4 ?7 H
! H. [1 U8 J8 W% e; `" }+ w1 k
创建res AB包: 在左侧右键,Add new bundle,创建一个res包(该名子可自行命名)。后面我们用它存储重复的资源。
8 J, z4 B$ w! v P! p, S' w 5 V6 m# l. D7 ?& E) M2 i8 V
将重复资源拖到res包内: 将tiger中的重复资源拖到res包内,我们能看到拖拽完成后,其他ab包内重复的资源也消失了。现在只有一份资源。3 l: i$ A& y2 C D
0 E1 [! {- q& M7 I
# U( x. F" J4 z+ \
) y" `+ f. i, N" P PⅢ、完成打包! z6 L5 H% Y( r/ x3 t
同样的操作,点击Build,完成AB包的打包。 此时AB包内容如下:
1 [$ e9 ^( V, H( U3 u ' n0 m: J" {& v$ O+ c% s7 T
- m% O: h/ B. c, V
四、代码实例化AB包资源
1 Q' X! m/ m3 c下面我们完整做完整个流程:使用代码,去加载AB包中的老虎,完成我们的整个测试。 将该脚本挂载在场景中的物体上,运行项目时,便会加载出老虎了!
$ D6 I/ k/ |: W* H - using System.IO;- t& Y( O7 f5 B- L8 H# k7 a; M
- using UnityEngine;<p></p>. m) y' t. i% Y
- <p style="line-height: 30px; text-indent: 2em;">public class ABTest : MonoBehaviour
# N. T' O! s! R5 m& Z: W - {
( h8 c, e8 p' x6 ]: G( m - void Start()1 ]( }; w& S# K3 [. m
- {
7 Y' r0 c" q2 |: q6 p - //加载AssetBundle之前,先加载依赖的Bundle
* d* A8 H2 `) s" a- ]8 l* G - //字符串"StandaloneWindows",是一个文件。这个文件的名字,是根据打包脚本,打包到哪个文件夹下,这个文件就叫什么名字。
# s" B# F) V4 { ~* X1 l+ T - //字符串"AssetBundleManifest",是固定写法。
8 w S$ d9 I. ~! ]+ w - AssetBundle assetBundle =
6 r, X& C+ L, x u! X - AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "StandaloneWindows"));
( h) D4 X8 z5 G: k1 R# A2 t - AssetBundleManifest manifest = assetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");</p>% N; }7 E/ p& @- U. |
- <p style="line-height: 30px; text-indent: 2em;"> //字符串"tiger",是你要加载的老虎模型预制体的名字 d* b! _/ y% A3 n8 f$ P+ J
- foreach (var item in manifest.GetAllDependencies("tiger"))
( N4 y' M/ b7 F; c9 l8 s - {* }* Z5 E+ L5 p0 m! E+ B8 o, x6 I
- AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, item)); h: j" T0 ~5 r: H' Z
- }</p>
! t* y+ M) [7 w( T - <p style="line-height: 30px; text-indent: 2em;"> //------若要加载的文件只是一个视频或者其他,无依赖,可只做下面,直接加载Bundle文件,直接读Bundle即可------//</p># S) U9 p0 s9 D6 Y- o
- <p style="line-height: 30px; text-indent: 2em;"> //现在便可以加载模型了
0 C" o# O0 ^% h - string modelPath = Path.Combine(Application.streamingAssetsPath, "tiger");( ^4 m0 {* k. K3 v; ~/ C* M
- AssetBundle useAb = AssetBundle.LoadFromFile(modelPath);
2 Q @' ]6 r2 X% ? - GameObject obj = useAb.LoadAsset<GameObject>("Tiger");</p>
# z1 M5 }9 r8 P6 ~, \3 Z- j8 x& u - <p style="line-height: 30px; text-indent: 2em;"> Instantiate(obj, transform);
C- [7 d! M8 o; |. M - }
; w3 |0 J# B; t! l8 G - }</p>
复制代码 好啦,这就是本章所有内容 ~% j" H: ~$ z# C c+ m; D
. E) A W+ n8 v, A4 A, n |