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

AssetBundle Browser 教程

[复制链接]

989

主题

92

回帖

5万

积分

管理员

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

一、插件功能. ]) o7 B* C" o& F
1、插件是发布AB包的工具% n5 V3 _* Q5 P5 m; O
AssetBundle Browse可以将项目中的资源打包成AB包,发布游戏后,项目将通过加载StreamingAssets中AB包的形式,加载所需资源,而不是像之前那样,从Assets中进行加载。

1、AB包是什么
( @8 W4 s- J2 E- `AB包全名AssetBundle(资源包)。是一种Unity提供的用于存放资源的包。通过将资源分布在不同的AB包中可以最大程度地减少运行时的内存压力,并且可以有选择地加载内容。

2、为什么要用AB包+ k; m; ?/ W' _
Ⅰ、热更新

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

Ⅱ、Resources加载存在问题

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

  z2 L5 j4 @8 r2 ]; n( x& B
  • 对内存管理造成一定的负担。
  • 在打开应用时加载时间很长。
  • Resources文件夹下的所有资源统一合并到一个序列化文件中(可以看成统一打一个大包,巨型AB包有什么问题它就有什么问题),对资源优化有一定的限制。6 N+ G- v. }9 A- \1 I
因此不建议大量使用Resources。
/ \1 d+ t! L3 u/ U

二、安装插件的方式$ }6 I( Q$ a% d5 R; Q! h# R
1、PackageManager安装) W0 w3 o; _8 U! Z
橙子测试在Unity2019.3版本中,PackageManager中便有此插件, 同学们可以先看看自己版本的Unity是否可以直接安装。

- N  ~; n0 X' ]+ v, O4 r7 b
) D: ^1 r) J5 G1 c9 A# Q
% V6 Q) n9 m4 K+ n/ y$ `

2、GitHub下载: v) V) \8 b% N# s! I
有的Unity版本是没有PackageManager的,或者PackageManager中没有此插件。 那么我们可以去GitHub下载此插件:传送门

三、插件使用方法介绍
5 @! w$ j& W6 N$ f: {下面介绍如何将Assets中的资源打成AB包。

1、实现导出一个AB包
! a  Y+ q( r3 a. j* ~+ b我们以该模型为例,将该模型打成AB包。


& W$ e' f6 h% \; B1 ~8 {
: s% C, v( L. |6 D: E) E
  S) N2 Z$ k3 h

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

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

/ N& r, Z: T* L' L& P! T
9 e0 K/ @0 r4 x" W  K3 V9 f

8 X9 T8 \# [+ i% W1 o% }

Ⅱ、AssetBundle Browser界面介绍

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

Configure界面% K7 t1 g  I. a
我们能看到所有被标记为AssetBundle的文件。

; t0 O4 T- H/ c) Z
- [  ]' {! t/ T3 B$ {

# U+ G! U7 G6 W) e9 L

