|
一、插件功能" Q( @0 B" z) t. U* Z# A# Q( _: i; V
1、插件是发布AB包的工具
. @, Z+ c4 ~2 @5 h# E sAssetBundle Browse可以将项目中的资源打包成AB包,发布游戏后,项目将通过加载StreamingAssets中AB包的形式,加载所需资源,而不是像之前那样,从Assets中进行加载。 1、AB包是什么 i1 h$ f* a5 @' i5 k8 F
AB包全名AssetBundle(资源包)。是一种Unity提供的用于存放资源的包。通过将资源分布在不同的AB包中可以最大程度地减少运行时的内存压力,并且可以有选择地加载内容。 2、为什么要用AB包0 j) o- F, Q+ H3 r) Y) O
Ⅰ、热更新 要热更新需要确保AB包打出来的资源具有唯一性,且相同资源的AB包检验码相同。 Ⅱ、Resources加载存在问题 Resources加载虽然简单方便,但是也有很多问题: 2 |9 o3 r+ P6 i L2 o! ?
- 对内存管理造成一定的负担。
- 在打开应用时加载时间很长。
- Resources文件夹下的所有资源统一合并到一个序列化文件中(可以看成统一打一个大包,巨型AB包有什么问题它就有什么问题),对资源优化有一定的限制。$ k8 Q" M) c: D! @
因此不建议大量使用Resources。 {- U5 s: d7 M
二、安装插件的方式
3 F# r3 S" r$ ~+ Y3 Z1 V% O$ `1、PackageManager安装
, K9 y# Q( a3 r' z8 ]橙子测试在Unity2019.3版本中,PackageManager中便有此插件, 同学们可以先看看自己版本的Unity是否可以直接安装。
7 W& r* O. y# R, d. Z0 F
' B1 l0 k3 Z% `- D9 l . B9 u- g+ J j; {6 o" F' N' V
2、GitHub下载
1 _3 j( n, i/ i M3 z有的Unity版本是没有PackageManager的,或者PackageManager中没有此插件。 那么我们可以去GitHub下载此插件:传送门 三、插件使用方法介绍
- \$ Y+ e3 g+ x4 F' j! n下面介绍如何将Assets中的资源打成AB包。 1、实现导出一个AB包
' i* B. h. l' @) S我们以该模型为例,将该模型打成AB包。 1 @) E! }' _( b' W
8 l! x4 r# z) I9 e; s$ ~' T
/ v; z2 f+ L" J$ y. SⅠ、制成预制体,并设定AssetBundle 如下图所示。 AssetBundle名字只能是小写。
$ t" _6 _8 e; K. l; m 0 @" H. B( k! @( V3 _
+ O8 H b2 R5 w1 r9 s( [: pⅡ、AssetBundle Browser界面介绍 Window - AssetBundle Browser,可打开配置界面。 Configure界面2 m7 g; M, Z5 K( d) U) ]" b+ C
我们能看到所有被标记为AssetBundle的文件。
; a% C5 H4 D. ]1 p$ }
/ n( L& L; B3 L( A( u
u! ], N5 P5 P: k" U/ p' ^* nBuild界面4 h' D3 ~# \& ?* }& H
该界面是进行打包的界面。 8 _: Q" H8 K' |( `$ D5 P+ ]& d
- Build Target:选择发布的平台
- Output Path:输出路径
- Clear Folders:构建之前清空文件夹(会把文件夹删除)
- Copy to StreamingAssets:拷贝至StreamingAssets文件夹
- Compression:选择压缩格式2 O# D. |& }& t% F1 {2 X, ~
7 O- o2 L8 C2 ?" R9 c3 R
z3 M# r1 w' Y1 r2 @4 I% C0 c- cInspect界面& C* i, D, s/ _ T2 B% ]$ O& T
这个界面会展示已经打成AB包的包内部信息。 选择左上角的 Add Folder,选择AssetBundle所在的目录。然后该界面左侧会列出该文件夹下的所有AB包。 在左侧展示的文件列表中任选一个AssetBundle,右边会展示AssetBundle内部的信息,包括它包含的资源,预加载的组件和依赖等等。 右上角的 -键可以从列表中删除当前选中的文件夹。
$ Y6 w. A# D: E
, }$ n- i2 }" p' a. P& n" z* A 8 ]) ?3 Y5 m/ H4 u8 x) w
Ⅲ、完成打包 点击Build即可对当前Browser中所有的bundle进行打包,选择路径,即可在该路径下看到生成的资源文件。 若你勾选了Copy to StreamingAssets,还会自动帮你拷贝到StreamingAssets文件夹 0 G9 U, C" l7 w6 n4 ?0 f/ K G6 t
2 r* D1 q: K) x. l& ?2 r
/ c( A. d% V! Z, g2、实现资源复用
1 Y/ B" V3 ]1 R* i; m5 l4 r2 K4 V" F📢 什么是资源复用
: U- R6 o: }( Y/ }0 n! G在打包的过程中,有很多资源都是重复的。例如:
/ _* p2 S$ Y* I/ S8 {& |- 多个预制体使用的同一个模型,预制体只是材质颜色不同。
- 有图片,被多个预制体使用。
2 v# [0 E$ Q3 I @" z [ 如果分别打AB包,这样会造成包体过大。
7 W! o" P6 F2 P% }: P; JAssetBundleBrowser提供了解决方法,用创建共享AB包的形式,很好的解决掉了这一问题,实现了资源的复用。 Ⅰ、一个资源重复的现象
, M+ i/ T# Q# M6 J7 x1 z我们实现一个资源重复的现象: : g/ ~! [6 a; Y* H& F
- 制作Trigger的复制预制体,新建材质球,替换它的原始材质球。
- 给该预制体的AssetBundle重命名为tiggernew2 E# }7 j+ N" k$ ~; p3 L
7 x( J% h q( S3 g& m. y0 a6 q " b0 q; s- a( Q {! J% f$ s# y
Ⅱ、创建共享AB包, f7 ~+ s( S5 o% t; M4 L* A
我们此时再次打开AssetBundle Browser,可以看到很多感叹号。 7 g; U$ c0 d- I4 ^9 O
- 左侧预制体的感叹号,代表它们其中有重复的资源
- 右侧包体内的感叹号,代表是这些资源重复5 Q, _' m: p) h1 A9 }, h6 z
" r: C( b$ P3 o- F4 _5 C * ^/ k# g3 W- N5 L2 p; M
创建res AB包: 在左侧右键,Add new bundle,创建一个res包(该名子可自行命名)。后面我们用它存储重复的资源。
9 y4 z8 b# ~7 @2 i$ z9 ~
% _) N. a7 n4 j. h( M4 j 将重复资源拖到res包内: 将tiger中的重复资源拖到res包内,我们能看到拖拽完成后,其他ab包内重复的资源也消失了。现在只有一份资源。
8 Q) w/ @' f3 L" A( t8 ^* |0 r7 l7 J7 j t' h
7 |$ A4 S# [( @1 } - B7 g' X) a( Z
Ⅲ、完成打包
$ v( N. I# W( e& p" ]: p+ W同样的操作,点击Build,完成AB包的打包。 此时AB包内容如下:
2 P; l6 x7 [6 D( E! x
1 P8 }- a1 U1 q q ^4 } 8 f% `; l8 a E4 p+ {, I
四、代码实例化AB包资源5 I3 K8 ]9 k) J4 b6 p' i N
下面我们完整做完整个流程:使用代码,去加载AB包中的老虎,完成我们的整个测试。 将该脚本挂载在场景中的物体上,运行项目时,便会加载出老虎了!
/ T. G1 k b" @% u+ ^4 ^$ W - using System.IO;& ]- X# |3 h6 V0 w! R6 y, X" Q
- using UnityEngine;<p></p>
8 j% |9 u( S* h6 g- {) H - <p style="line-height: 30px; text-indent: 2em;">public class ABTest : MonoBehaviour: r+ S# Z+ X# u- l0 I. J0 ~
- {
/ \. g6 L$ E0 I1 e0 ? - void Start()
1 Q0 N. t9 i8 y/ l- c1 z/ S - {
% v% S/ @2 H3 u3 o - //加载AssetBundle之前,先加载依赖的Bundle
' q6 m: F$ H3 v4 t t0 l - //字符串"StandaloneWindows",是一个文件。这个文件的名字,是根据打包脚本,打包到哪个文件夹下,这个文件就叫什么名字。
- D5 l' g9 V3 k& w$ U - //字符串"AssetBundleManifest",是固定写法。
g2 [; r' S, ]! q - AssetBundle assetBundle =1 |5 k# e% a% D K' ]6 J
- AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "StandaloneWindows"));
- Z3 r1 ~! u) r& t, w4 y& h1 C - AssetBundleManifest manifest = assetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");</p>
2 ]6 d/ \5 t+ v3 G9 d5 {( a9 A2 }3 l - <p style="line-height: 30px; text-indent: 2em;"> //字符串"tiger",是你要加载的老虎模型预制体的名字$ J, J [" ^ U! Z8 C5 a, x
- foreach (var item in manifest.GetAllDependencies("tiger"))
. d- h2 q/ T6 X* v, U% w* W - {
$ s: |) Q8 J, p - AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, item));* H4 ]1 `. V8 O+ O3 N6 f
- }</p>: M' v, L; I* x0 R
- <p style="line-height: 30px; text-indent: 2em;"> //------若要加载的文件只是一个视频或者其他,无依赖,可只做下面,直接加载Bundle文件,直接读Bundle即可------//</p>0 d o# b8 R8 ?/ S+ L
- <p style="line-height: 30px; text-indent: 2em;"> //现在便可以加载模型了0 v$ E; ]: q1 r9 Y
- string modelPath = Path.Combine(Application.streamingAssetsPath, "tiger");
) C5 [$ S/ t* X - AssetBundle useAb = AssetBundle.LoadFromFile(modelPath);
$ f5 `9 _9 X& N( \1 j r - GameObject obj = useAb.LoadAsset<GameObject>("Tiger");</p>
9 x& l" @: R$ G" P1 D - <p style="line-height: 30px; text-indent: 2em;"> Instantiate(obj, transform);. w" `- B; |/ W5 [' `! [- ]
- }
4 M9 J: E9 O6 h" ~- u: y - }</p>
复制代码 好啦,这就是本章所有内容 ~0 b& b6 d: t6 B" F: x. l
: B: h9 D, v2 p2 [" A
|