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

AssetBundle Browser 教程

[复制链接]

985

主题

92

回帖

5万

积分

管理员

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

一、插件功能, h# u: w% g- e3 Z0 s
1、插件是发布AB包的工具$ ~5 S% A  ~4 P# W! e% t
AssetBundle Browse可以将项目中的资源打包成AB包,发布游戏后,项目将通过加载StreamingAssets中AB包的形式,加载所需资源,而不是像之前那样,从Assets中进行加载。

1、AB包是什么: ]- P  o5 \$ h" {% ~$ J
AB包全名AssetBundle(资源包)。是一种Unity提供的用于存放资源的包。通过将资源分布在不同的AB包中可以最大程度地减少运行时的内存压力,并且可以有选择地加载内容。

2、为什么要用AB包
  ^! v2 Y+ D9 @0 mⅠ、热更新

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

Ⅱ、Resources加载存在问题

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


; I) B8 h, N4 N. [! x5 W3 M
  • 对内存管理造成一定的负担。
  • 在打开应用时加载时间很长。
  • Resources文件夹下的所有资源统一合并到一个序列化文件中(可以看成统一打一个大包,巨型AB包有什么问题它就有什么问题),对资源优化有一定的限制。# T8 a' `) X+ V2 C2 N3 g  q
因此不建议大量使用Resources。0 Z- W; b5 a- c& a6 V$ u( G

二、安装插件的方式/ C8 B$ {- k9 V* h) B
1、PackageManager安装3 h; O: W2 I2 h6 x0 `- o
橙子测试在Unity2019.3版本中,PackageManager中便有此插件, 同学们可以先看看自己版本的Unity是否可以直接安装。


; o) M" @* a+ ~

" [/ C; Q+ @" g' P
% Y" Y. j' u) M; G- d+ Z

2、GitHub下载, O: h* G) f! m7 N8 d
有的Unity版本是没有PackageManager的,或者PackageManager中没有此插件。 那么我们可以去GitHub下载此插件:传送门

三、插件使用方法介绍
( P# c- e8 H5 ?3 }, M! c. y' h下面介绍如何将Assets中的资源打成AB包。

1、实现导出一个AB包; F; [2 ?+ G7 M/ a0 R
我们以该模型为例,将该模型打成AB包。


! L, Q) J$ [. D/ b# l; ?

9 A  G( V) u! j

5 ^, Z& z0 @) K% ~" p% L' P+ F! ^: I

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

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


) R" ~' l: H: {+ r- y

; n6 R& C- }! T: y+ g7 D

0 N$ z/ _( v$ c$ i: e5 f9 ~  p1 e

Ⅱ、AssetBundle Browser界面介绍

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

Configure界面* s8 r1 w' z( g  r
我们能看到所有被标记为AssetBundle的文件。


+ E' @- u# y) P$ z8 h% p( r

, q. s, w2 {6 k. w! p+ e$ U. I% R7 _/ Z" f
- Y, e2 J1 |. c7 I4 l7 p- r3 `" r

Build界面; K; w8 ]6 i1 X: R  \
该界面是进行打包的界面。

# H) J3 J% O" c8 z
  • Build Target:选择发布的平台
  • Output Path:输出路径
  • Clear Folders:构建之前清空文件夹(会把文件夹删除)
  • Copy to StreamingAssets:拷贝至StreamingAssets文件夹
  • Compression:选择压缩格式
    % l4 e6 E0 [& V/ m9 k4 L1 i* P& e

3 ^  X* q8 o( S: E

2 k1 W2 o8 F7 N5 K- [* P3 }

Inspect界面
3 F# [2 g/ i$ f这个界面会展示已经打成AB包的包内部信息。

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

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

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

7 J' V3 P" P$ n- C$ K" @
3 y) Q; m. U6 c

1 }0 f$ _/ ]: n% Z

Ⅲ、完成打包

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

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


. ~" X) [3 _. [( N, f/ Z
1 p; p  X6 z% u" Q6 c1 Y" X/ Y
& h- o3 e. z8 h% v: A' Q' c

2、实现资源复用& n+ h  m4 I- T1 A3 ^) G; ]
📢 什么是资源复用
- R& v; b. g2 ^在打包的过程中,有很多资源都是重复的。例如:


