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

AssetBundle Browser 教程

[复制链接]

986

主题

92

回帖

5万

积分

管理员

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

一、插件功能
9 Q! W* a( h6 P! z+ B4 M1、插件是发布AB包的工具
# r* N5 h/ o6 W" e8 GAssetBundle Browse可以将项目中的资源打包成AB包,发布游戏后,项目将通过加载StreamingAssets中AB包的形式,加载所需资源,而不是像之前那样,从Assets中进行加载。

1、AB包是什么1 n, p* Z) J  {9 ~. D! i) P
AB包全名AssetBundle(资源包)。是一种Unity提供的用于存放资源的包。通过将资源分布在不同的AB包中可以最大程度地减少运行时的内存压力,并且可以有选择地加载内容。

2、为什么要用AB包
- T* k5 w2 m( ^, xⅠ、热更新

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

Ⅱ、Resources加载存在问题

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

* K0 `: Q; z& ~% B5 I
  • 对内存管理造成一定的负担。
  • 在打开应用时加载时间很长。
  • Resources文件夹下的所有资源统一合并到一个序列化文件中(可以看成统一打一个大包,巨型AB包有什么问题它就有什么问题),对资源优化有一定的限制。# V% a6 n! w8 R( P
因此不建议大量使用Resources。
4 L: v7 |2 X& H* U  _

二、安装插件的方式' H+ y% J) R% [% l7 y5 U
1、PackageManager安装  N( g) ^1 d  n5 g2 b
橙子测试在Unity2019.3版本中,PackageManager中便有此插件, 同学们可以先看看自己版本的Unity是否可以直接安装。


% W, o0 h' o+ n% y3 {' t3 e
9 @5 n, a7 n6 l
' N' Y, F& }6 b7 g

2、GitHub下载) t3 U6 D2 L% V8 ~( |) q0 |% W
有的Unity版本是没有PackageManager的,或者PackageManager中没有此插件。 那么我们可以去GitHub下载此插件:传送门

三、插件使用方法介绍
0 B2 H3 {: i( l% t# T7 w1 t0 }: Q下面介绍如何将Assets中的资源打成AB包。

1、实现导出一个AB包* S1 U7 E1 ~9 Z, ~( a3 o
我们以该模型为例,将该模型打成AB包。

7 G" T5 \$ s# t& E
7 C' |# u  l! j% Y6 i) _

% @: |) C/ h3 F, n6 E

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

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


; [: ?' m& O! T0 y, ]# P

& F5 S9 z# v) Q0 J( Q) A  j

4 _) u" E! @0 y( K0 ~6 [' g; S

Ⅱ、AssetBundle Browser界面介绍

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

Configure界面5 g( t' d% T; H. D2 D
我们能看到所有被标记为AssetBundle的文件。


1 n; A  ^5 z9 W4 P" t, l: M: a

0 ]) D, ?: W( h) n8 k2 L  g( H
) ]; |2 E) t) T

Build界面: j, ^3 v; R% y  s0 u
该界面是进行打包的界面。

$ p+ i7 l/ ^: b( I
  • Build Target:选择发布的平台
  • Output Path:输出路径
  • Clear Folders:构建之前清空文件夹(会把文件夹删除)
  • Copy to StreamingAssets:拷贝至StreamingAssets文件夹
  • Compression:选择压缩格式. Q" J9 D, }$ k; q3 _  M
: E: }6 b" X" d3 }4 [% b5 P) _3 I5 \
0 F/ z5 z8 |) @1 q& `. i

Inspect界面  G4 C! V8 _8 b  _2 e
这个界面会展示已经打成AB包的包内部信息。

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

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

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


) N1 i0 \2 T* I% j7 q1 d# ~% K

% |+ I, ~! b$ ~7 Q0 n! U
% ?  ]/ a* `' j; `$ \9 f, r6 L

Ⅲ、完成打包

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

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


