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

AssetBundle Browser 教程

[复制链接]

986

主题

92

回帖

5万

积分

管理员

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

一、插件功能( B+ K; o, Z- \  Q
1、插件是发布AB包的工具
9 ~& A) Z! o# x' v6 Z1 kAssetBundle Browse可以将项目中的资源打包成AB包,发布游戏后,项目将通过加载StreamingAssets中AB包的形式,加载所需资源,而不是像之前那样,从Assets中进行加载。

1、AB包是什么' _0 U( ?* V* b+ G- N7 S
AB包全名AssetBundle(资源包)。是一种Unity提供的用于存放资源的包。通过将资源分布在不同的AB包中可以最大程度地减少运行时的内存压力,并且可以有选择地加载内容。

2、为什么要用AB包5 K  k2 k: ?. C; J6 d; s0 |
Ⅰ、热更新

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

Ⅱ、Resources加载存在问题

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

9 Y& t* d/ y7 c& p' a5 H
  • 对内存管理造成一定的负担。
  • 在打开应用时加载时间很长。
  • Resources文件夹下的所有资源统一合并到一个序列化文件中(可以看成统一打一个大包,巨型AB包有什么问题它就有什么问题),对资源优化有一定的限制。+ ^2 O0 d5 |5 A  \  A
因此不建议大量使用Resources。
0 B& x# a0 v( f! R- p5 ]9 ]/ J

二、安装插件的方式
9 M& |; T$ O5 w% l( a8 \6 F1、PackageManager安装  ]- C+ a1 f5 Z5 N4 v
橙子测试在Unity2019.3版本中,PackageManager中便有此插件, 同学们可以先看看自己版本的Unity是否可以直接安装。


: g2 D  @4 s6 ~9 E0 P
$ v% B: t- F  f. l
. @. u7 C/ _2 ~. E

2、GitHub下载
/ p9 j0 X# i3 N, V2 a/ x/ F有的Unity版本是没有PackageManager的,或者PackageManager中没有此插件。 那么我们可以去GitHub下载此插件:传送门

三、插件使用方法介绍
6 w2 v8 O/ ^1 S9 [下面介绍如何将Assets中的资源打成AB包。

1、实现导出一个AB包
  k5 N8 w; Y8 \7 d# h' Q4 S7 y我们以该模型为例,将该模型打成AB包。


) U% X( y$ F: o+ C. V* @0 F6 s
8 \) S% h* k1 E! p

$ [3 o  Q" a8 \

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

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

* M& D6 ?( ~/ z3 _7 o

; _) k% P) Z% F  Z4 W

7 N% O" r. |. y* d, u: i" M5 q

Ⅱ、AssetBundle Browser界面介绍

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

Configure界面
! s# g, K! C( x* D我们能看到所有被标记为AssetBundle的文件。


" w1 Y, [( d; ^$ U# T- }

3 y' v% |6 @2 s) V- M

1 k/ q3 [2 v9 |9 z* ~/ P

Build界面: w; r' I! q$ ]
该界面是进行打包的界面。


/ [8 i" a' y/ A, x9 V
  • Build Target:选择发布的平台
  • Output Path:输出路径
  • Clear Folders:构建之前清空文件夹(会把文件夹删除)
  • Copy to StreamingAssets:拷贝至StreamingAssets文件夹
  • Compression:选择压缩格式
    ! R) V9 f0 |2 a2 P
- G+ m$ T, x+ s) a$ Z9 T, B1 {/ n5 h
' i: w; A- J" k+ }

Inspect界面& r* r! w/ {: E3 ]# S- [
这个界面会展示已经打成AB包的包内部信息。

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

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

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

% n2 J, [% z7 Q$ d) i8 N
: G0 H% M* [2 U6 g
' T" }7 Z5 {# ^$ j+ [( J

Ⅲ、完成打包

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

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


/ @) n* U) b: V% n