0 K$ L) Y9 F! n( @5 J
  • 多个预制体使用的同一个模型,预制体只是材质颜色不同。
  • 有图片,被多个预制体使用。; f! V6 Q( o( u, b' j7 F
如果分别打AB包,这样会造成包体过大。
: ~8 G, p+ f) u! Y% `* t' r

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

Ⅰ、一个资源重复的现象0 }3 x0 u( z5 o; C1 H. Z& w
我们实现一个资源重复的现象:


& k. x# Y8 q$ k, R( G; V# E
  • 制作Trigger的复制预制体,新建材质球,替换它的原始材质球。
  • 给该预制体的AssetBundle重命名为tiggernew
    $ o2 v  |2 n  }+ F

- P( J/ w$ Z, ^" K* g) l3 T5 D
# P6 i7 W& L0 T7 f$ i) p% {

Ⅱ、创建共享AB包, W" A) e% w1 r* ?$ ^; U
我们此时再次打开AssetBundle Browser,可以看到很多感叹号。


4 B! E2 [* m: E; e
  • 左侧预制体的感叹号,代表它们其中有重复的资源
  • 右侧包体内的感叹号,代表是这些资源重复, i) I" P  Z5 n$ M) T- H
) F5 u- L( Z+ u/ E: G% `
- s2 k5 J  I; D6 N& H% V; B

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

$ F- N$ s' {1 r
8 y. [9 c; g# s) s& j9 s) E
将重复资源拖到res包内: 将tiger中的重复资源拖到res包内,我们能看到拖拽完成后,其他ab包内重复的资源也消失了。现在只有一份资源。3 e5 z9 p) i0 x0 S8 A! [

2 ]' k# H* Z  Q
' j, [$ F* u9 j& u' Q
8 N1 h9 Z6 o% J" y

Ⅲ、完成打包
1 R0 j4 B! i$ p* U/ b' J同样的操作,点击Build,完成AB包的打包。 此时AB包内容如下:

/ Y+ ]2 Z5 y% l1 }% n
# b0 W2 P' T: {$ @' m

, h8 x6 K+ {# H6 k

四、代码实例化AB包资源1 p8 B6 x# G6 y0 U. R
下面我们完整做完整个流程:使用代码,去加载AB包中的老虎,完成我们的整个测试。

将该脚本挂载在场景中的物体上,运行项目时,便会加载出老虎了!& m/ e8 r! }. T( ^6 i: |

  1. using System.IO;
    " I' O0 o. j4 }9 r. i
  2. using UnityEngine;<p></p>
    % o, K' i+ ~" |; E
  3. <p style="line-height: 30px; text-indent: 2em;">public class ABTest : MonoBehaviour8 e$ a8 [4 Y# o/ c
  4. {' O3 C" _3 `0 u' e
  5.     void Start()
    1 W6 A2 z" t3 H, L3 L
  6.     {
    ( X' V9 r8 C! G1 a, ]! \
  7.         //加载AssetBundle之前,先加载依赖的Bundle- [0 G; F+ B6 w
  8.         //字符串"StandaloneWindows",是一个文件。这个文件的名字,是根据打包脚本,打包到哪个文件夹下,这个文件就叫什么名字。  g) ^2 J7 @% J1 r9 X
  9.         //字符串"AssetBundleManifest",是固定写法。' x4 B5 R1 C0 Q- K* W2 [. {
  10.         AssetBundle assetBundle =; ^8 A0 }+ T+ V! J
  11.             AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "StandaloneWindows"));
    1 {5 Z: }; i7 Y" Y/ H8 G% E$ ^
  12.         AssetBundleManifest manifest = assetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");</p>
    : b6 i  u; O3 L( ^2 p
  13. <p style="line-height: 30px; text-indent: 2em;">        //字符串"tiger",是你要加载的老虎模型预制体的名字7 P" W; {" J: U: ~- q7 M& p$ {8 A
  14.         foreach (var item in manifest.GetAllDependencies("tiger"))
    3 Y0 A8 y, d& J  F! F5 a  m
  15.         {
      u& J& }; N8 d
  16.             AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, item));8 a& A: d4 s5 ~( q6 k5 Z, D" K+ i' H
  17.         }</p>
    $ {. o# ~6 [. I$ f
  18. <p style="line-height: 30px; text-indent: 2em;">        //------若要加载的文件只是一个视频或者其他,无依赖,可只做下面,直接加载Bundle文件,直接读Bundle即可------//</p>% x+ N: R5 z) ]/ A/ L
  19. <p style="line-height: 30px; text-indent: 2em;">        //现在便可以加载模型了% H4 h# x2 u7 S
  20.         string modelPath = Path.Combine(Application.streamingAssetsPath, "tiger");; [. ]: Y) u. b
  21.         AssetBundle useAb = AssetBundle.LoadFromFile(modelPath);9 r, J: |/ q, e) w3 @
  22.         GameObject obj = useAb.LoadAsset<GameObject>("Tiger");</p>
    , z! S8 q/ z  b0 E3 W+ x7 A
  23. <p style="line-height: 30px; text-indent: 2em;">        Instantiate(obj, transform);# m6 q2 Y" Y$ P3 w: y4 D' G  B
  24.     }
    / j' F: R" ?8 ^
  25. }</p>
复制代码
好啦,这就是本章所有内容 ~; B) f- f2 \1 \; P3 I; x

' T' @$ U+ {  H* k4 ^+ @( c
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|

GMT+8, 2025-11-5 01:54 AM , Processed in 0.107840 second(s), 23 queries .

Powered by xyh-moon X3.5

© 2001-2025 Discuz! Team.

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