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

AssetBundle Browser 教程

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

一、插件功能
. c  X6 M2 g7 o5 ^0 v$ i+ }1、插件是发布AB包的工具8 K5 x! N) K  ?6 I* Z2 V
AssetBundle Browse可以将项目中的资源打包成AB包,发布游戏后,项目将通过加载StreamingAssets中AB包的形式,加载所需资源,而不是像之前那样,从Assets中进行加载。

1、AB包是什么
7 n& a* ?$ H2 l& O5 b; k0 PAB包全名AssetBundle(资源包)。是一种Unity提供的用于存放资源的包。通过将资源分布在不同的AB包中可以最大程度地减少运行时的内存压力,并且可以有选择地加载内容。

2、为什么要用AB包+ J: \; _) U9 B
Ⅰ、热更新

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

Ⅱ、Resources加载存在问题

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


2 C. `: X2 j9 o
  • 对内存管理造成一定的负担。
  • 在打开应用时加载时间很长。
  • Resources文件夹下的所有资源统一合并到一个序列化文件中(可以看成统一打一个大包,巨型AB包有什么问题它就有什么问题),对资源优化有一定的限制。
    2 ]- \* h: z/ W$ I( k0 O
因此不建议大量使用Resources。
5 W& M! f: V; \7 r9 m1 C

二、安装插件的方式
3 ~( h8 v/ N# h7 L! d+ [3 L( J1、PackageManager安装% ^/ R) r: ~  X. G
橙子测试在Unity2019.3版本中,PackageManager中便有此插件, 同学们可以先看看自己版本的Unity是否可以直接安装。

4 U1 i2 u9 ~/ @5 `

. H# X) s$ [/ T! X$ r

8 i$ I2 `+ |! X5 y( s, K6 @0 W, m7 W

2、GitHub下载2 W- @8 J, P5 V3 W6 Q4 _9 l
有的Unity版本是没有PackageManager的,或者PackageManager中没有此插件。 那么我们可以去GitHub下载此插件:传送门

三、插件使用方法介绍, J2 u2 m9 ~8 j
下面介绍如何将Assets中的资源打成AB包。

1、实现导出一个AB包. O/ e2 R, f6 C! M+ X
我们以该模型为例,将该模型打成AB包。

3 V5 N5 q2 I7 l, c' D

/ ?+ r7 c0 Y6 m( g2 L) {
& h* a% s) j% s: e. j

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

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

3 [' f* i) j. u& p

9 ]$ {/ |5 d6 G# P

% L$ K& F" t9 t0 ?0 m% k3 O% G

Ⅱ、AssetBundle Browser界面介绍

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

Configure界面5 B% }  c& e! G+ B$ s' F/ I6 ]
我们能看到所有被标记为AssetBundle的文件。


# j: }* M$ K& x8 Z4 c6 p- A- `- h

& k7 T& L! Y9 S* H
- h5 Y, _  m9 t. {& J

Build界面
: w- P% A3 b, `+ [1 c; ]该界面是进行打包的界面。


4 N* \3 F1 ~" E: x; H, [% H
  • Build Target:选择发布的平台
  • Output Path:输出路径
  • Clear Folders:构建之前清空文件夹(会把文件夹删除)
  • Copy to StreamingAssets:拷贝至StreamingAssets文件夹
  • Compression:选择压缩格式
    ' y# E5 x" n* |9 a) V
& L8 Z/ ]' \- B8 M4 r- g
0 Z. C7 M0 h% A0 v6 P7 S. w6 ]

Inspect界面+ @9 }: M0 K' _$ f
这个界面会展示已经打成AB包的包内部信息。

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

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

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


* Z1 W8 i1 n& T! c
$ }1 `9 _( |4 w. u/ [
+ g8 f3 k- r8 i& a# w

Ⅲ、完成打包

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

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

0 s% p8 J4 K- ?/ X; c5 S
) F, @! }- c1 v" `  }4 R  ^
. R$ V1 L' j; c

2、实现资源复用+ Q$ L! `9 I. i+ m  N! Q
📢 什么是资源复用5 r. q9 T, U) H' r) ~
在打包的过程中,有很多资源都是重复的。例如:


7 E+ J7 [8 u9 c* C5 |
  • 多个预制体使用的同一个模型,预制体只是材质颜色不同。
  • 有图片,被多个预制体使用。8 ]1 ~% m4 \/ k; P% H
如果分别打AB包,这样会造成包体过大。! a. q; `) u+ K1 _$ v

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

Ⅰ、一个资源重复的现象, K0 u7 J' w2 U6 J- b. o5 }$ V
我们实现一个资源重复的现象:


