|
一、插件功能
. c X6 M2 g7 o5 ^0 v$ i+ }1、插件是发布AB包的工具8 K5 x! N) K ?6 I* Z2 V
AssetBundle Browse可以将项目中的资源打包成AB包,发布游戏后,项目将通过加载StreamingAssets中AB包的形式,加载所需资源,而不是像之前那样,从Assets中进行加载。 1、AB包是什么
7 n& a* ?$ H2 l& O5 b; k0 PAB包全名AssetBundle(资源包)。是一种Unity提供的用于存放资源的包。通过将资源分布在不同的AB包中可以最大程度地减少运行时的内存压力,并且可以有选择地加载内容。 2、为什么要用AB包+ J: \; _) U9 B
Ⅰ、热更新 要热更新需要确保AB包打出来的资源具有唯一性,且相同资源的AB包检验码相同。 Ⅱ、Resources加载存在问题 Resources加载虽然简单方便,但是也有很多问题:
2 C. `: X2 j9 o- 对内存管理造成一定的负担。
- 在打开应用时加载时间很长。
- Resources文件夹下的所有资源统一合并到一个序列化文件中(可以看成统一打一个大包,巨型AB包有什么问题它就有什么问题),对资源优化有一定的限制。
2 ]- \* h: z/ W$ I( k0 O 因此不建议大量使用Resources。
5 W& M! f: V; \7 r9 m1 C二、安装插件的方式
3 ~( h8 v/ N# h7 L! d+ [3 L( J1、PackageManager安装% ^/ R) r: ~ X. G
橙子测试在Unity2019.3版本中,PackageManager中便有此插件, 同学们可以先看看自己版本的Unity是否可以直接安装。 4 U1 i2 u9 ~/ @5 `
. H# X) s$ [/ T! X$ r
8 i$ I2 `+ |! X5 y( s, K6 @0 W, m7 W2、GitHub下载2 W- @8 J, P5 V3 W6 Q4 _9 l
有的Unity版本是没有PackageManager的,或者PackageManager中没有此插件。 那么我们可以去GitHub下载此插件:传送门 三、插件使用方法介绍, J2 u2 m9 ~8 j
下面介绍如何将Assets中的资源打成AB包。 1、实现导出一个AB包. O/ e2 R, f6 C! M+ X
我们以该模型为例,将该模型打成AB包。 3 V5 N5 q2 I7 l, c' D
/ ?+ r7 c0 Y6 m( g2 L) { & h* a% s) j% s: e. j
Ⅰ、制成预制体,并设定AssetBundle 如下图所示。 AssetBundle名字只能是小写。 3 [' f* i) j. u& p
9 ]$ {/ |5 d6 G# P
% L$ K& F" t9 t0 ?0 m% k3 O% GⅡ、AssetBundle Browser界面介绍 Window - AssetBundle Browser,可打开配置界面。 Configure界面5 B% } c& e! G+ B$ s' F/ I6 ]
我们能看到所有被标记为AssetBundle的文件。
# j: }* M$ K& x8 Z4 c6 p- A- `- h
& k7 T& L! Y9 S* H - h5 Y, _ m9 t. {& J
Build界面
: w- P% A3 b, `+ [1 c; ]该界面是进行打包的界面。
4 N* \3 F1 ~" E: x; H, [% H- Build Target:选择发布的平台
- Output Path:输出路径
- Clear Folders:构建之前清空文件夹(会把文件夹删除)
- Copy to StreamingAssets:拷贝至StreamingAssets文件夹
- Compression:选择压缩格式
' y# E5 x" n* |9 a) V
& L8 Z/ ]' \- B8 M4 r- g
0 Z. C7 M0 h% A0 v6 P7 S. w6 ]
Inspect界面+ @9 }: M0 K' _$ f
这个界面会展示已经打成AB包的包内部信息。 选择左上角的 Add Folder,选择AssetBundle所在的目录。然后该界面左侧会列出该文件夹下的所有AB包。 在左侧展示的文件列表中任选一个AssetBundle,右边会展示AssetBundle内部的信息,包括它包含的资源,预加载的组件和依赖等等。 右上角的 -键可以从列表中删除当前选中的文件夹。
* Z1 W8 i1 n& T! c $ }1 `9 _( |4 w. u/ [
+ g8 f3 k- r8 i& a# w
Ⅲ、完成打包 点击Build即可对当前Browser中所有的bundle进行打包,选择路径,即可在该路径下看到生成的资源文件。 若你勾选了Copy to StreamingAssets,还会自动帮你拷贝到StreamingAssets文件夹 0 s% p8 J4 K- ?/ X; c5 S
) F, @! }- c1 v" ` }4 R ^
. R$ V1 L' j; c
2、实现资源复用+ Q$ L! `9 I. i+ m N! Q
📢 什么是资源复用5 r. q9 T, U) H' r) ~
在打包的过程中,有很多资源都是重复的。例如:
7 E+ J7 [8 u9 c* C5 |- 多个预制体使用的同一个模型,预制体只是材质颜色不同。
- 有图片,被多个预制体使用。8 ]1 ~% m4 \/ k; P% H
如果分别打AB包,这样会造成包体过大。! a. q; `) u+ K1 _$ v
AssetBundleBrowser提供了解决方法,用创建共享AB包的形式,很好的解决掉了这一问题,实现了资源的复用。 Ⅰ、一个资源重复的现象, K0 u7 J' w2 U6 J- b. o5 }$ V
我们实现一个资源重复的现象:
% X; B) b+ o$ U* S( c& l; N4 ~( |- 制作Trigger的复制预制体,新建材质球,替换它的原始材质球。
- 给该预制体的AssetBundle重命名为tiggernew c0 E: f: T6 k5 q$ A* W, d; T
- u- R, i5 h3 R( i
- v* S$ M; k% _8 g% T9 }' }7 |Ⅱ、创建共享AB包/ U8 v( k0 o% Z% Z! n0 |
我们此时再次打开AssetBundle Browser,可以看到很多感叹号。
; u U, y$ H$ O- J& C/ J- 左侧预制体的感叹号,代表它们其中有重复的资源
- 右侧包体内的感叹号,代表是这些资源重复
# b0 f2 q) H1 A2 F3 y/ x7 f
- L# H6 b9 ?" } I. L" o % _5 w) S1 W) a: }; ]
创建res AB包: 在左侧右键,Add new bundle,创建一个res包(该名子可自行命名)。后面我们用它存储重复的资源。
5 ]$ Y3 u6 n5 N 9 V2 f' `* e/ H1 f/ o" r' e3 a
将重复资源拖到res包内: 将tiger中的重复资源拖到res包内,我们能看到拖拽完成后,其他ab包内重复的资源也消失了。现在只有一份资源。/ Y- B4 Q1 g( Z! r6 W% v& U
0 G9 O3 N X; I. l/ T0 R/ O' F + d l2 I) n5 n1 ?: V9 W: x
2 I4 Q, i9 b8 v- L. kⅢ、完成打包4 L Y7 _* Y1 U9 E8 ~, R
同样的操作,点击Build,完成AB包的打包。 此时AB包内容如下: - D1 G9 N- [6 x" m
- P2 [* M/ U) r1 L
. s1 g: y, Q2 A+ p* n6 Q四、代码实例化AB包资源
% Y3 c F$ r3 l- @5 K下面我们完整做完整个流程:使用代码,去加载AB包中的老虎,完成我们的整个测试。 将该脚本挂载在场景中的物体上,运行项目时,便会加载出老虎了!
7 ^/ Z4 F2 I" K' J - using System.IO;
9 Y' k$ x" K. O4 x - using UnityEngine;<p></p>
* ^% H/ X# K7 K- r. F! w5 c - <p style="line-height: 30px; text-indent: 2em;">public class ABTest : MonoBehaviour
6 l! G+ j! @$ A8 C3 U - {4 f2 `7 ~9 D `% w( M
- void Start()
3 y% K) ` B2 s+ o1 d5 N - {! l- O* H, s( n" z' U% x" I9 _: d
- //加载AssetBundle之前,先加载依赖的Bundle
( ~ [7 s2 V4 |1 F1 b - //字符串"StandaloneWindows",是一个文件。这个文件的名字,是根据打包脚本,打包到哪个文件夹下,这个文件就叫什么名字。0 \" j: v/ T Y* V
- //字符串"AssetBundleManifest",是固定写法。
( o$ I- R- n: B2 d- e - AssetBundle assetBundle =# H" }) F) q. X
- AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "StandaloneWindows"));
# T* Y* ]# |6 v2 ] - AssetBundleManifest manifest = assetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");</p>
( o s: J4 `2 A% | ? - <p style="line-height: 30px; text-indent: 2em;"> //字符串"tiger",是你要加载的老虎模型预制体的名字
8 q% z6 h" q9 y - foreach (var item in manifest.GetAllDependencies("tiger"))
* p; ~$ j4 ^4 A# j) j g - {- {; w) i- Z9 ~/ s
- AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, item));
- m6 `3 @1 b* V2 z0 f3 q+ {8 ^ - }</p>
8 |8 T9 o2 o: B - <p style="line-height: 30px; text-indent: 2em;"> //------若要加载的文件只是一个视频或者其他,无依赖,可只做下面,直接加载Bundle文件,直接读Bundle即可------//</p> b0 H* G7 Q" z
- <p style="line-height: 30px; text-indent: 2em;"> //现在便可以加载模型了
( n7 D# g6 }, l% E5 U! ` - string modelPath = Path.Combine(Application.streamingAssetsPath, "tiger");
9 ]4 F: ?7 v; _ - AssetBundle useAb = AssetBundle.LoadFromFile(modelPath); V0 U7 _+ b. L
- GameObject obj = useAb.LoadAsset<GameObject>("Tiger");</p>
7 o) L" ]7 O. i u! K - <p style="line-height: 30px; text-indent: 2em;"> Instantiate(obj, transform); {( {- B# r0 m1 d, E W
- }3 K! H: Q- Z& X/ ?4 ?5 d$ f
- }</p>
复制代码 好啦,这就是本章所有内容 ~$ w' T3 ]" L% [5 Q! F$ D+ n
% B1 z& A" E4 @+ S7 @( t |