& v  I- D  d8 w- Q1 V4 d+ a6 {
. `; ?- M  X) _/ E: z' u% q/ L9 `# Y

2、实现资源复用
2 Y& w3 E3 ?* z) p+ \2 q2 e📢 什么是资源复用& V9 [/ F* c6 j; E- K
在打包的过程中,有很多资源都是重复的。例如:

3 X2 a# y$ M+ Y
  • 多个预制体使用的同一个模型,预制体只是材质颜色不同。
  • 有图片,被多个预制体使用。" \7 E5 F6 u9 c# g: j  _' O/ f
如果分别打AB包,这样会造成包体过大。! t6 R( Z5 I5 M: d

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

Ⅰ、一个资源重复的现象
* t+ A0 r$ |& r8 q我们实现一个资源重复的现象:


9 p  Y7 W' W" T4 E) \) ^
  • 制作Trigger的复制预制体,新建材质球,替换它的原始材质球。
  • 给该预制体的AssetBundle重命名为tiggernew* B" }& \! E! n% c8 i( h; G& @
6 O0 M1 }* D- v* v; s( [/ D

: s, w# e( ~. J5 z: [) C

Ⅱ、创建共享AB包  c+ ^. e" |* L6 d* b
我们此时再次打开AssetBundle Browser,可以看到很多感叹号。

( }1 D5 x1 Q; v# v; {
  • 左侧预制体的感叹号,代表它们其中有重复的资源
  • 右侧包体内的感叹号,代表是这些资源重复- l  ]* `! |% ?6 Q3 N+ Z
8 ^! q5 ?- J+ Y- |

+ M- |/ m& J2 r  k2 {3 k1 w6 @

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

% g: |& c. I8 w  `7 b0 w. _
6 h; l1 O1 a) b6 B% h
将重复资源拖到res包内: 将tiger中的重复资源拖到res包内,我们能看到拖拽完成后,其他ab包内重复的资源也消失了。现在只有一份资源。
! ]# \. R( I$ i/ {. Q3 |' [
7 r# p: T7 ]7 T6 ?# a* x7 {4 V- N
/ f+ R, k8 h7 l% {+ J' F" {% {
( b% z! m5 y  L1 M( V

Ⅲ、完成打包9 ]$ \. b5 H: v
同样的操作,点击Build,完成AB包的打包。 此时AB包内容如下:

, s7 H: J% ?6 y* d3 f

2 d- \' b+ z( F3 ?7 x
8 {5 c/ g! v. E3 [  r. b

四、代码实例化AB包资源  p" d- v% ]' T7 A! ?2 N  w, y
下面我们完整做完整个流程:使用代码,去加载AB包中的老虎,完成我们的整个测试。

将该脚本挂载在场景中的物体上,运行项目时,便会加载出老虎了!
$ |9 g$ Q7 i4 P7 t9 X1 M

  1. using System.IO;
    0 Z1 O. ~) }8 ]+ k
  2. using UnityEngine;<p></p>
    ! w  u# ^8 p5 k& M  B
  3. <p style="line-height: 30px; text-indent: 2em;">public class ABTest : MonoBehaviour( N9 _9 d5 z- H3 \' q9 M
  4. {
    * g; ~+ Q& g6 R  p; [+ i
  5.     void Start()1 L) V1 l+ @. ~4 q2 t
  6.     {) E* [$ A) C9 B$ t  ~( R
  7.         //加载AssetBundle之前,先加载依赖的Bundle" X( V6 g$ D2 R  L; Y4 f8 b8 T! D
  8.         //字符串"StandaloneWindows",是一个文件。这个文件的名字,是根据打包脚本,打包到哪个文件夹下,这个文件就叫什么名字。, R+ `# w/ V+ Z/ U% W$ a. y
  9.         //字符串"AssetBundleManifest",是固定写法。: C" C9 {2 ^- r
  10.         AssetBundle assetBundle =
    7 q3 N. E5 m' ]7 A' U$ t9 A1 z% @
  11.             AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "StandaloneWindows"));
    4 ~+ G5 Y3 F$ [* i2 K
  12.         AssetBundleManifest manifest = assetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");</p>
    " @; n# z- j* }! s+ g( }
  13. <p style="line-height: 30px; text-indent: 2em;">        //字符串"tiger",是你要加载的老虎模型预制体的名字
    ( F- V1 ?. {  F4 ]6 V/ a
  14.         foreach (var item in manifest.GetAllDependencies("tiger"))" I: f, R0 P7 ~) Q. ]
  15.         {0 y. P* a7 ]) [* S
  16.             AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, item));# s! `( ]7 i3 {
  17.         }</p>
    2 `8 f! T- S9 D% |
  18. <p style="line-height: 30px; text-indent: 2em;">        //------若要加载的文件只是一个视频或者其他,无依赖,可只做下面,直接加载Bundle文件,直接读Bundle即可------//</p>
      T  u3 l% n, \; ?$ N" `
  19. <p style="line-height: 30px; text-indent: 2em;">        //现在便可以加载模型了- D1 H! R7 S( T: `8 p1 W' U' R6 M
  20.         string modelPath = Path.Combine(Application.streamingAssetsPath, "tiger");
    # y- K" V+ ?) x7 U
  21.         AssetBundle useAb = AssetBundle.LoadFromFile(modelPath);% H& I9 v! U  M! _3 l
  22.         GameObject obj = useAb.LoadAsset<GameObject>("Tiger");</p>" M6 T9 U9 O- Z( b
  23. <p style="line-height: 30px; text-indent: 2em;">        Instantiate(obj, transform);% K( c6 I/ L3 o. ^4 @- ?7 l
  24.     }
    2 n7 l% p+ ~, Z! ^
  25. }</p>
复制代码
好啦,这就是本章所有内容 ~
! m) P, t, ?9 o8 u$ c" y
3 H+ J% r. r$ Z$ {5 i( e  d
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|

GMT+8, 2026-3-22 01:19 AM , Processed in 0.079608 second(s), 23 queries .

Powered by xyh-moon X3.5

© 2001-2025 Discuz! Team.

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