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

AssetBundle Browser 教程

[复制链接]

979

主题

90

回帖

5万

积分

管理员

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

一、插件功能/ G( S: m% T! Z$ I7 N5 P
1、插件是发布AB包的工具2 u: l! F3 W+ f0 G
AssetBundle Browse可以将项目中的资源打包成AB包,发布游戏后,项目将通过加载StreamingAssets中AB包的形式,加载所需资源,而不是像之前那样,从Assets中进行加载。

1、AB包是什么
4 V$ B3 m. P  T! H7 M- ?AB包全名AssetBundle(资源包)。是一种Unity提供的用于存放资源的包。通过将资源分布在不同的AB包中可以最大程度地减少运行时的内存压力,并且可以有选择地加载内容。

2、为什么要用AB包
5 V% P2 c# k5 E. j' D/ DⅠ、热更新

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

Ⅱ、Resources加载存在问题

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

4 R9 `# q% L0 m2 ], u" h
  • 对内存管理造成一定的负担。
  • 在打开应用时加载时间很长。
  • Resources文件夹下的所有资源统一合并到一个序列化文件中(可以看成统一打一个大包,巨型AB包有什么问题它就有什么问题),对资源优化有一定的限制。) P* p. w, {7 A& |7 F5 q
因此不建议大量使用Resources。
" u7 c1 O+ t% w. Y6 G: a; I" Q

二、安装插件的方式
+ T: d5 }8 t& @4 G5 Z! A1、PackageManager安装; Z4 `/ z  V4 T0 q; h6 O
橙子测试在Unity2019.3版本中,PackageManager中便有此插件, 同学们可以先看看自己版本的Unity是否可以直接安装。


% Q9 g6 @3 k/ [
, v0 ]4 j/ ^% t* s+ |/ |$ a

( T4 X' y( l4 j# f

2、GitHub下载
- V+ Q! [5 y8 N9 f% g( D有的Unity版本是没有PackageManager的,或者PackageManager中没有此插件。 那么我们可以去GitHub下载此插件:传送门

三、插件使用方法介绍
- v8 o; c; y! B5 Z0 ?- N下面介绍如何将Assets中的资源打成AB包。

1、实现导出一个AB包+ ~% h4 X; ]0 j9 B4 U- {
我们以该模型为例,将该模型打成AB包。

5 m: Y! |5 l% n) \5 g' k9 [. }9 B
; Q; S6 V3 A5 i; s' u/ N+ Q( L2 R

' U0 U2 @( L. L% t

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

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


6 O8 |% F1 i; T3 D9 C, ^

5 u7 T0 v5 V8 p/ j
! h3 w% z& S/ r- Z

Ⅱ、AssetBundle Browser界面介绍

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

Configure界面" a7 K4 V" Q" U7 p
我们能看到所有被标记为AssetBundle的文件。


/ \3 @  n5 S; F; H( A8 j
; ?4 }% m* ]: q% y
  k1 f$ z5 i- t) i% O

Build界面
# @! J1 S  F3 @该界面是进行打包的界面。


7 {6 l2 t2 K' h6 N- E" y
  • Build Target:选择发布的平台
  • Output Path:输出路径
  • Clear Folders:构建之前清空文件夹(会把文件夹删除)
  • Copy to StreamingAssets:拷贝至StreamingAssets文件夹
  • Compression:选择压缩格式
    & k6 V+ X1 O' N7 H9 ]- |3 e. D
7 j* Q% V8 f! k! v  r

' A4 B' K: {$ o7 J! w

Inspect界面
: m! E" T2 l4 W+ P: w8 N: F- z- W这个界面会展示已经打成AB包的包内部信息。

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

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

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


* I* B. @$ A% e2 H: I1 f; y; \
* b/ q0 U- w+ D3 H* u5 R5 H4 b
1 j7 b( G# N% N! ^& }2 d# r5 V; T

Ⅲ、完成打包

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

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


5 b" l" W* R# U: w

$ K5 C0 d, f9 _

# t4 |3 \3 a& N0 l& x& R; C, y

2、实现资源复用4 O9 v% O% r7 y8 y6 }; z" W
📢 什么是资源复用  N- o* h2 Z+ P& L* q
在打包的过程中,有很多资源都是重复的。例如:


$ u$ N+ ~% s3 U% R) a
  • 多个预制体使用的同一个模型,预制体只是材质颜色不同。
  • 有图片,被多个预制体使用。; ?5 @2 _9 v7 c% L, r% D* A3 X( X
如果分别打AB包,这样会造成包体过大。/ U$ v; e" ^1 ?5 i( N

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

Ⅰ、一个资源重复的现象
1 e& W8 B! U% f4 h; `4 O% A$ N* X我们实现一个资源重复的现象:

7 q% y. O3 s3 G$ H! g
  • 制作Trigger的复制预制体,新建材质球,替换它的原始材质球。
  • 给该预制体的AssetBundle重命名为tiggernew' {5 S8 U' N, Y+ J- _( y
0 w0 I$ O2 I9 M+ p9 h' A  s

  r2 b9 P7 O( ^  V+ X3 ?

Ⅱ、创建共享AB包/ k7 Y8 s1 l4 G0 |& u* U4 N' u
我们此时再次打开AssetBundle Browser,可以看到很多感叹号。

3 e, h/ C& A. Q9 X. V5 Y# m
  • 左侧预制体的感叹号,代表它们其中有重复的资源
  • 右侧包体内的感叹号,代表是这些资源重复: M  ~; {& |, s( B

. s1 V$ Z! U; n0 ~
+ I7 Z" {9 [* v

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

8 j  I+ w: R8 ]2 h
/ A3 Z4 S( ~, E- S$ R9 ^
将重复资源拖到res包内: 将tiger中的重复资源拖到res包内,我们能看到拖拽完成后,其他ab包内重复的资源也消失了。现在只有一份资源。
! K) {- ^& f8 b! o
+ o: v7 W5 a$ p  w  p+ @

3 J9 t0 c, d; m

& C" l8 J5 [) {) ?2 u: W9 R

Ⅲ、完成打包
/ J0 ?# B8 N6 i1 j5 R+ W同样的操作,点击Build,完成AB包的打包。 此时AB包内容如下:


1 d1 S& k6 M+ q+ [2 _

% m$ d: I5 m5 Q2 R
0 [' F, H5 |" R3 p

四、代码实例化AB包资源
2 ~2 V8 e( S1 {2 P8 w. B# D下面我们完整做完整个流程:使用代码,去加载AB包中的老虎,完成我们的整个测试。

将该脚本挂载在场景中的物体上,运行项目时,便会加载出老虎了!, X5 E/ V9 U% X  Q7 Q. f" Y

  1. using System.IO;
    ) _' d- L. C- f. x& b1 ^
  2. using UnityEngine;<p></p>
    8 i* [& z3 A2 o; ]! j: R+ V4 u
  3. <p style="line-height: 30px; text-indent: 2em;">public class ABTest : MonoBehaviour
    & v1 c% T8 f& a; K
  4. {
    4 A! a' z* W+ `+ ~7 @  e8 l( b5 @5 C
  5.     void Start()/ \* g/ y; C% p( G8 p
  6.     {
    % f$ y0 A- y; u2 H' N$ v( D
  7.         //加载AssetBundle之前,先加载依赖的Bundle0 @: X" r0 p" K2 t
  8.         //字符串"StandaloneWindows",是一个文件。这个文件的名字,是根据打包脚本,打包到哪个文件夹下,这个文件就叫什么名字。
    , L) i. n8 J# Z. {$ {* F. B
  9.         //字符串"AssetBundleManifest",是固定写法。
    . h" F7 d; v9 M" o
  10.         AssetBundle assetBundle =
    , t5 h& B0 r$ K/ R% Z
  11.             AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "StandaloneWindows"));
    1 U0 _1 z7 x3 j* J- a: W6 _9 G
  12.         AssetBundleManifest manifest = assetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");</p>
    6 H. r/ j3 n, ?
  13. <p style="line-height: 30px; text-indent: 2em;">        //字符串"tiger",是你要加载的老虎模型预制体的名字% q/ n, e% O$ p5 H4 G7 t3 l
  14.         foreach (var item in manifest.GetAllDependencies("tiger"))
    ( l" N% S& O; K: }( N
  15.         {
    $ Z2 |/ [. I5 G' g: `  Q
  16.             AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, item));- u6 A# w) W" ]3 u) H" W5 s
  17.         }</p>. f4 r. e  N# s, \: z8 C0 o
  18. <p style="line-height: 30px; text-indent: 2em;">        //------若要加载的文件只是一个视频或者其他,无依赖,可只做下面,直接加载Bundle文件,直接读Bundle即可------//</p>
    % s( K; a6 a8 o% Y
  19. <p style="line-height: 30px; text-indent: 2em;">        //现在便可以加载模型了
    . H9 o+ u6 F/ _+ y% s
  20.         string modelPath = Path.Combine(Application.streamingAssetsPath, "tiger");7 f- n  g/ W& c% _( B  b
  21.         AssetBundle useAb = AssetBundle.LoadFromFile(modelPath);
    8 u0 p, u" D" e. V8 a
  22.         GameObject obj = useAb.LoadAsset<GameObject>("Tiger");</p>
    1 r0 Z: t. H. j! o8 j
  23. <p style="line-height: 30px; text-indent: 2em;">        Instantiate(obj, transform);
    & n  p4 V' j9 ?* H: U# f
  24.     }, m8 Y1 \# w  ^, A
  25. }</p>
复制代码
好啦,这就是本章所有内容 ~- A' u+ S# H* z; D3 I

: N6 k# h$ C: N7 U
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|

GMT+8, 2025-2-25 00:18 , Processed in 0.135100 second(s), 22 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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