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

AssetBundle Browser 教程

[复制链接]

991

主题

92

回帖

5万

积分

管理员

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

一、插件功能% G+ ?8 E4 b( x1 {. I( ~  u/ |
1、插件是发布AB包的工具
$ C6 v2 f% B  Z; U: MAssetBundle Browse可以将项目中的资源打包成AB包,发布游戏后,项目将通过加载StreamingAssets中AB包的形式,加载所需资源,而不是像之前那样,从Assets中进行加载。

1、AB包是什么/ Y8 S, p0 j* b' {" q. q5 t+ T
AB包全名AssetBundle(资源包)。是一种Unity提供的用于存放资源的包。通过将资源分布在不同的AB包中可以最大程度地减少运行时的内存压力,并且可以有选择地加载内容。

2、为什么要用AB包/ {, V% f  E2 b4 U
Ⅰ、热更新

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

Ⅱ、Resources加载存在问题

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


) G3 k5 n6 `3 V6 V4 Y+ v' R
  • 对内存管理造成一定的负担。
  • 在打开应用时加载时间很长。
  • Resources文件夹下的所有资源统一合并到一个序列化文件中(可以看成统一打一个大包,巨型AB包有什么问题它就有什么问题),对资源优化有一定的限制。9 X5 s( }+ p0 b# b- k8 i/ Y
因此不建议大量使用Resources。  D# [( _$ Y, R! y  s7 e$ f, j

二、安装插件的方式! i4 r1 ?7 r3 j; x
1、PackageManager安装! h( h; E" N& u7 s7 _
橙子测试在Unity2019.3版本中,PackageManager中便有此插件, 同学们可以先看看自己版本的Unity是否可以直接安装。

! J8 r. `! m% D" u

) N  D+ C, x) H  I' q6 }
7 l5 O( u$ Y: o" @: V% @5 T

2、GitHub下载
  T, Z/ [: W  U# e( T有的Unity版本是没有PackageManager的,或者PackageManager中没有此插件。 那么我们可以去GitHub下载此插件:传送门

三、插件使用方法介绍+ F: I; R$ g! Z% a& Z/ R( v
下面介绍如何将Assets中的资源打成AB包。

1、实现导出一个AB包
% }) ]& w" t- Z  z: E  B# M我们以该模型为例,将该模型打成AB包。

% }) E$ z: k! ^3 }' O: W' g: V

9 ~4 g* c' S8 D
( j$ c% Y7 }# r% {7 I* ~

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

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


