|
一、插件功能, h# u: w% g- e3 Z0 s
1、插件是发布AB包的工具$ ~5 S% A ~4 P# W! e% t
AssetBundle Browse可以将项目中的资源打包成AB包,发布游戏后,项目将通过加载StreamingAssets中AB包的形式,加载所需资源,而不是像之前那样,从Assets中进行加载。 1、AB包是什么: ]- P o5 \$ h" {% ~$ J
AB包全名AssetBundle(资源包)。是一种Unity提供的用于存放资源的包。通过将资源分布在不同的AB包中可以最大程度地减少运行时的内存压力,并且可以有选择地加载内容。 2、为什么要用AB包
^! v2 Y+ D9 @0 mⅠ、热更新 要热更新需要确保AB包打出来的资源具有唯一性,且相同资源的AB包检验码相同。 Ⅱ、Resources加载存在问题 Resources加载虽然简单方便,但是也有很多问题:
; I) B8 h, N4 N. [! x5 W3 M- 对内存管理造成一定的负担。
- 在打开应用时加载时间很长。
- Resources文件夹下的所有资源统一合并到一个序列化文件中(可以看成统一打一个大包,巨型AB包有什么问题它就有什么问题),对资源优化有一定的限制。# T8 a' `) X+ V2 C2 N3 g q
因此不建议大量使用Resources。0 Z- W; b5 a- c& a6 V$ u( G
二、安装插件的方式/ C8 B$ {- k9 V* h) B
1、PackageManager安装3 h; O: W2 I2 h6 x0 `- o
橙子测试在Unity2019.3版本中,PackageManager中便有此插件, 同学们可以先看看自己版本的Unity是否可以直接安装。
; o) M" @* a+ ~
" [/ C; Q+ @" g' P % Y" Y. j' u) M; G- d+ Z
2、GitHub下载, O: h* G) f! m7 N8 d
有的Unity版本是没有PackageManager的,或者PackageManager中没有此插件。 那么我们可以去GitHub下载此插件:传送门 三、插件使用方法介绍
( P# c- e8 H5 ?3 }, M! c. y' h下面介绍如何将Assets中的资源打成AB包。 1、实现导出一个AB包; F; [2 ?+ G7 M/ a0 R
我们以该模型为例,将该模型打成AB包。
! L, Q) J$ [. D/ b# l; ?
9 A G( V) u! j
5 ^, Z& z0 @) K% ~" p% L' P+ F! ^: IⅠ、制成预制体,并设定AssetBundle 如下图所示。 AssetBundle名字只能是小写。
) R" ~' l: H: {+ r- y
; n6 R& C- }! T: y+ g7 D
0 N$ z/ _( v$ c$ i: e5 f9 ~ p1 eⅡ、AssetBundle Browser界面介绍 Window - AssetBundle Browser,可打开配置界面。 Configure界面* s8 r1 w' z( g r
我们能看到所有被标记为AssetBundle的文件。
+ E' @- u# y) P$ z8 h% p( r
, q. s, w2 {6 k. w! p+ e$ U. I% R7 _/ Z" f - Y, e2 J1 |. c7 I4 l7 p- r3 `" r
Build界面; K; w8 ]6 i1 X: R \
该界面是进行打包的界面。 # H) J3 J% O" c8 z
- Build Target:选择发布的平台
- Output Path:输出路径
- Clear Folders:构建之前清空文件夹(会把文件夹删除)
- Copy to StreamingAssets:拷贝至StreamingAssets文件夹
- Compression:选择压缩格式
% l4 e6 E0 [& V/ m9 k4 L1 i* P& e
3 ^ X* q8 o( S: E
2 k1 W2 o8 F7 N5 K- [* P3 }Inspect界面
3 F# [2 g/ i$ f这个界面会展示已经打成AB包的包内部信息。 选择左上角的 Add Folder,选择AssetBundle所在的目录。然后该界面左侧会列出该文件夹下的所有AB包。 在左侧展示的文件列表中任选一个AssetBundle,右边会展示AssetBundle内部的信息,包括它包含的资源,预加载的组件和依赖等等。 右上角的 -键可以从列表中删除当前选中的文件夹。 7 J' V3 P" P$ n- C$ K" @
3 y) Q; m. U6 c
1 }0 f$ _/ ]: n% ZⅢ、完成打包 点击Build即可对当前Browser中所有的bundle进行打包,选择路径,即可在该路径下看到生成的资源文件。 若你勾选了Copy to StreamingAssets,还会自动帮你拷贝到StreamingAssets文件夹
. ~" X) [3 _. [( N, f/ Z 1 p; p X6 z% u" Q6 c1 Y" X/ Y
& h- o3 e. z8 h% v: A' Q' c
2、实现资源复用& n+ h m4 I- T1 A3 ^) G; ]
📢 什么是资源复用
- R& v; b. g2 ^在打包的过程中,有很多资源都是重复的。例如:
0 K$ L) Y9 F! n( @5 J- 多个预制体使用的同一个模型,预制体只是材质颜色不同。
- 有图片,被多个预制体使用。; f! V6 Q( o( u, b' j7 F
如果分别打AB包,这样会造成包体过大。
: ~8 G, p+ f) u! Y% `* t' rAssetBundleBrowser提供了解决方法,用创建共享AB包的形式,很好的解决掉了这一问题,实现了资源的复用。 Ⅰ、一个资源重复的现象0 }3 x0 u( z5 o; C1 H. Z& w
我们实现一个资源重复的现象:
& k. x# Y8 q$ k, R( G; V# E- 制作Trigger的复制预制体,新建材质球,替换它的原始材质球。
- 给该预制体的AssetBundle重命名为tiggernew
$ o2 v |2 n }+ F
- P( J/ w$ Z, ^" K* g) l3 T5 D # P6 i7 W& L0 T7 f$ i) p% {
Ⅱ、创建共享AB包, W" A) e% w1 r* ?$ ^; U
我们此时再次打开AssetBundle Browser,可以看到很多感叹号。
4 B! E2 [* m: E; e- 左侧预制体的感叹号,代表它们其中有重复的资源
- 右侧包体内的感叹号,代表是这些资源重复, i) I" P Z5 n$ M) T- H
) F5 u- L( Z+ u/ E: G% `
- s2 k5 J I; D6 N& H% V; B
创建res AB包: 在左侧右键,Add new bundle,创建一个res包(该名子可自行命名)。后面我们用它存储重复的资源。 $ F- N$ s' {1 r
8 y. [9 c; g# s) s& j9 s) E
将重复资源拖到res包内: 将tiger中的重复资源拖到res包内,我们能看到拖拽完成后,其他ab包内重复的资源也消失了。现在只有一份资源。3 e5 z9 p) i0 x0 S8 A! [
2 ]' k# H* Z Q ' j, [$ F* u9 j& u' Q
8 N1 h9 Z6 o% J" y
Ⅲ、完成打包
1 R0 j4 B! i$ p* U/ b' J同样的操作,点击Build,完成AB包的打包。 此时AB包内容如下: / Y+ ]2 Z5 y% l1 }% n
# b0 W2 P' T: {$ @' m
, h8 x6 K+ {# H6 k四、代码实例化AB包资源1 p8 B6 x# G6 y0 U. R
下面我们完整做完整个流程:使用代码,去加载AB包中的老虎,完成我们的整个测试。 将该脚本挂载在场景中的物体上,运行项目时,便会加载出老虎了!& m/ e8 r! }. T( ^6 i: |
- using System.IO;
" I' O0 o. j4 }9 r. i - using UnityEngine;<p></p>
% o, K' i+ ~" |; E - <p style="line-height: 30px; text-indent: 2em;">public class ABTest : MonoBehaviour8 e$ a8 [4 Y# o/ c
- {' O3 C" _3 `0 u' e
- void Start()
1 W6 A2 z" t3 H, L3 L - {
( X' V9 r8 C! G1 a, ]! \ - //加载AssetBundle之前,先加载依赖的Bundle- [0 G; F+ B6 w
- //字符串"StandaloneWindows",是一个文件。这个文件的名字,是根据打包脚本,打包到哪个文件夹下,这个文件就叫什么名字。 g) ^2 J7 @% J1 r9 X
- //字符串"AssetBundleManifest",是固定写法。' x4 B5 R1 C0 Q- K* W2 [. {
- AssetBundle assetBundle =; ^8 A0 }+ T+ V! J
- AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "StandaloneWindows"));
1 {5 Z: }; i7 Y" Y/ H8 G% E$ ^ - AssetBundleManifest manifest = assetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");</p>
: b6 i u; O3 L( ^2 p - <p style="line-height: 30px; text-indent: 2em;"> //字符串"tiger",是你要加载的老虎模型预制体的名字7 P" W; {" J: U: ~- q7 M& p$ {8 A
- foreach (var item in manifest.GetAllDependencies("tiger"))
3 Y0 A8 y, d& J F! F5 a m - {
u& J& }; N8 d - AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, item));8 a& A: d4 s5 ~( q6 k5 Z, D" K+ i' H
- }</p>
$ {. o# ~6 [. I$ f - <p style="line-height: 30px; text-indent: 2em;"> //------若要加载的文件只是一个视频或者其他,无依赖,可只做下面,直接加载Bundle文件,直接读Bundle即可------//</p>% x+ N: R5 z) ]/ A/ L
- <p style="line-height: 30px; text-indent: 2em;"> //现在便可以加载模型了% H4 h# x2 u7 S
- string modelPath = Path.Combine(Application.streamingAssetsPath, "tiger");; [. ]: Y) u. b
- AssetBundle useAb = AssetBundle.LoadFromFile(modelPath);9 r, J: |/ q, e) w3 @
- GameObject obj = useAb.LoadAsset<GameObject>("Tiger");</p>
, z! S8 q/ z b0 E3 W+ x7 A - <p style="line-height: 30px; text-indent: 2em;"> Instantiate(obj, transform);# m6 q2 Y" Y$ P3 w: y4 D' G B
- }
/ j' F: R" ?8 ^ - }</p>
复制代码 好啦,这就是本章所有内容 ~; B) f- f2 \1 \; P3 I; x
' T' @$ U+ { H* k4 ^+ @( c |