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

AssetBundle Browser 教程

[复制链接]

989

主题

92

回帖

5万

积分

管理员

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

一、插件功能
6 Y8 T: B) h* h4 N9 v8 \9 c1、插件是发布AB包的工具
& S, S5 @% Y$ |6 \( I2 a4 lAssetBundle Browse可以将项目中的资源打包成AB包,发布游戏后,项目将通过加载StreamingAssets中AB包的形式,加载所需资源,而不是像之前那样,从Assets中进行加载。

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

2、为什么要用AB包
0 y; m/ S! c; ]Ⅰ、热更新

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

Ⅱ、Resources加载存在问题

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


7 ]9 C1 n, }! T; v7 F+ g
  • 对内存管理造成一定的负担。
  • 在打开应用时加载时间很长。
  • Resources文件夹下的所有资源统一合并到一个序列化文件中(可以看成统一打一个大包,巨型AB包有什么问题它就有什么问题),对资源优化有一定的限制。
    , M& K$ F8 m# @! X* B
因此不建议大量使用Resources。, D; _1 k% ^( L( P

二、安装插件的方式
  n9 I* i# Y+ W+ j1、PackageManager安装
, T8 P$ r3 r* z4 r橙子测试在Unity2019.3版本中,PackageManager中便有此插件, 同学们可以先看看自己版本的Unity是否可以直接安装。


0 N% r1 V7 [" \5 s' X9 G- p
( a* G8 F7 ]0 \+ J# K5 q2 x

6 U; ~5 \. L; v- k1 w# ]

2、GitHub下载; z* [  C4 H+ K' e' u& \
有的Unity版本是没有PackageManager的,或者PackageManager中没有此插件。 那么我们可以去GitHub下载此插件:传送门

三、插件使用方法介绍! t6 q  \( o' r$ R- ]
下面介绍如何将Assets中的资源打成AB包。

1、实现导出一个AB包% y* f9 ?, `) y! S3 Z) Y
我们以该模型为例,将该模型打成AB包。

! L( v5 l  b6 y/ l/ \

8 w/ L+ U+ n) W# O, y& l

1 {, v) M4 M% n' _6 {/ d/ j

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

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


' F  k+ q  T/ M) o2 L
: H% z9 t8 t9 f# }
& w+ N* O9 d% [- Q

Ⅱ、AssetBundle Browser界面介绍

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

Configure界面
6 v, s0 ^$ H% {( X* k" e" }我们能看到所有被标记为AssetBundle的文件。

2 l) n! Y% z. j! s4 ~

& [6 ~: v" z9 c  t

3 Y3 a1 p- y% \( {

Build界面! G/ J+ ^% q: Q! Y2 d+ H: H
该界面是进行打包的界面。


, ?! l2 S, u, B/ u% b
  • Build Target:选择发布的平台
  • Output Path:输出路径
  • Clear Folders:构建之前清空文件夹(会把文件夹删除)
  • Copy to StreamingAssets:拷贝至StreamingAssets文件夹
  • Compression:选择压缩格式9 R7 E$ d( Z8 f1 Q8 `1 R; U" t/ V
: W; S4 s+ o; a. D% M
# [1 d* ~7 ]" j/ I$ f; g

Inspect界面" N/ }; ~8 i7 @6 z+ a
这个界面会展示已经打成AB包的包内部信息。

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

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

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

/ p7 x9 f4 r! W) S7 Z5 O
# Q3 z. r9 s( C' C
& k, Q& Y- `2 }5 i/ K/ E

Ⅲ、完成打包

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

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


) @" d: w' O5 Z+ f

2 f# m" u5 X' S& V  A( J/ z

5 f  n" f& P0 R; I( J' l

2、实现资源复用0 s, N% R+ ^3 }, O. X( M
📢 什么是资源复用
0 b; T7 c' O" s" a% n& n4 t在打包的过程中,有很多资源都是重复的。例如:

  A' J! W- {% G) t# Z4 L2 t
  • 多个预制体使用的同一个模型,预制体只是材质颜色不同。
  • 有图片,被多个预制体使用。& X9 n% K4 W5 S" g# J# |* K6 H
如果分别打AB包,这样会造成包体过大。
  i! G6 G& g4 w- t3 P5 z  }+ m

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

Ⅰ、一个资源重复的现象9 Y$ G: g" U+ W1 n) \/ C
我们实现一个资源重复的现象:


1 F, p( j4 p5 j2 H7 _0 o* ]
  • 制作Trigger的复制预制体,新建材质球,替换它的原始材质球。
  • 给该预制体的AssetBundle重命名为tiggernew
    1 a( t" s& N8 ?2 k* f; ^2 ~

  {6 p9 X& x0 K$ o' L% x9 f

" U: _4 _/ y3 g/ a) v8 }& V! e$ U' A1 \

Ⅱ、创建共享AB包# Z5 J' _1 r, `$ C7 H
我们此时再次打开AssetBundle Browser,可以看到很多感叹号。

1 S, ~2 b  f  G! R# x. g( R3 v
  • 左侧预制体的感叹号,代表它们其中有重复的资源
  • 右侧包体内的感叹号,代表是这些资源重复
    $ A" Q+ v! U5 V- P

5 O7 Q; c0 P9 C1 @& h+ ]4 g0 k
2 l9 P" m* k$ i; x4 _

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


$ \. y. Q2 _3 z$ ~# |2 q7 s3 t
6 U1 E4 l0 Q# X0 q, B5 Z: u
将重复资源拖到res包内: 将tiger中的重复资源拖到res包内,我们能看到拖拽完成后,其他ab包内重复的资源也消失了。现在只有一份资源。
6 O  D/ X8 n* F% s* e
3 [9 C0 \! J& ]4 h$ M  u. f4 @) C8 A

9 @8 ?" Q% a2 C6 q( ~- g$ B2 D

4 E& w1 p4 S+ B3 q6 @7 V+ Q

Ⅲ、完成打包
9 U/ }5 c# A+ m( T* U  n: m同样的操作,点击Build,完成AB包的打包。 此时AB包内容如下:


( r. k, X! ^# E
2 t& l# o4 E6 p0 ~6 r3 r
! G. M' _3 b* Q" l' J& ^

四、代码实例化AB包资源* P: y  [& ^5 o% ]6 |2 q! O
下面我们完整做完整个流程:使用代码,去加载AB包中的老虎,完成我们的整个测试。

将该脚本挂载在场景中的物体上,运行项目时,便会加载出老虎了!
( Z8 g) D  @! I2 u" ]8 Y# b3 m4 d

  1. using System.IO;9 x1 y1 g7 }5 L. Y3 R# N; m
  2. using UnityEngine;<p></p>
    + k* `" X; j6 ]2 Z$ |/ D& N. B0 u
  3. <p style="line-height: 30px; text-indent: 2em;">public class ABTest : MonoBehaviour
    " T1 q; r0 u5 N
  4. {: v, {5 ~8 s4 Y; ~9 g# U0 x/ E; c
  5.     void Start(). u9 b6 y/ i; Z! H
  6.     {/ ]) E' b% T7 U: z0 G" x* I
  7.         //加载AssetBundle之前,先加载依赖的Bundle
    $ ~' r$ C0 B5 L! F8 e  r2 R
  8.         //字符串"StandaloneWindows",是一个文件。这个文件的名字,是根据打包脚本,打包到哪个文件夹下,这个文件就叫什么名字。
    : K( a# @. e# I- h
  9.         //字符串"AssetBundleManifest",是固定写法。
    6 P9 k/ i% H+ Y: M1 p  M( Z) u, v
  10.         AssetBundle assetBundle =( p4 h7 D( R8 E3 Y, z& I4 V* S
  11.             AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "StandaloneWindows"));5 _0 _) c2 y4 V: D
  12.         AssetBundleManifest manifest = assetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");</p>
    3 I3 t3 \" U' f$ X
  13. <p style="line-height: 30px; text-indent: 2em;">        //字符串"tiger",是你要加载的老虎模型预制体的名字. w& ]# E8 G/ _# y
  14.         foreach (var item in manifest.GetAllDependencies("tiger"))
    ) y, D+ |6 r/ z& O4 h" m
  15.         {# ?8 S2 g1 d2 F- i* M% c; F# q
  16.             AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, item));
    1 O5 x$ \- j( B* l
  17.         }</p>
    ' n+ ?. ?' b$ N8 r& R: z( n/ v+ r) b
  18. <p style="line-height: 30px; text-indent: 2em;">        //------若要加载的文件只是一个视频或者其他,无依赖,可只做下面,直接加载Bundle文件,直接读Bundle即可------//</p>
    6 m' U/ E+ J7 E# y- _* O. J5 `3 U% y
  19. <p style="line-height: 30px; text-indent: 2em;">        //现在便可以加载模型了3 l7 M! f. F7 o- Z* b0 M2 I) M
  20.         string modelPath = Path.Combine(Application.streamingAssetsPath, "tiger");
    5 O4 R8 r; J/ K% L3 U& ^6 P
  21.         AssetBundle useAb = AssetBundle.LoadFromFile(modelPath);
    * E8 j5 Q; ]6 z6 E* q1 S1 ^
  22.         GameObject obj = useAb.LoadAsset<GameObject>("Tiger");</p>
    & J- @: M  I, G; }! G) v
  23. <p style="line-height: 30px; text-indent: 2em;">        Instantiate(obj, transform);5 ]# P/ @; U/ w# m- {) {- k- q
  24.     }; z  S3 o/ v/ m* h& U$ ^) [
  25. }</p>
复制代码
好啦,这就是本章所有内容 ~
% n5 _- p  q0 ^/ d7 Y4 \" |4 r5 q. Z" a- I( s) E
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|

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

Powered by xyh-moon X3.5

© 2001-2025 Discuz! Team.

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