找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 252|回复: 0

AssetBundle Browser 教程

[复制链接]

983

主题

83

回帖

5万

积分

管理员

积分
53122
发表于 2023-3-7 15:50:11 | 显示全部楼层 |阅读模式

一、插件功能( T9 u4 N% _* d+ z. Q
1、插件是发布AB包的工具5 S, \6 b* @8 O( N+ K; a: R
AssetBundle Browse可以将项目中的资源打包成AB包,发布游戏后,项目将通过加载StreamingAssets中AB包的形式,加载所需资源,而不是像之前那样,从Assets中进行加载。

1、AB包是什么. \8 J* M. x" Z. g+ t9 z' Z9 P* d
AB包全名AssetBundle(资源包)。是一种Unity提供的用于存放资源的包。通过将资源分布在不同的AB包中可以最大程度地减少运行时的内存压力,并且可以有选择地加载内容。

2、为什么要用AB包+ R9 b" _- [/ [. u/ [; A
Ⅰ、热更新

要热更新需要确保AB包打出来的资源具有唯一性,且相同资源的AB包检验码相同。

Ⅱ、Resources加载存在问题

Resources加载虽然简单方便,但是也有很多问题:

% K/ o) }* _$ V& v% b7 V& W  w# ]
  • 对内存管理造成一定的负担。
  • 在打开应用时加载时间很长。
  • Resources文件夹下的所有资源统一合并到一个序列化文件中(可以看成统一打一个大包,巨型AB包有什么问题它就有什么问题),对资源优化有一定的限制。6 o; Q, G/ T, S1 l4 }
因此不建议大量使用Resources。
1 E+ A& u  j* r

二、安装插件的方式
+ [4 O$ e, q( C1、PackageManager安装
% r7 Q! f( A4 d) u. b$ A6 X橙子测试在Unity2019.3版本中,PackageManager中便有此插件, 同学们可以先看看自己版本的Unity是否可以直接安装。

3 o) M; `+ K1 E+ x. \  n
1 B7 g% E5 q. Z$ }6 X. Y! t/ v

& K  k! o+ a0 L% _0 p/ F3 K+ G6 D

2、GitHub下载
6 c1 a4 W8 @* p3 D5 k3 _( M6 h有的Unity版本是没有PackageManager的,或者PackageManager中没有此插件。 那么我们可以去GitHub下载此插件:传送门

三、插件使用方法介绍6 T0 }( J0 ~5 D+ o; i
下面介绍如何将Assets中的资源打成AB包。

1、实现导出一个AB包% Z7 Y& G) B" c( Y2 u9 V$ _: Q( n
我们以该模型为例,将该模型打成AB包。


- k2 }+ }! }6 w: W8 I- P
! t- i: j- ^% I) }4 o3 O: n7 r! Z( M
. Q. j6 b+ U1 H

Ⅰ、制成预制体,并设定AssetBundle

如下图所示。 AssetBundle名字只能是小写。

* C! I' p+ p6 [& d' Z
; h" ]: \4 \. W5 P7 v. b

2 [4 |2 U4 ^: F7 H) j

Ⅱ、AssetBundle Browser界面介绍

Window - AssetBundle Browser,可打开配置界面。

Configure界面' K5 I4 W% z+ [# r9 z; x
我们能看到所有被标记为AssetBundle的文件。

" }% h0 o3 v# A/ d; ?6 ]. Q

1 {* |3 H9 a! a+ Z: w* }, N
" z9 E$ P- j- L! T9 A

Build界面' q, l$ A4 F3 v7 d2 i
该界面是进行打包的界面。


# }' z9 H/ \: P' c: _5 k; T) W& E
  • Build Target:选择发布的平台
  • Output Path:输出路径
  • Clear Folders:构建之前清空文件夹(会把文件夹删除)
  • Copy to StreamingAssets:拷贝至StreamingAssets文件夹
  • Compression:选择压缩格式
    : z6 j) r) _* h

' ?3 z% O5 D; P8 F! I" t) e

3 |" q: K: v, V$ s7 D% r4 a. {

Inspect界面. _, X; x# A% o1 ?
这个界面会展示已经打成AB包的包内部信息。

选择左上角的 Add Folder,选择AssetBundle所在的目录。然后该界面左侧会列出该文件夹下的所有AB包。

在左侧展示的文件列表中任选一个AssetBundle,右边会展示AssetBundle内部的信息,包括它包含的资源,预加载的组件和依赖等等。

右上角的 -键可以从列表中删除当前选中的文件夹。


  P3 A6 o/ }  ]! @6 m/ w
+ C4 f( k1 ~  Q' q5 y' E
: R2 D7 r( k: V) O" i3 B2 r" ^0 k

Ⅲ、完成打包

点击Build即可对当前Browser中所有的bundle进行打包,选择路径,即可在该路径下看到生成的资源文件。

若你勾选了Copy to StreamingAssets,还会自动帮你拷贝到StreamingAssets文件夹

7 A0 p& Z- Y+ o- @7 N

5 t3 a+ N; m$ Z- J

7 e* Y) j! i8 `  _

2、实现资源复用
7 C* g1 w8 l) M) I1 D📢 什么是资源复用' C! T% ~, I+ c% C4 M
在打包的过程中,有很多资源都是重复的。例如:

# q4 y5 t1 F, b& @4 j
  • 多个预制体使用的同一个模型,预制体只是材质颜色不同。
  • 有图片,被多个预制体使用。! a7 x; D4 v: {) t1 I
