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

AssetBundle Browser 教程

[复制链接]

989

主题

92

回帖

5万

积分

管理员

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

一、插件功能$ S; p, l/ A, {3 t" ?
1、插件是发布AB包的工具! L+ j2 t: k, _
AssetBundle Browse可以将项目中的资源打包成AB包,发布游戏后,项目将通过加载StreamingAssets中AB包的形式,加载所需资源,而不是像之前那样,从Assets中进行加载。

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

2、为什么要用AB包
" t$ j  `* K# i( k, h/ xⅠ、热更新

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

Ⅱ、Resources加载存在问题

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

$ e2 r2 ?5 _& C9 W; A! A2 q
  • 对内存管理造成一定的负担。
  • 在打开应用时加载时间很长。
  • Resources文件夹下的所有资源统一合并到一个序列化文件中(可以看成统一打一个大包,巨型AB包有什么问题它就有什么问题),对资源优化有一定的限制。2 s/ ?, m" E- t. p
因此不建议大量使用Resources。* p/ `  Q0 {/ Q5 E8 s

二、安装插件的方式; G9 @4 A) r' s+ u" X
1、PackageManager安装
( i. b7 W, d  m: S! R" v3 |橙子测试在Unity2019.3版本中,PackageManager中便有此插件, 同学们可以先看看自己版本的Unity是否可以直接安装。


6 q- L  D! O/ M8 _& T
6 n4 u, D+ L2 `% c9 `  _7 t% G: J

2 a" N, c1 m5 {* M

2、GitHub下载% D2 ]5 j# M7 R: a7 p! c; D
有的Unity版本是没有PackageManager的,或者PackageManager中没有此插件。 那么我们可以去GitHub下载此插件:传送门

三、插件使用方法介绍
5 V. y+ @$ \' N/ E下面介绍如何将Assets中的资源打成AB包。

1、实现导出一个AB包
/ @- U9 q- y8 f$ K4 T/ d7 y我们以该模型为例,将该模型打成AB包。


# u( s1 M3 p! |; a" {6 V, U9 [5 i+ a

3 |# C# B" c% u) q6 _) i

% G# D7 B+ ^1 b

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

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


3 J9 T+ D! C+ K! l

' r6 {9 ^7 _6 g# ?. i. b

* Z8 X8 P1 x4 [

Ⅱ、AssetBundle Browser界面介绍

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

Configure界面
+ l6 M; R0 S! B, y. d/ T1 b我们能看到所有被标记为AssetBundle的文件。

6 u- z) @4 D6 V$ x9 N+ g
" `2 \+ e- Z. R) C( n  H+ R
$ g- j8 s9 M  a2 I1 e( s5 ?$ Z

Build界面% [  `6 T# e: Y
该界面是进行打包的界面。

: o9 N0 P% U+ S& y* G) P
  • Build Target:选择发布的平台
  • Output Path:输出路径
  • Clear Folders:构建之前清空文件夹(会把文件夹删除)
  • Copy to StreamingAssets:拷贝至StreamingAssets文件夹
  • Compression:选择压缩格式$ e" q% v# P& }$ ?
: ^2 ^  q+ x4 |9 b- [2 M' X6 j

1 V- ?0 k' n% T4 H

Inspect界面7 y5 m7 q# B! @8 J
这个界面会展示已经打成AB包的包内部信息。

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

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

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


" E% M) B3 V, H& m5 ~$ F1 x

/ m: h7 m! u9 J" j2 r2 ]

7 r& V+ b' H! e0 V  f

Ⅲ、完成打包

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

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


; M6 |8 q9 |' I& p' l& ~; @5 y1 j& l
' ^$ b0 p' w" x; Y4 Q0 O
, X, p* P/ ~# T5 E% G; y

2、实现资源复用
% N% t% j# w2 y& y: J& J📢 什么是资源复用: d" [, H2 h& F- F7 t; t
在打包的过程中,有很多资源都是重复的。例如:


2 ^! v0 O% @+ }. G3 C
  • 多个预制体使用的同一个模型,预制体只是材质颜色不同。
  • 有图片,被多个预制体使用。
    3 ?! a/ g( @# ]/ V! C* [. a6 V
如果分别打AB包,这样会造成包体过大。4 H/ t! q, E: u5 u0 }

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

Ⅰ、一个资源重复的现象
8 [1 f1 t' e7 s& \- R- F7 t我们实现一个资源重复的现象:


" D9 k* E: i& F
  • 制作Trigger的复制预制体,新建材质球,替换它的原始材质球。
  • 给该预制体的AssetBundle重命名为tiggernew
    + u! N' n& o2 r4 T+ u0 X) k, {  O

* u& [7 K+ \9 Y: L# x

" J6 v! s; d: E5 C* i

Ⅱ、创建共享AB包
7 D+ w2 ]7 N$ t. h$ }我们此时再次打开AssetBundle Browser,可以看到很多感叹号。


0 e$ `$ E9 `7 }9 n
  • 左侧预制体的感叹号,代表它们其中有重复的资源
  • 右侧包体内的感叹号,代表是这些资源重复* U3 a/ `" f% p) D* B1 F
  c; f+ f8 v! U, ^: q

' x' ^9 ^* \7 e" D  K) C: z3 i

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


/ N5 a# s2 ^- \2 C6 @6 G$ w, V

$ k  d- _0 \: f3 E+ J* o$ |1 e3 e$ ~
将重复资源拖到res包内: 将tiger中的重复资源拖到res包内,我们能看到拖拽完成后,其他ab包内重复的资源也消失了。现在只有一份资源。
5 @0 z2 J" H% Y- Z9 F) ~8 Q) Z0 Z( K9 C6 u7 m' y+ c6 N
8 h8 [2 [4 `- X; [$ `4 j
: G! ~* I7 m8 B9 |3 r9 F, r

Ⅲ、完成打包1 k& n% A5 U3 `
同样的操作,点击Build,完成AB包的打包。 此时AB包内容如下:


/ I) N/ I) b) D5 H: y& r! i
" @! h$ r$ A% W1 e6 k3 V/ p

. D- i9 S2 y$ G0 u# K) y

四、代码实例化AB包资源( {! w- I1 @/ V9 e
下面我们完整做完整个流程:使用代码,去加载AB包中的老虎,完成我们的整个测试。

将该脚本挂载在场景中的物体上,运行项目时,便会加载出老虎了!
" Z! d& z; t, W5 ?: p* ^/ R* n

  1. using System.IO;
    - v& h4 K" P1 n  E- A: T0 A3 G. y6 P! F
  2. using UnityEngine;<p></p>2 P! E9 G* T/ x: _& m
  3. <p style="line-height: 30px; text-indent: 2em;">public class ABTest : MonoBehaviour
    ' e3 ?) u1 x5 F/ E: J& D6 D, F
  4. {  m1 p# I* m* ?) S! ~
  5.     void Start()
    6 K( X$ P7 N3 _& u3 n4 g4 n
  6.     {4 b# ^1 L! @/ y" c3 S$ Z6 |
  7.         //加载AssetBundle之前,先加载依赖的Bundle" \" s4 u) v( I( l
  8.         //字符串"StandaloneWindows",是一个文件。这个文件的名字,是根据打包脚本,打包到哪个文件夹下,这个文件就叫什么名字。
    ( i( J' N- z) g
  9.         //字符串"AssetBundleManifest",是固定写法。: C+ l2 i: L) {
  10.         AssetBundle assetBundle =
    : }4 v9 T4 ]8 |
  11.             AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "StandaloneWindows"));" P% B$ ]0 e" j! `9 p
  12.         AssetBundleManifest manifest = assetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");</p>
    , W: Q0 u. E1 b  Y+ O
  13. <p style="line-height: 30px; text-indent: 2em;">        //字符串"tiger",是你要加载的老虎模型预制体的名字
    6 f7 u7 C: N, s9 Y3 a# [6 A' N
  14.         foreach (var item in manifest.GetAllDependencies("tiger"))+ _& l1 f, G  i
  15.         {& e8 O: c. v9 d! s1 f
  16.             AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, item));9 E; w+ }( C( A( a9 A
  17.         }</p>
    : `' K/ C, h9 z, |
  18. <p style="line-height: 30px; text-indent: 2em;">        //------若要加载的文件只是一个视频或者其他,无依赖,可只做下面,直接加载Bundle文件,直接读Bundle即可------//</p>+ D$ S0 a5 g/ i" _# {0 d2 ?
  19. <p style="line-height: 30px; text-indent: 2em;">        //现在便可以加载模型了, O5 N' G/ J8 J9 `9 R8 j
  20.         string modelPath = Path.Combine(Application.streamingAssetsPath, "tiger");6 n; T' f6 z& b. s: V
  21.         AssetBundle useAb = AssetBundle.LoadFromFile(modelPath);& Z" F2 x# L- T1 j& E1 \$ F
  22.         GameObject obj = useAb.LoadAsset<GameObject>("Tiger");</p>
    ! C* U) i) d7 G
  23. <p style="line-height: 30px; text-indent: 2em;">        Instantiate(obj, transform);  e" U% ]6 F2 l* ^+ [# {3 u# g" L0 p
  24.     }
    ) P" H  S& X% V; O9 J
  25. }</p>
复制代码
好啦,这就是本章所有内容 ~
* P( M9 L- w7 L( S( [2 _+ w% K6 U( @1 Y1 x4 [- J# H& @
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|

GMT+8, 2026-5-6 08:39 AM , Processed in 0.077110 second(s), 23 queries .

Powered by xyh-moon X3.5

© 2001-2025 Discuz! Team.

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