|
一、插件功能6 C* i( M: N6 \* X* d, T# G6 j6 Z
1、插件是发布AB包的工具- m" _) z( L9 z; _7 J- ?
AssetBundle Browse可以将项目中的资源打包成AB包,发布游戏后,项目将通过加载StreamingAssets中AB包的形式,加载所需资源,而不是像之前那样,从Assets中进行加载。 1、AB包是什么$ x- {$ [9 t& a1 J
AB包全名AssetBundle(资源包)。是一种Unity提供的用于存放资源的包。通过将资源分布在不同的AB包中可以最大程度地减少运行时的内存压力,并且可以有选择地加载内容。 2、为什么要用AB包
5 o, M: e% A$ v6 b' k7 kⅠ、热更新 要热更新需要确保AB包打出来的资源具有唯一性,且相同资源的AB包检验码相同。 Ⅱ、Resources加载存在问题 Resources加载虽然简单方便,但是也有很多问题: $ L9 m9 o( T. d! `* t7 O
- 对内存管理造成一定的负担。
- 在打开应用时加载时间很长。
- Resources文件夹下的所有资源统一合并到一个序列化文件中(可以看成统一打一个大包,巨型AB包有什么问题它就有什么问题),对资源优化有一定的限制。
/ O% m) A5 p. y% b3 i, Q+ D 因此不建议大量使用Resources。
4 y9 z+ _" Q/ }" k4 Y$ N9 m& V' n二、安装插件的方式
2 f1 G' w' w" r7 S$ C! r% t7 ?$ I1、PackageManager安装- u4 A, u& [" P( K2 ?
橙子测试在Unity2019.3版本中,PackageManager中便有此插件, 同学们可以先看看自己版本的Unity是否可以直接安装。 8 x+ M' m$ m. O) s9 Q. r
' X1 w; P9 M0 s9 j) P1 h
% n; z& L5 x) D' c
2、GitHub下载* n+ S) R6 o# M4 W* o$ T) i6 ?
有的Unity版本是没有PackageManager的,或者PackageManager中没有此插件。 那么我们可以去GitHub下载此插件:传送门 三、插件使用方法介绍, F! v( g4 g) Y8 g7 B
下面介绍如何将Assets中的资源打成AB包。 1、实现导出一个AB包2 y% t6 U/ f, o/ t( w; e1 K
我们以该模型为例,将该模型打成AB包。
0 \: B+ A0 c! Y, E # e. c0 S% h% L! o( s P
5 \8 m# E* Y, A: V- |2 nⅠ、制成预制体,并设定AssetBundle 如下图所示。 AssetBundle名字只能是小写。 8 h! o! u, h# a+ a1 o& P, k W8 q( z
/ q8 ^# ~+ t4 R8 m
1 J0 B: q3 \" Y0 ^3 {. nⅡ、AssetBundle Browser界面介绍 Window - AssetBundle Browser,可打开配置界面。 Configure界面
' f: N8 Q3 Q7 K1 F9 B, v$ L我们能看到所有被标记为AssetBundle的文件。 , ?! ?3 ?8 L4 f, w' M
: w9 B% o y7 }
8 @+ n+ F& R, m) i& Z, FBuild界面) b$ k1 e( s" T; a3 ~7 b- M
该界面是进行打包的界面。
9 O, M1 N1 g) m/ T o6 _/ n. |# |2 X- Build Target:选择发布的平台
- Output Path:输出路径
- Clear Folders:构建之前清空文件夹(会把文件夹删除)
- Copy to StreamingAssets:拷贝至StreamingAssets文件夹
- Compression:选择压缩格式
& v# x O+ {6 I! Y5 Z4 A l" O
: A/ G2 m+ D4 X' P; ~) [) @& ~ ! B. V0 J$ x" h, b: u8 s
Inspect界面
/ `( V$ S% Q [7 o& {6 c这个界面会展示已经打成AB包的包内部信息。 选择左上角的 Add Folder,选择AssetBundle所在的目录。然后该界面左侧会列出该文件夹下的所有AB包。 在左侧展示的文件列表中任选一个AssetBundle,右边会展示AssetBundle内部的信息,包括它包含的资源,预加载的组件和依赖等等。 右上角的 -键可以从列表中删除当前选中的文件夹。
# C1 F* g% j7 [: \5 I% a3 @' E: s 1 ]) [4 C9 x% m z. ?1 v {
o4 X% L: C. M
Ⅲ、完成打包 点击Build即可对当前Browser中所有的bundle进行打包,选择路径,即可在该路径下看到生成的资源文件。 若你勾选了Copy to StreamingAssets,还会自动帮你拷贝到StreamingAssets文件夹 1 z3 L" g/ J: q5 _' y& n
# X5 i: H, J' ~ n1 \: c! d$ q6 f 2 P, [0 ?9 d7 R8 S0 I
2、实现资源复用 V% [" q5 Z. G' t# O& O
📢 什么是资源复用
. m5 |) K1 Q! J; D# K在打包的过程中,有很多资源都是重复的。例如:
4 c% Z7 R: W6 O+ H8 K/ ]- 多个预制体使用的同一个模型,预制体只是材质颜色不同。
- 有图片,被多个预制体使用。
" t0 `/ s D+ `$ I7 l$ v 如果分别打AB包,这样会造成包体过大。
+ W, D2 y: S# A {AssetBundleBrowser提供了解决方法,用创建共享AB包的形式,很好的解决掉了这一问题,实现了资源的复用。 Ⅰ、一个资源重复的现象" X% t1 q. `3 a5 c$ J5 g# L! y( m
我们实现一个资源重复的现象: : F/ Y. F$ T' n/ Z0 V/ A1 `
- 制作Trigger的复制预制体,新建材质球,替换它的原始材质球。
- 给该预制体的AssetBundle重命名为tiggernew, `. L% q6 B, \' j4 F
3 O# Y' ?8 w# c/ o
# @3 A2 O5 B9 G3 |3 X/ {Ⅱ、创建共享AB包3 {1 R9 }4 ~9 R2 c
我们此时再次打开AssetBundle Browser,可以看到很多感叹号。
: r' Y+ f" L0 E- 左侧预制体的感叹号,代表它们其中有重复的资源
- 右侧包体内的感叹号,代表是这些资源重复
: a% ?' f' S( ?
3 x5 T2 l3 u$ V$ Y/ t1 I
5 P X) m* e" a7 @# e0 O
创建res AB包: 在左侧右键,Add new bundle,创建一个res包(该名子可自行命名)。后面我们用它存储重复的资源。 : M4 R, a- I* K1 m% j! H
) o# C2 l$ @' W% G/ r; n$ {2 V
将重复资源拖到res包内: 将tiger中的重复资源拖到res包内,我们能看到拖拽完成后,其他ab包内重复的资源也消失了。现在只有一份资源。, ]/ U9 o4 p( s
* g @3 W: v7 U8 @3 R& c S
/ p" ?) l& s4 q# E5 r- w" J2 v' w
5 f5 M8 J& V4 Z6 y' Z- @Ⅲ、完成打包- a S Q1 V4 k- o4 a
同样的操作,点击Build,完成AB包的打包。 此时AB包内容如下: & d( \# v, H0 c& a1 O$ g
# ?; y9 r% |% H7 p3 k2 ?$ t
" n) H$ C8 T, d8 x" Y四、代码实例化AB包资源
& |' T6 }* a) n# s) h3 o9 V1 X5 W下面我们完整做完整个流程:使用代码,去加载AB包中的老虎,完成我们的整个测试。 将该脚本挂载在场景中的物体上,运行项目时,便会加载出老虎了!5 c( E0 B s- ~7 l
- using System.IO;
' t: G8 V9 z8 V0 `5 @$ e: A5 F - using UnityEngine;<p></p>
, `7 y3 O$ p/ X8 F8 N - <p style="line-height: 30px; text-indent: 2em;">public class ABTest : MonoBehaviour, r+ G" {1 ]8 A% {' Z& q2 n% @
- {
. T) g8 n+ W! F5 o/ I - void Start()
; F4 `4 r1 P% [4 F$ n+ v' G# g& G - {2 |, { k1 [+ c% b( p* ^
- //加载AssetBundle之前,先加载依赖的Bundle- S, { x e3 W8 r# ?" `( a
- //字符串"StandaloneWindows",是一个文件。这个文件的名字,是根据打包脚本,打包到哪个文件夹下,这个文件就叫什么名字。
6 G. R# U; x, t; Y" p - //字符串"AssetBundleManifest",是固定写法。
/ H+ p$ v j7 R) n- H - AssetBundle assetBundle =
" [, l, f' o3 }1 S - AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "StandaloneWindows"));, x" j6 [* }8 r
- AssetBundleManifest manifest = assetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");</p>
$ X s% q$ U. V1 b* J- q+ r: z+ a - <p style="line-height: 30px; text-indent: 2em;"> //字符串"tiger",是你要加载的老虎模型预制体的名字2 w! U: X Z7 C% t4 r
- foreach (var item in manifest.GetAllDependencies("tiger"))
8 L+ ] w- w) O+ ~ - {
+ N. r. L& ~2 P" \3 t - AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, item));9 R6 o0 m/ ^+ s7 z! u
- }</p>
% \5 T! P6 {, T0 H- Q- g+ F - <p style="line-height: 30px; text-indent: 2em;"> //------若要加载的文件只是一个视频或者其他,无依赖,可只做下面,直接加载Bundle文件,直接读Bundle即可------//</p>9 w" F) f5 W8 a, m
- <p style="line-height: 30px; text-indent: 2em;"> //现在便可以加载模型了
! K' @ r& p0 F- F" B ?% T5 E9 Q - string modelPath = Path.Combine(Application.streamingAssetsPath, "tiger");! J/ W# e- b8 D+ r! r! |
- AssetBundle useAb = AssetBundle.LoadFromFile(modelPath);/ j. c! ^' @0 w* Z
- GameObject obj = useAb.LoadAsset<GameObject>("Tiger");</p>
" ]# c0 ]! d: v' k- _! p* a - <p style="line-height: 30px; text-indent: 2em;"> Instantiate(obj, transform);
: }! R1 Z9 R2 y" C2 S, |9 u3 D - }
7 ^; c6 D G8 v* Z - }</p>
复制代码 好啦,这就是本章所有内容 ~
, ]( @8 ^. ?" u
2 N" D# a# m! }* H1 e7 J6 d. d |