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

AssetBundle Browser 教程

[复制链接]

985

主题

92

回帖

5万

积分

管理员

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

一、插件功能6 |: r8 G' V% J
1、插件是发布AB包的工具7 t8 Q; l  \/ b) f+ g2 k: \
AssetBundle Browse可以将项目中的资源打包成AB包,发布游戏后,项目将通过加载StreamingAssets中AB包的形式,加载所需资源,而不是像之前那样,从Assets中进行加载。

1、AB包是什么+ @& }$ W% I, e  f. L
AB包全名AssetBundle(资源包)。是一种Unity提供的用于存放资源的包。通过将资源分布在不同的AB包中可以最大程度地减少运行时的内存压力,并且可以有选择地加载内容。

2、为什么要用AB包
8 A' U  ~  r( {4 u, d" vⅠ、热更新

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

Ⅱ、Resources加载存在问题

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


  \2 u& J0 S! W( N7 N3 f
  • 对内存管理造成一定的负担。
  • 在打开应用时加载时间很长。
  • Resources文件夹下的所有资源统一合并到一个序列化文件中(可以看成统一打一个大包,巨型AB包有什么问题它就有什么问题),对资源优化有一定的限制。. Q; [, G" s* R) b! N  l. K
因此不建议大量使用Resources。. f! M0 W$ V2 A; k- V

二、安装插件的方式
! H0 w$ M) l" n  ~* ]: p% O1、PackageManager安装+ z2 G/ r; \3 f
橙子测试在Unity2019.3版本中,PackageManager中便有此插件, 同学们可以先看看自己版本的Unity是否可以直接安装。

" v0 h4 z# h% e2 ]' {& x' u
( ~; D/ j8 E: y* C: s$ ?  ]
1 C# y% a4 Q5 E0 m7 B/ P0 \

2、GitHub下载6 G* Z$ i" O/ F
有的Unity版本是没有PackageManager的,或者PackageManager中没有此插件。 那么我们可以去GitHub下载此插件:传送门

三、插件使用方法介绍
' J  e& d2 p. H! c6 k下面介绍如何将Assets中的资源打成AB包。

1、实现导出一个AB包/ r9 \. }) s' w0 S
我们以该模型为例,将该模型打成AB包。

# A( v4 L/ E* t  C7 e+ d
  U( U- {/ x8 y+ _/ `) t+ H- K

1 t: ~! z+ h" X" Q+ D* K& {

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

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


' d3 ]) a* U& p0 T" y# a
4 i5 W0 ^2 H3 R: g/ X
+ T' w: C( r) ~( [# F* `

Ⅱ、AssetBundle Browser界面介绍

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

Configure界面* U7 r: h/ M5 f3 @' i* y5 b
我们能看到所有被标记为AssetBundle的文件。

8 g1 V! M5 C: @  z8 m
) D3 a% t  F0 _, r# G8 Q5 q; `

4 _1 `5 ?/ q& k, `$ A1 R

Build界面
1 }+ I. T3 z8 O& \该界面是进行打包的界面。


# A. v& j. S( R" I
  • Build Target:选择发布的平台
  • Output Path:输出路径
  • Clear Folders:构建之前清空文件夹(会把文件夹删除)
  • Copy to StreamingAssets:拷贝至StreamingAssets文件夹
  • Compression:选择压缩格式3 z5 q$ b0 i' v8 e! I
; ~6 J6 \; _8 S  w7 f! C3 @

9 a  U- @  q; J$ f2 ]

Inspect界面7 p! l  e' b( s- a0 D: W
这个界面会展示已经打成AB包的包内部信息。

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

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

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


& P) u! w4 {& E, ^

1 q/ X0 s$ ~; V+ s

1 j; k0 d" f, f7 v1 U8 |

Ⅲ、完成打包

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

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

1 }4 }" @' I+ Q- q- \2 j

9 X  E" [7 i: D, w
: }& k: ?# U; R* ?& ^# Y9 @