如果分别打AB包,这样会造成包体过大。9 ]" {6 R% [. b" `2 l

AssetBundleBrowser提供了解决方法,用创建共享AB包的形式,很好的解决掉了这一问题,实现了资源的复用。

Ⅰ、一个资源重复的现象
2 ~1 b  i  z) T7 E我们实现一个资源重复的现象:

6 x. m& v( l0 u2 e  O8 M
  • 制作Trigger的复制预制体,新建材质球,替换它的原始材质球。
  • 给该预制体的AssetBundle重命名为tiggernew; R1 l7 E9 H; [6 d0 i, A
$ d2 g/ @0 k% W
. k' h; s' H- B7 o

Ⅱ、创建共享AB包& ~" p( L; F1 R( |6 l& M
我们此时再次打开AssetBundle Browser,可以看到很多感叹号。

8 m7 M/ T) H% [
  • 左侧预制体的感叹号,代表它们其中有重复的资源
  • 右侧包体内的感叹号,代表是这些资源重复+ R: t$ ]( `  b0 p* `. S
0 u1 z+ V9 r2 V* T; F( c
. E/ |' }" A1 H

创建res AB包: 在左侧右键,Add new bundle,创建一个res包(该名子可自行命名)。后面我们用它存储重复的资源。

1 n( c* j: q8 I  `7 m# o

" e6 L% v, P! ]' D* g( t
将重复资源拖到res包内: 将tiger中的重复资源拖到res包内,我们能看到拖拽完成后,其他ab包内重复的资源也消失了。现在只有一份资源。' |6 X4 O* w: W! T
8 A( M+ `8 H# k% D# [! j6 j8 w" F

+ h& I* Q0 ?6 M/ U
2 X) Y) O& y. ^9 f" n

Ⅲ、完成打包
1 E- Q. E8 o+ ]1 G! A) q- t! I同样的操作,点击Build,完成AB包的打包。 此时AB包内容如下:


( p4 ?1 c5 |7 E% G/ {' E

- j! ]4 A' s  Q. v* K5 H

9 L! M5 n: @1 I  v' E

四、代码实例化AB包资源9 l6 c7 G5 |4 R- ^$ y; i. e. p4 v/ h
下面我们完整做完整个流程:使用代码,去加载AB包中的老虎,完成我们的整个测试。

将该脚本挂载在场景中的物体上,运行项目时,便会加载出老虎了!
3 c0 A8 T2 `, J) Z% p; d

  1. using System.IO;7 V7 Q% Z2 e# t% T7 R/ x
  2. using UnityEngine;<p></p>
    . J* L& ?0 A1 I9 E9 r8 v
  3. <p style="line-height: 30px; text-indent: 2em;">public class ABTest : MonoBehaviour
    ( @, h/ v+ V% r9 N) V3 X. E$ i9 J
  4. {
    3 ~. `6 W' e: b  z- c: Q9 @) e, r
  5.     void Start()
    $ J7 f' {& \, O; t" ]% Y
  6.     {
    - M2 h* g5 x5 \: K
  7.         //加载AssetBundle之前,先加载依赖的Bundle
    ( ^+ O  T% I7 o& [% ~+ L
  8.         //字符串"StandaloneWindows",是一个文件。这个文件的名字,是根据打包脚本,打包到哪个文件夹下,这个文件就叫什么名字。3 D) P, t6 Y! t( G, e
  9.         //字符串"AssetBundleManifest",是固定写法。
    + i: o& U& k+ W5 T: U- ~  ?& D
  10.         AssetBundle assetBundle =9 ~9 t! g  R: b" W+ a
  11.             AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "StandaloneWindows"));9 Q5 }- N4 y8 s3 E, H
  12.         AssetBundleManifest manifest = assetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");</p>
    $ {8 c7 F# p2 f8 d
  13. <p style="line-height: 30px; text-indent: 2em;">        //字符串"tiger",是你要加载的老虎模型预制体的名字
    ; k& p) P4 B8 @- K4 p
  14.         foreach (var item in manifest.GetAllDependencies("tiger"))
    5 F* x; l) b9 ]* d7 l; N6 q
  15.         {5 o# c5 p! U" x2 \, B4 I0 o
  16.             AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, item));
    8 [8 s1 D" d4 l
  17.         }</p>
    " ^! ~/ p* s% h7 D5 a
  18. <p style="line-height: 30px; text-indent: 2em;">        //------若要加载的文件只是一个视频或者其他,无依赖,可只做下面,直接加载Bundle文件,直接读Bundle即可------//</p>
    + `9 @' @5 B# z" j. ]& n& E
  19. <p style="line-height: 30px; text-indent: 2em;">        //现在便可以加载模型了
    & C# B# x9 P. C3 {. _2 A+ W
  20.         string modelPath = Path.Combine(Application.streamingAssetsPath, "tiger");
    . D& D) a% @+ @6 w! w) C" }
  21.         AssetBundle useAb = AssetBundle.LoadFromFile(modelPath);
    + t6 ?/ x9 G0 b1 ~0 ], ]+ T
  22.         GameObject obj = useAb.LoadAsset<GameObject>("Tiger");</p>
    9 g* B7 Y2 N) H+ O0 v. e
  23. <p style="line-height: 30px; text-indent: 2em;">        Instantiate(obj, transform);
    6 \/ T$ K  ]& |1 {$ H
  24.     }
    7 _0 O; |5 K1 k& P) k
  25. }</p>
复制代码
好啦,这就是本章所有内容 ~& j6 x3 T, v! F5 |. ?8 n% g/ K

$ Z& i; r* r& ]) y( T0 ^
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|返回首页

GMT+8, 2024-12-23 21:21 , Processed in 0.125639 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表