7 _$ L- J( w5 e/ |
2 t% E" G. }# w3 t

& W* o! N" B- V& X- m; k6 z4 A

2、实现资源复用
! G5 S+ r4 h* C( Z8 d📢 什么是资源复用9 e5 f5 p: j; Z# N9 x/ C
在打包的过程中,有很多资源都是重复的。例如:

9 K; D& U& R# A4 y& V) O  F
  • 多个预制体使用的同一个模型,预制体只是材质颜色不同。
  • 有图片,被多个预制体使用。
    * D* X" w& V7 j7 q* B1 ~4 i/ e
如果分别打AB包,这样会造成包体过大。; J* y! K. ?" ^

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

Ⅰ、一个资源重复的现象
6 Y( z8 f9 P, J我们实现一个资源重复的现象:

" w3 g% W, E7 O1 C: b! x8 G
  • 制作Trigger的复制预制体,新建材质球,替换它的原始材质球。
  • 给该预制体的AssetBundle重命名为tiggernew
    ) A: p1 E; n3 }2 V- F* w/ ^

2 D5 {2 d5 W2 z, Q# N1 m/ a

; b' M( [9 Q% m% l2 M3 w

Ⅱ、创建共享AB包
  x8 x6 k" R/ c, F8 m( j4 }3 B我们此时再次打开AssetBundle Browser,可以看到很多感叹号。

! P( A# j  \* D; H1 c. E) h/ m, z
  • 左侧预制体的感叹号,代表它们其中有重复的资源
  • 右侧包体内的感叹号,代表是这些资源重复
      O- \; ~7 J: y, ^2 [8 J7 V9 n

: j! ]* c1 `7 g: o
1 q- d* Z! Q8 N; i

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


+ G" f5 j- d/ ]

* e: K8 d( q) S( h
将重复资源拖到res包内: 将tiger中的重复资源拖到res包内,我们能看到拖拽完成后,其他ab包内重复的资源也消失了。现在只有一份资源。
; L4 X- n+ y4 y  U  E# e
7 C* u8 B9 N1 }- M, i

, }  d" M8 x/ i0 X7 K! b
8 h+ L0 W! `# T- A0 l+ y, j

Ⅲ、完成打包; m' q: f4 l' Z% V! I2 z7 T
同样的操作,点击Build,完成AB包的打包。 此时AB包内容如下:

; U" \- Q  ?; X/ L. _
7 |2 Q% h) A( g5 e' ]9 Z. U

, S2 h% q. j( g- a

四、代码实例化AB包资源% M. Y3 U( W9 n: K4 Z
下面我们完整做完整个流程:使用代码,去加载AB包中的老虎,完成我们的整个测试。

将该脚本挂载在场景中的物体上,运行项目时,便会加载出老虎了!
4 l, ~( |  @: n5 H! F5 H

  1. using System.IO;
    ! ^5 {1 [7 t( }& O
  2. using UnityEngine;<p></p>- H% {9 w5 |8 I' e7 d9 i
  3. <p style="line-height: 30px; text-indent: 2em;">public class ABTest : MonoBehaviour6 p3 e/ X& ~4 N- G4 E9 J
  4. {8 A) V7 D( E5 e$ ?* N
  5.     void Start()
    4 w2 ~! j$ \1 g3 @, N# ]1 u
  6.     {
    ' h) D4 |/ R5 E2 C/ m( z
  7.         //加载AssetBundle之前,先加载依赖的Bundle
    - y* G, f( U  m/ j
  8.         //字符串"StandaloneWindows",是一个文件。这个文件的名字,是根据打包脚本,打包到哪个文件夹下,这个文件就叫什么名字。
    % g+ u1 v' \8 z
  9.         //字符串"AssetBundleManifest",是固定写法。
    ( z# _$ I+ ]4 D: [
  10.         AssetBundle assetBundle =
    & _3 q3 H& ^$ ^# N! ?, q* W
  11.             AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "StandaloneWindows"));# N, b6 c1 v+ l2 C  s' Q- u
  12.         AssetBundleManifest manifest = assetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");</p>: K/ i  y; m, `7 U5 x& b
  13. <p style="line-height: 30px; text-indent: 2em;">        //字符串"tiger",是你要加载的老虎模型预制体的名字
    + t$ q- G7 U2 g' Z, U! k/ E
  14.         foreach (var item in manifest.GetAllDependencies("tiger"))
    - w5 J; E+ N0 |7 C4 b( y
  15.         {
    + P5 ?( w( A' T! H; y/ |. O2 }
  16.             AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, item));" E# Y3 F, b  t8 ^
  17.         }</p>
    $ R" Z2 J% i; l/ ^' b- r4 R
  18. <p style="line-height: 30px; text-indent: 2em;">        //------若要加载的文件只是一个视频或者其他,无依赖,可只做下面,直接加载Bundle文件,直接读Bundle即可------//</p>
    2 W9 o3 Y4 z$ g- H7 S6 d
  19. <p style="line-height: 30px; text-indent: 2em;">        //现在便可以加载模型了
    0 a# Z9 H9 w6 C2 c8 e) e+ h" ?; u
  20.         string modelPath = Path.Combine(Application.streamingAssetsPath, "tiger");
    & |% Q4 \9 @2 {+ G0 N/ x1 R
  21.         AssetBundle useAb = AssetBundle.LoadFromFile(modelPath);/ A$ ]. \3 w8 l3 Y
  22.         GameObject obj = useAb.LoadAsset<GameObject>("Tiger");</p>
    % [8 ~# `  l2 ]# J
  23. <p style="line-height: 30px; text-indent: 2em;">        Instantiate(obj, transform);( Y* H/ x2 j0 u* o
  24.     }
      S9 I4 M% B9 |0 N2 a
  25. }</p>
复制代码
好啦,这就是本章所有内容 ~+ t  W: V3 x/ y! g' i

8 K1 l5 O% E1 B$ ]! |% o5 Q
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|

GMT+8, 2026-3-21 11:57 PM , Processed in 0.089351 second(s), 23 queries .

Powered by xyh-moon X3.5

© 2001-2025 Discuz! Team.

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