找回密码
 立即注册
搜索
查看: 453|回复: 0

AssetBundle Browser 教程

[复制链接]

991

主题

92

回帖

5万

积分

管理员

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

一、插件功能" 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' ^* n

Build界面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- c

Inspect界面& 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, g

2、实现资源复用
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; J

AssetBundleBrowser提供了解决方法,用创建共享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

  1. using System.IO;& ]- X# |3 h6 V0 w! R6 y, X" Q
  2. using UnityEngine;<p></p>
    8 j% |9 u( S* h6 g- {) H
  3. <p style="line-height: 30px; text-indent: 2em;">public class ABTest : MonoBehaviour: r+ S# Z+ X# u- l0 I. J0 ~
  4. {
    / \. g6 L$ E0 I1 e0 ?
  5.     void Start()
    1 Q0 N. t9 i8 y/ l- c1 z/ S
  6.     {
    % v% S/ @2 H3 u3 o
  7.         //加载AssetBundle之前,先加载依赖的Bundle
    ' q6 m: F$ H3 v4 t  t0 l
  8.         //字符串"StandaloneWindows",是一个文件。这个文件的名字,是根据打包脚本,打包到哪个文件夹下,这个文件就叫什么名字。
    - D5 l' g9 V3 k& w$ U
  9.         //字符串"AssetBundleManifest",是固定写法。
      g2 [; r' S, ]! q
  10.         AssetBundle assetBundle =1 |5 k# e% a% D  K' ]6 J
  11.             AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "StandaloneWindows"));
    - Z3 r1 ~! u) r& t, w4 y& h1 C
  12.         AssetBundleManifest manifest = assetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");</p>
    2 ]6 d/ \5 t+ v3 G9 d5 {( a9 A2 }3 l
  13. <p style="line-height: 30px; text-indent: 2em;">        //字符串"tiger",是你要加载的老虎模型预制体的名字$ J, J  [" ^  U! Z8 C5 a, x
  14.         foreach (var item in manifest.GetAllDependencies("tiger"))
    . d- h2 q/ T6 X* v, U% w* W
  15.         {
    $ s: |) Q8 J, p
  16.             AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, item));* H4 ]1 `. V8 O+ O3 N6 f
  17.         }</p>: M' v, L; I* x0 R
  18. <p style="line-height: 30px; text-indent: 2em;">        //------若要加载的文件只是一个视频或者其他,无依赖,可只做下面,直接加载Bundle文件,直接读Bundle即可------//</p>0 d  o# b8 R8 ?/ S+ L
  19. <p style="line-height: 30px; text-indent: 2em;">        //现在便可以加载模型了0 v$ E; ]: q1 r9 Y
  20.         string modelPath = Path.Combine(Application.streamingAssetsPath, "tiger");
    ) C5 [$ S/ t* X
  21.         AssetBundle useAb = AssetBundle.LoadFromFile(modelPath);
    $ f5 `9 _9 X& N( \1 j  r
  22.         GameObject obj = useAb.LoadAsset<GameObject>("Tiger");</p>
    9 x& l" @: R$ G" P1 D
  23. <p style="line-height: 30px; text-indent: 2em;">        Instantiate(obj, transform);. w" `- B; |/ W5 [' `! [- ]
  24.     }
    4 M9 J: E9 O6 h" ~- u: y
  25. }</p>
复制代码
好啦,这就是本章所有内容 ~0 b& b6 d: t6 B" F: x. l
: B: h9 D, v2 p2 [" A
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|

GMT+8, 2026-8-5 10:22 AM , Processed in 0.087256 second(s), 23 queries .

Powered by xyh-moon X3.5

© 2001-2026 Discuz! Team.

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