2、实现资源复用
5 U: @$ w/ j) E/ ^📢 什么是资源复用- l9 Z) i+ v( M' B- f3 j; F
在打包的过程中,有很多资源都是重复的。例如:

* J( e1 x7 ~6 ~: R
  • 多个预制体使用的同一个模型,预制体只是材质颜色不同。
  • 有图片,被多个预制体使用。
    0 V- K/ k: |, e! a
如果分别打AB包,这样会造成包体过大。' Q( q" h; _5 R1 T. P

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

Ⅰ、一个资源重复的现象
- }$ h& T/ ^( {6 o' G我们实现一个资源重复的现象:


/ ~* {$ V, D4 J( I% j8 G/ H# _; _
  • 制作Trigger的复制预制体,新建材质球,替换它的原始材质球。
  • 给该预制体的AssetBundle重命名为tiggernew3 w  ^9 _2 a% y
/ B# F* {& a( I/ c

" M" u' O7 G5 p6 e; f1 T, E6 c- R

Ⅱ、创建共享AB包
; s* L% x: N- t' `/ ]. \/ w1 n/ `/ o我们此时再次打开AssetBundle Browser,可以看到很多感叹号。

  ?. j. n$ d3 x9 h
  • 左侧预制体的感叹号,代表它们其中有重复的资源
  • 右侧包体内的感叹号,代表是这些资源重复1 J( N2 K% ?+ J- M
# o% `8 c. x3 i' b/ P4 ^
  n& C6 ], T/ `9 V/ Z

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


! Z4 B' ?% J6 @& G; F6 `. Q

* o$ I+ _5 e, Y3 x5 F+ J7 u
将重复资源拖到res包内: 将tiger中的重复资源拖到res包内,我们能看到拖拽完成后,其他ab包内重复的资源也消失了。现在只有一份资源。
) n/ R$ W9 X! Z- E
. l1 @  Z6 }+ [& S; ?

) J. |' |6 x- h. W2 t

* `& N9 J; Z0 e4 r

Ⅲ、完成打包
, L8 w8 \$ d& u, j0 F( q" M同样的操作,点击Build,完成AB包的打包。 此时AB包内容如下:

" a, s- c2 [3 I5 @9 y- u
6 B; E9 F2 ^% G6 h- ^5 k4 o

2 ?2 t* [9 p1 r" p0 o

四、代码实例化AB包资源
# d$ a8 K# d& A" D/ s: k下面我们完整做完整个流程:使用代码,去加载AB包中的老虎,完成我们的整个测试。

将该脚本挂载在场景中的物体上,运行项目时,便会加载出老虎了!
% }- R0 ?" r' h

  1. using System.IO;
    . \7 \- a" q% [* s2 ?4 C6 X+ ^: m
  2. using UnityEngine;<p></p>( F9 {$ i9 b; h- \( P# j
  3. <p style="line-height: 30px; text-indent: 2em;">public class ABTest : MonoBehaviour
    ) q. l7 l3 {$ Z( f2 M
  4. {8 ~9 W1 \1 j( @
  5.     void Start()* j! x  Q8 L7 e5 k; y& u! a# y
  6.     {
    - h& m' u5 a7 [1 [
  7.         //加载AssetBundle之前,先加载依赖的Bundle  ^4 n1 E$ e3 h9 C5 q
  8.         //字符串"StandaloneWindows",是一个文件。这个文件的名字,是根据打包脚本,打包到哪个文件夹下,这个文件就叫什么名字。
    1 w: p, c$ {& z9 y
  9.         //字符串"AssetBundleManifest",是固定写法。
    / w" l2 O) }  c* [# E
  10.         AssetBundle assetBundle =6 k+ @/ L; \! o9 F' U7 Y
  11.             AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "StandaloneWindows"));9 U4 J& C& e) Q" |6 o7 n/ Q/ o
  12.         AssetBundleManifest manifest = assetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");</p>9 k9 N( Z  Q. ]- {1 W/ K6 I: k6 f
  13. <p style="line-height: 30px; text-indent: 2em;">        //字符串"tiger",是你要加载的老虎模型预制体的名字- `7 j% F" Z9 M
  14.         foreach (var item in manifest.GetAllDependencies("tiger"))
    8 Y3 c& m* r) o
  15.         {
    # o7 K% b: D9 p( o4 F5 x" ?
  16.             AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, item));: m1 v. x, e* a  w. z5 L+ Y% O( e
  17.         }</p># p* q  _& l- d, i
  18. <p style="line-height: 30px; text-indent: 2em;">        //------若要加载的文件只是一个视频或者其他,无依赖,可只做下面,直接加载Bundle文件,直接读Bundle即可------//</p>
    3 X3 \. Y" o. a$ r1 r$ C
  19. <p style="line-height: 30px; text-indent: 2em;">        //现在便可以加载模型了: I8 N# L) U5 U. ]" W7 S- S
  20.         string modelPath = Path.Combine(Application.streamingAssetsPath, "tiger");; ]/ v; p/ E7 q& j
  21.         AssetBundle useAb = AssetBundle.LoadFromFile(modelPath);
    " H! I$ q' v- A6 r' D
  22.         GameObject obj = useAb.LoadAsset<GameObject>("Tiger");</p>7 N$ e& v; p) i; I
  23. <p style="line-height: 30px; text-indent: 2em;">        Instantiate(obj, transform);$ F3 a+ a. F- c. Z. z
  24.     }' g  m" e0 a% n( l( h+ D
  25. }</p>
复制代码
好啦,这就是本章所有内容 ~
8 I. V$ E" B8 p( }7 _  X
2 ~( E4 j  D9 z
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|

GMT+8, 2025-11-5 02:02 AM , Processed in 0.087378 second(s), 23 queries .

Powered by xyh-moon X3.5

© 2001-2025 Discuz! Team.

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