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

AssetBundle Browser 教程

[复制链接]
发表于 2023-3-7 15:50:11 | 显示全部楼层 |阅读模式

一、插件功能6 C* i( M: N6 \* X* d, T# G6 j6 Z
1、插件是发布AB包的工具- m" _) z( L9 z; _7 J- ?
AssetBundle Browse可以将项目中的资源打包成AB包,发布游戏后,项目将通过加载StreamingAssets中AB包的形式,加载所需资源,而不是像之前那样,从Assets中进行加载。

1、AB包是什么$ x- {$ [9 t& a1 J
AB包全名AssetBundle(资源包)。是一种Unity提供的用于存放资源的包。通过将资源分布在不同的AB包中可以最大程度地减少运行时的内存压力,并且可以有选择地加载内容。

2、为什么要用AB包
5 o, M: e% A$ v6 b' k7 kⅠ、热更新

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

Ⅱ、Resources加载存在问题

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

$ L9 m9 o( T. d! `* t7 O
  • 对内存管理造成一定的负担。
  • 在打开应用时加载时间很长。
  • Resources文件夹下的所有资源统一合并到一个序列化文件中(可以看成统一打一个大包,巨型AB包有什么问题它就有什么问题),对资源优化有一定的限制。
    / O% m) A5 p. y% b3 i, Q+ D
因此不建议大量使用Resources。
4 y9 z+ _" Q/ }" k4 Y$ N9 m& V' n

二、安装插件的方式
2 f1 G' w' w" r7 S$ C! r% t7 ?$ I1、PackageManager安装- u4 A, u& [" P( K2 ?
橙子测试在Unity2019.3版本中,PackageManager中便有此插件, 同学们可以先看看自己版本的Unity是否可以直接安装。

8 x+ M' m$ m. O) s9 Q. r
' X1 w; P9 M0 s9 j) P1 h
% n; z& L5 x) D' c

2、GitHub下载* n+ S) R6 o# M4 W* o$ T) i6 ?
有的Unity版本是没有PackageManager的,或者PackageManager中没有此插件。 那么我们可以去GitHub下载此插件:传送门

三、插件使用方法介绍, F! v( g4 g) Y8 g7 B
下面介绍如何将Assets中的资源打成AB包。

1、实现导出一个AB包2 y% t6 U/ f, o/ t( w; e1 K
我们以该模型为例,将该模型打成AB包。


0 \: B+ A0 c! Y, E
# e. c0 S% h% L! o( s  P

5 \8 m# E* Y, A: V- |2 n

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

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

8 h! o! u, h# a+ a1 o& P, k  W8 q( z
/ q8 ^# ~+ t4 R8 m

1 J0 B: q3 \" Y0 ^3 {. n

Ⅱ、AssetBundle Browser界面介绍

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

Configure界面
' f: N8 Q3 Q7 K1 F9 B, v$ L我们能看到所有被标记为AssetBundle的文件。

, ?! ?3 ?8 L4 f, w' M
: w9 B% o  y7 }

8 @+ n+ F& R, m) i& Z, F

Build界面) b$ k1 e( s" T; a3 ~7 b- M
该界面是进行打包的界面。


9 O, M1 N1 g) m/ T  o6 _/ n. |# |2 X
  • Build Target:选择发布的平台
  • Output Path:输出路径
  • Clear Folders:构建之前清空文件夹(会把文件夹删除)
  • Copy to StreamingAssets:拷贝至StreamingAssets文件夹
  • Compression:选择压缩格式
    & v# x  O+ {6 I! Y5 Z4 A  l" O

: A/ G2 m+ D4 X' P; ~) [) @& ~
! B. V0 J$ x" h, b: u8 s

Inspect界面
/ `( V$ S% Q  [7 o& {6 c这个界面会展示已经打成AB包的包内部信息。

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

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

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


# C1 F* g% j7 [: \5 I% a3 @' E: s
1 ]) [4 C9 x% m  z. ?1 v  {
  o4 X% L: C. M

Ⅲ、完成打包

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

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

1 z3 L" g/ J: q5 _' y& n

# X5 i: H, J' ~  n1 \: c! d$ q6 f
2 P, [0 ?9 d7 R8 S0 I

2、实现资源复用  V% [" q5 Z. G' t# O& O
📢 什么是资源复用
. m5 |) K1 Q! J; D# K在打包的过程中,有很多资源都是重复的。例如:


4 c% Z7 R: W6 O+ H8 K/ ]
  • 多个预制体使用的同一个模型,预制体只是材质颜色不同。
  • 有图片,被多个预制体使用。
    " t0 `/ s  D+ `$ I7 l$ v
如果分别打AB包,这样会造成包体过大。
+ W, D2 y: S# A  {

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

Ⅰ、一个资源重复的现象" X% t1 q. `3 a5 c$ J5 g# L! y( m
我们实现一个资源重复的现象:

: F/ Y. F$ T' n/ Z0 V/ A1 `
  • 制作Trigger的复制预制体,新建材质球,替换它的原始材质球。
  • 给该预制体的AssetBundle重命名为tiggernew, `. L% q6 B, \' j4 F
3 O# Y' ?8 w# c/ o

# @3 A2 O5 B9 G3 |3 X/ {

Ⅱ、创建共享AB包3 {1 R9 }4 ~9 R2 c
我们此时再次打开AssetBundle Browser,可以看到很多感叹号。


: r' Y+ f" L0 E
  • 左侧预制体的感叹号,代表它们其中有重复的资源
  • 右侧包体内的感叹号,代表是这些资源重复
    : a% ?' f' S( ?
3 x5 T2 l3 u$ V$ Y/ t1 I
5 P  X) m* e" a7 @# e0 O

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

: M4 R, a- I* K1 m% j! H
) o# C2 l$ @' W% G/ r; n$ {2 V
将重复资源拖到res包内: 将tiger中的重复资源拖到res包内,我们能看到拖拽完成后,其他ab包内重复的资源也消失了。现在只有一份资源。, ]/ U9 o4 p( s
* g  @3 W: v7 U8 @3 R& c  S
/ p" ?) l& s4 q# E5 r- w" J2 v' w

5 f5 M8 J& V4 Z6 y' Z- @

Ⅲ、完成打包- a  S  Q1 V4 k- o4 a
同样的操作,点击Build,完成AB包的打包。 此时AB包内容如下:

& d( \# v, H0 c& a1 O$ g

# ?; y9 r% |% H7 p3 k2 ?$ t

" n) H$ C8 T, d8 x" Y

四、代码实例化AB包资源
& |' T6 }* a) n# s) h3 o9 V1 X5 W下面我们完整做完整个流程:使用代码,去加载AB包中的老虎,完成我们的整个测试。

将该脚本挂载在场景中的物体上,运行项目时,便会加载出老虎了!5 c( E0 B  s- ~7 l

  1. using System.IO;
    ' t: G8 V9 z8 V0 `5 @$ e: A5 F
  2. using UnityEngine;<p></p>
    , `7 y3 O$ p/ X8 F8 N
  3. <p style="line-height: 30px; text-indent: 2em;">public class ABTest : MonoBehaviour, r+ G" {1 ]8 A% {' Z& q2 n% @
  4. {
    . T) g8 n+ W! F5 o/ I
  5.     void Start()
    ; F4 `4 r1 P% [4 F$ n+ v' G# g& G
  6.     {2 |, {  k1 [+ c% b( p* ^
  7.         //加载AssetBundle之前,先加载依赖的Bundle- S, {  x  e3 W8 r# ?" `( a
  8.         //字符串"StandaloneWindows",是一个文件。这个文件的名字,是根据打包脚本,打包到哪个文件夹下,这个文件就叫什么名字。
    6 G. R# U; x, t; Y" p
  9.         //字符串"AssetBundleManifest",是固定写法。
    / H+ p$ v  j7 R) n- H
  10.         AssetBundle assetBundle =
    " [, l, f' o3 }1 S
  11.             AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "StandaloneWindows"));, x" j6 [* }8 r
  12.         AssetBundleManifest manifest = assetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");</p>
    $ X  s% q$ U. V1 b* J- q+ r: z+ a
  13. <p style="line-height: 30px; text-indent: 2em;">        //字符串"tiger",是你要加载的老虎模型预制体的名字2 w! U: X  Z7 C% t4 r
  14.         foreach (var item in manifest.GetAllDependencies("tiger"))
    8 L+ ]  w- w) O+ ~
  15.         {
    + N. r. L& ~2 P" \3 t
  16.             AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, item));9 R6 o0 m/ ^+ s7 z! u
  17.         }</p>
    % \5 T! P6 {, T0 H- Q- g+ F
  18. <p style="line-height: 30px; text-indent: 2em;">        //------若要加载的文件只是一个视频或者其他,无依赖,可只做下面,直接加载Bundle文件,直接读Bundle即可------//</p>9 w" F) f5 W8 a, m
  19. <p style="line-height: 30px; text-indent: 2em;">        //现在便可以加载模型了
    ! K' @  r& p0 F- F" B  ?% T5 E9 Q
  20.         string modelPath = Path.Combine(Application.streamingAssetsPath, "tiger");! J/ W# e- b8 D+ r! r! |
  21.         AssetBundle useAb = AssetBundle.LoadFromFile(modelPath);/ j. c! ^' @0 w* Z
  22.         GameObject obj = useAb.LoadAsset<GameObject>("Tiger");</p>
    " ]# c0 ]! d: v' k- _! p* a
  23. <p style="line-height: 30px; text-indent: 2em;">        Instantiate(obj, transform);
    : }! R1 Z9 R2 y" C2 S, |9 u3 D
  24.     }
    7 ^; c6 D  G8 v* Z
  25. }</p>
复制代码
好啦,这就是本章所有内容 ~
, ]( @8 ^. ?" u
2 N" D# a# m! }* H1 e7 J6 d. d
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|

GMT+8, 2026-11-3 12:32 AM , Processed in 0.129402 second(s), 23 queries .

Powered by xyh-moon X3.5

© 2001-2026 Discuz! Team.

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