( v" p6 l5 P$ G" m
' P; ~6 o2 W& Q9 C, {# \7 i: Z
. w! Z- A2 |1 `/ @

Ⅱ、AssetBundle Browser界面介绍

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

Configure界面8 p2 G" m4 G6 X
我们能看到所有被标记为AssetBundle的文件。

: p# w& c0 h+ e, p

0 u. u+ M# a( U$ N: H2 t* h
5 }; v$ m1 N, v0 Q' a

Build界面
" B7 S+ h8 R3 i' j/ p6 h7 X* S该界面是进行打包的界面。

2 d5 |* k3 A1 }) l2 J4 c
  • Build Target:选择发布的平台
  • Output Path:输出路径
  • Clear Folders:构建之前清空文件夹(会把文件夹删除)
  • Copy to StreamingAssets:拷贝至StreamingAssets文件夹
  • Compression:选择压缩格式" W0 q# b( \0 e  g7 i7 D

7 c9 D9 M6 s4 K, y

2 X3 ^5 T: `, C/ p% j5 P; {

Inspect界面
. ~- [$ p. {( L9 _这个界面会展示已经打成AB包的包内部信息。

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

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

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

+ E  M* G) X$ l$ ~3 k: Z3 y8 F4 g

; Y! P9 Q* a; l4 }% x. h+ f

; X7 J7 i( N7 T/ T" b2 {9 F

Ⅲ、完成打包

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

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


' [  i9 D" j6 c- Y7 M% _
0 {$ s" J; y! C1 R2 k( T: x" _& Y! G

# S  J6 v9 f- L% E; E# ~

2、实现资源复用
+ a4 e1 b: \" x2 k0 b📢 什么是资源复用1 S) t; A: H" j7 h& K3 V
在打包的过程中,有很多资源都是重复的。例如:


' b$ |! L, y! t$ f! d, ~2 ?
  • 多个预制体使用的同一个模型,预制体只是材质颜色不同。
  • 有图片,被多个预制体使用。
    9 i0 M8 z! ]9 y6 C
如果分别打AB包,这样会造成包体过大。* x4 [! E% U6 _" v9 S- D

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

Ⅰ、一个资源重复的现象9 M' {( c- @/ P0 W3 N
我们实现一个资源重复的现象:

$ N: g8 L$ _  ^8 G, W7 {# z
  • 制作Trigger的复制预制体,新建材质球,替换它的原始材质球。
  • 给该预制体的AssetBundle重命名为tiggernew( [0 l) X2 X4 T% `) E
% W8 S. }( s3 c. P" t8 W

) y3 N# [$ k  h3 \) i% |

Ⅱ、创建共享AB包
9 D( [4 D/ r: Q/ x7 u( ?' y1 W8 v我们此时再次打开AssetBundle Browser,可以看到很多感叹号。

: n' N' e+ _( w% G% c: H) C5 R, a
  • 左侧预制体的感叹号,代表它们其中有重复的资源
  • 右侧包体内的感叹号,代表是这些资源重复* O- p1 ]+ W. B; s8 ~1 W

+ a, B% V6 Z7 f( m: _9 h$ D
4 P! X! e% d0 m: t# h: y' S

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

1 V; k# `1 ^6 U5 T+ N( X( ]

( ~. z% \/ m" K1 v# A+ G# D
将重复资源拖到res包内: 将tiger中的重复资源拖到res包内,我们能看到拖拽完成后,其他ab包内重复的资源也消失了。现在只有一份资源。4 J0 E7 O. A$ R% I  c# A+ `1 C
* b: J4 B  H( ]
( M$ O9 S% C! v( t7 A  I4 c

1 j* i6 I$ Y" G! d2 h

Ⅲ、完成打包
2 c* y/ t; ?3 e) A) x4 P+ x5 T- j同样的操作,点击Build,完成AB包的打包。 此时AB包内容如下:


! j+ J( e& O7 C7 {( r
' h) f8 T/ f8 M. f

3 [  i8 y, E! b! J3 `5 i

四、代码实例化AB包资源! k: n3 T1 c+ X' |& S" b& m
下面我们完整做完整个流程:使用代码,去加载AB包中的老虎,完成我们的整个测试。

将该脚本挂载在场景中的物体上,运行项目时,便会加载出老虎了!" a( P2 ]4 k/ n* ]! u9 D. c& o) o

  1. using System.IO;
    & T3 a" }( ?! H) {& s1 F
  2. using UnityEngine;<p></p>+ [, }0 s9 v) \9 Z. l
  3. <p style="line-height: 30px; text-indent: 2em;">public class ABTest : MonoBehaviour
    " v1 P$ b7 T' ~9 m
  4. {
    1 V' z; I1 {6 ~0 R; U
  5.     void Start()7 f  I% t$ B; z( S
  6.     {
    . z. z- k7 P$ F0 v( A4 o
  7.         //加载AssetBundle之前,先加载依赖的Bundle& B+ X+ y3 g/ A# t& Y
  8.         //字符串"StandaloneWindows",是一个文件。这个文件的名字,是根据打包脚本,打包到哪个文件夹下,这个文件就叫什么名字。
    7 l* i$ \; ~" r; l1 g  G+ _
  9.         //字符串"AssetBundleManifest",是固定写法。
    0 ]' F4 B  q7 j7 l
  10.         AssetBundle assetBundle =
    ( M: K, Z3 D4 g# e
  11.             AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "StandaloneWindows"));8 D/ E% u1 Q/ v/ o- b+ Z
  12.         AssetBundleManifest manifest = assetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");</p>
    1 H; I0 J. g6 X. H
  13. <p style="line-height: 30px; text-indent: 2em;">        //字符串"tiger",是你要加载的老虎模型预制体的名字
    . q' y& w7 P! n/ C! W% D" @. Z
  14.         foreach (var item in manifest.GetAllDependencies("tiger"))( @# ~1 n7 P- R/ w
  15.         {3 a- W! `' Z1 f; d
  16.             AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, item));
    ' h6 O- }9 P; V8 T2 O+ O8 I5 N! a
  17.         }</p>
    ! k6 v: L. @* ^7 _- T  k" U) y4 A
  18. <p style="line-height: 30px; text-indent: 2em;">        //------若要加载的文件只是一个视频或者其他,无依赖,可只做下面,直接加载Bundle文件,直接读Bundle即可------//</p>
    / Y) o% a3 f, ~0 u& l% A- t
  19. <p style="line-height: 30px; text-indent: 2em;">        //现在便可以加载模型了7 c4 K/ o: M+ ]5 g) F! }0 ^
  20.         string modelPath = Path.Combine(Application.streamingAssetsPath, "tiger");2 k$ g6 V) w: U- e$ ?" C3 x7 o
  21.         AssetBundle useAb = AssetBundle.LoadFromFile(modelPath);3 d; p/ r# l5 r4 H/ k7 F
  22.         GameObject obj = useAb.LoadAsset<GameObject>("Tiger");</p>8 H) H: r9 @; t( g' e. ?& Y4 P6 @$ j* t
  23. <p style="line-height: 30px; text-indent: 2em;">        Instantiate(obj, transform);3 p+ s8 F8 _- ^3 i7 |
  24.     }
    ! F1 b2 c3 w5 n. ~) r0 _, K
  25. }</p>
复制代码
好啦,这就是本章所有内容 ~( F( a3 c1 r1 |+ ^  y. y

- D$ C6 T3 z$ G3 j+ A. s
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|

GMT+8, 2026-8-5 10:19 AM , Processed in 0.074568 second(s), 23 queries .

Powered by xyh-moon X3.5

© 2001-2026 Discuz! Team.

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