% X; B) b+ o$ U* S( c& l; N4 ~( |
  • 制作Trigger的复制预制体,新建材质球,替换它的原始材质球。
  • 给该预制体的AssetBundle重命名为tiggernew  c0 E: f: T6 k5 q$ A* W, d; T
- u- R, i5 h3 R( i

- v* S$ M; k% _8 g% T9 }' }7 |

Ⅱ、创建共享AB包/ U8 v( k0 o% Z% Z! n0 |
我们此时再次打开AssetBundle Browser,可以看到很多感叹号。


; u  U, y$ H$ O- J& C/ J
  • 左侧预制体的感叹号,代表它们其中有重复的资源
  • 右侧包体内的感叹号,代表是这些资源重复
    # b0 f2 q) H1 A2 F3 y/ x7 f

- L# H6 b9 ?" }  I. L" o
% _5 w) S1 W) a: }; ]

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


5 ]$ Y3 u6 n5 N
9 V2 f' `* e/ H1 f/ o" r' e3 a
将重复资源拖到res包内: 将tiger中的重复资源拖到res包内,我们能看到拖拽完成后,其他ab包内重复的资源也消失了。现在只有一份资源。/ Y- B4 Q1 g( Z! r6 W% v& U

0 G9 O3 N  X; I. l/ T0 R/ O' F
+ d  l2 I) n5 n1 ?: V9 W: x

2 I4 Q, i9 b8 v- L. k

Ⅲ、完成打包4 L  Y7 _* Y1 U9 E8 ~, R
同样的操作,点击Build,完成AB包的打包。 此时AB包内容如下:

- D1 G9 N- [6 x" m

- P2 [* M/ U) r1 L

. s1 g: y, Q2 A+ p* n6 Q

四、代码实例化AB包资源
% Y3 c  F$ r3 l- @5 K下面我们完整做完整个流程:使用代码,去加载AB包中的老虎,完成我们的整个测试。

将该脚本挂载在场景中的物体上,运行项目时,便会加载出老虎了!
7 ^/ Z4 F2 I" K' J

  1. using System.IO;
    9 Y' k$ x" K. O4 x
  2. using UnityEngine;<p></p>
    * ^% H/ X# K7 K- r. F! w5 c
  3. <p style="line-height: 30px; text-indent: 2em;">public class ABTest : MonoBehaviour
    6 l! G+ j! @$ A8 C3 U
  4. {4 f2 `7 ~9 D  `% w( M
  5.     void Start()
    3 y% K) `  B2 s+ o1 d5 N
  6.     {! l- O* H, s( n" z' U% x" I9 _: d
  7.         //加载AssetBundle之前,先加载依赖的Bundle
    ( ~  [7 s2 V4 |1 F1 b
  8.         //字符串"StandaloneWindows",是一个文件。这个文件的名字,是根据打包脚本,打包到哪个文件夹下,这个文件就叫什么名字。0 \" j: v/ T  Y* V
  9.         //字符串"AssetBundleManifest",是固定写法。
    ( o$ I- R- n: B2 d- e
  10.         AssetBundle assetBundle =# H" }) F) q. X
  11.             AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "StandaloneWindows"));
    # T* Y* ]# |6 v2 ]
  12.         AssetBundleManifest manifest = assetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");</p>
    ( o  s: J4 `2 A% |  ?
  13. <p style="line-height: 30px; text-indent: 2em;">        //字符串"tiger",是你要加载的老虎模型预制体的名字
    8 q% z6 h" q9 y
  14.         foreach (var item in manifest.GetAllDependencies("tiger"))
    * p; ~$ j4 ^4 A# j) j  g
  15.         {- {; w) i- Z9 ~/ s
  16.             AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, item));
    - m6 `3 @1 b* V2 z0 f3 q+ {8 ^
  17.         }</p>
    8 |8 T9 o2 o: B
  18. <p style="line-height: 30px; text-indent: 2em;">        //------若要加载的文件只是一个视频或者其他,无依赖,可只做下面,直接加载Bundle文件,直接读Bundle即可------//</p>  b0 H* G7 Q" z
  19. <p style="line-height: 30px; text-indent: 2em;">        //现在便可以加载模型了
    ( n7 D# g6 }, l% E5 U! `
  20.         string modelPath = Path.Combine(Application.streamingAssetsPath, "tiger");
    9 ]4 F: ?7 v; _
  21.         AssetBundle useAb = AssetBundle.LoadFromFile(modelPath);  V0 U7 _+ b. L
  22.         GameObject obj = useAb.LoadAsset<GameObject>("Tiger");</p>
    7 o) L" ]7 O. i  u! K
  23. <p style="line-height: 30px; text-indent: 2em;">        Instantiate(obj, transform);  {( {- B# r0 m1 d, E  W
  24.     }3 K! H: Q- Z& X/ ?4 ?5 d$ f
  25. }</p>
复制代码
好啦,这就是本章所有内容 ~$ w' T3 ]" L% [5 Q! F$ D+ n

% B1 z& A" E4 @+ S7 @( t
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|

GMT+8, 2026-11-3 02:35 AM , Processed in 0.079959 second(s), 23 queries .

Powered by xyh-moon X3.5

© 2001-2026 Discuz! Team.

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