Build界面, k7 S2 ^2 F0 `. K4 E8 z( n
该界面是进行打包的界面。


/ {" k" O, |# x( G' A5 A- v9 L' I
  • Build Target:选择发布的平台
  • Output Path:输出路径
  • Clear Folders:构建之前清空文件夹(会把文件夹删除)
  • Copy to StreamingAssets:拷贝至StreamingAssets文件夹
  • Compression:选择压缩格式  C, Y# n1 ?) P; b! S; w! w

1 ^$ [$ q% u0 x4 ]8 ~9 w4 K0 G- k
2 C8 m7 E$ a; v! R; X

Inspect界面
. t, f; d; _! R8 V$ X: y这个界面会展示已经打成AB包的包内部信息。

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

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

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


9 U" X% ~0 a2 R2 T  H1 t6 P8 j
; w! z7 x6 x% S1 r! \

, d$ \1 m& H2 q2 J3 b

Ⅲ、完成打包

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

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


. W. a, D3 V6 ^$ n

7 |  s7 V& X! ]( ?9 [

& Q5 `7 X: p- {/ _+ U

2、实现资源复用
' v/ n7 P5 S2 g6 p& y📢 什么是资源复用
* |* \% T4 e' H' ~在打包的过程中,有很多资源都是重复的。例如:


; e2 P' e1 R# V7 c! \
  • 多个预制体使用的同一个模型,预制体只是材质颜色不同。
  • 有图片,被多个预制体使用。
    4 |3 [6 M: a% p
如果分别打AB包,这样会造成包体过大。
- v4 ~! Z" s* I, k! D. r

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

Ⅰ、一个资源重复的现象
4 u! D( [) T  ?' w2 n0 `8 B7 D. Z6 @我们实现一个资源重复的现象:


, ~* J5 R" Z+ U
  • 制作Trigger的复制预制体,新建材质球,替换它的原始材质球。
  • 给该预制体的AssetBundle重命名为tiggernew
    $ l+ m  Z+ U# _0 A2 v$ |' g( a4 J) w

& S; b. I* r5 l; R' a- ~
$ c/ U7 ?4 T! b! A

Ⅱ、创建共享AB包( J) F- b, H2 A4 O$ n% o7 H4 k
我们此时再次打开AssetBundle Browser,可以看到很多感叹号。

. t: c; g; u' m$ d0 d
  • 左侧预制体的感叹号,代表它们其中有重复的资源
  • 右侧包体内的感叹号,代表是这些资源重复
    9 p- O9 ]% P* r( W) Q$ r

4 K! H4 L1 n! d& @+ v
2 ^8 J# O3 ?/ j) O0 ?( M

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

& s% E0 O3 A! b5 s- _1 g+ o
1 j* q8 U1 c& y* s0 Y! B! W
将重复资源拖到res包内: 将tiger中的重复资源拖到res包内,我们能看到拖拽完成后,其他ab包内重复的资源也消失了。现在只有一份资源。
( L! ]) S% _" O0 |3 p2 Z8 n0 L4 v$ M6 S' k% C6 ?; }: ~
7 I9 o# E; U9 I9 Z! l

3 q7 G. F6 O: Z$ ^+ j9 r

Ⅲ、完成打包
2 g/ ^+ j4 A# L+ H' E; k% R同样的操作,点击Build,完成AB包的打包。 此时AB包内容如下:


" P, ]" r1 `  a5 K/ _

# t& E% M1 s5 w% v
/ R$ o8 ?* L) G5 k6 S5 I" |! n3 a

四、代码实例化AB包资源4 V+ [8 k: ^$ V& J4 A
下面我们完整做完整个流程:使用代码,去加载AB包中的老虎,完成我们的整个测试。

将该脚本挂载在场景中的物体上,运行项目时,便会加载出老虎了!
" @+ Q( y/ X0 g3 E. x

  1. using System.IO;
    . W& r6 p  R9 `* V) Y4 o# X: i
  2. using UnityEngine;<p></p>
    , j7 Q4 [  E5 Z" {' o$ J5 p; u4 r
  3. <p style="line-height: 30px; text-indent: 2em;">public class ABTest : MonoBehaviour5 ?% @) \) i+ R; [1 P; U9 Q# H
  4. {; J* V' {( [/ @' z/ H* I# c
  5.     void Start()
    7 d& `* d% k* D9 Z
  6.     {/ G( c5 b9 A% U# g: F; C: W$ X
  7.         //加载AssetBundle之前,先加载依赖的Bundle
    + N8 @6 F. n+ ~
  8.         //字符串"StandaloneWindows",是一个文件。这个文件的名字,是根据打包脚本,打包到哪个文件夹下,这个文件就叫什么名字。  B1 ?/ w& U( N5 G1 d( X! ?
  9.         //字符串"AssetBundleManifest",是固定写法。
    ( n0 a, H4 v+ n3 ^9 v/ I
  10.         AssetBundle assetBundle =
    5 E9 w: N9 S% F. E5 d! J
  11.             AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "StandaloneWindows"));
    - s0 z) {( W& o, h& I1 }
  12.         AssetBundleManifest manifest = assetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");</p># x* B7 H7 z# H
  13. <p style="line-height: 30px; text-indent: 2em;">        //字符串"tiger",是你要加载的老虎模型预制体的名字
    8 k, a/ d% T  x
  14.         foreach (var item in manifest.GetAllDependencies("tiger"))( p! @0 o+ m2 O, k: i
  15.         {
    / A" Z8 O, S  V2 F$ L5 f
  16.             AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, item));
    6 x" D: t; E! I# \' l
  17.         }</p>
    0 _5 Y/ I, c! D' p2 P8 H# Z
  18. <p style="line-height: 30px; text-indent: 2em;">        //------若要加载的文件只是一个视频或者其他,无依赖,可只做下面,直接加载Bundle文件,直接读Bundle即可------//</p>' m4 t9 G7 e& ?& N7 \) p+ S
  19. <p style="line-height: 30px; text-indent: 2em;">        //现在便可以加载模型了
    % o! T$ h7 r3 @% w5 G- j: J# f
  20.         string modelPath = Path.Combine(Application.streamingAssetsPath, "tiger");
    ' Y( H% ]% L+ Y. S
  21.         AssetBundle useAb = AssetBundle.LoadFromFile(modelPath);
    , K, X4 S! E- F! s: k5 [$ S" X' d
  22.         GameObject obj = useAb.LoadAsset<GameObject>("Tiger");</p>
      R4 j* Y% \) `, i, B* x
  23. <p style="line-height: 30px; text-indent: 2em;">        Instantiate(obj, transform);# Q# ?( o' Z3 M
  24.     }4 B( h0 H- [4 j5 g" }  U
  25. }</p>
复制代码
好啦,这就是本章所有内容 ~+ r4 G$ ]* {1 e5 C
# f8 p* l# N& n" D4 @1 g8 E( F- {
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|

GMT+8, 2026-5-6 05:44 AM , Processed in 0.080206 second(s), 23 queries .

Powered by xyh-moon X3.5

© 2001-2025 Discuz! Team.

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