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

AssetBundle Browser 教程

[复制链接]

979

主题

90

回帖

5万

积分

管理员

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

一、插件功能
: X7 I2 L! h! X8 O8 s. g6 j0 k1、插件是发布AB包的工具/ G) G0 Y: v0 ]& }
AssetBundle Browse可以将项目中的资源打包成AB包,发布游戏后,项目将通过加载StreamingAssets中AB包的形式,加载所需资源,而不是像之前那样,从Assets中进行加载。

1、AB包是什么/ \1 v; I- \" z( F) R
AB包全名AssetBundle(资源包)。是一种Unity提供的用于存放资源的包。通过将资源分布在不同的AB包中可以最大程度地减少运行时的内存压力,并且可以有选择地加载内容。

2、为什么要用AB包' Q6 I  y' ?. v! @! [& E/ I1 B
Ⅰ、热更新

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

Ⅱ、Resources加载存在问题

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


& w9 }4 i# X+ E. n/ z' D" Z
  • 对内存管理造成一定的负担。
  • 在打开应用时加载时间很长。
  • Resources文件夹下的所有资源统一合并到一个序列化文件中(可以看成统一打一个大包,巨型AB包有什么问题它就有什么问题),对资源优化有一定的限制。5 d2 `  `. v, p' j. w# Y" H; r
因此不建议大量使用Resources。
2 v' \. g6 @+ W$ U0 \

二、安装插件的方式
/ X& C) S; d7 x: s9 C3 J" S1、PackageManager安装
1 E# q6 w0 d) j. C6 H2 @( H橙子测试在Unity2019.3版本中,PackageManager中便有此插件, 同学们可以先看看自己版本的Unity是否可以直接安装。

* }! }/ N1 r2 J; T/ a2 g
$ h8 i) Z* C& k) Y' \6 Z. G/ E4 R
6 Z. B9 e' ^0 H9 |0 \# W

2、GitHub下载
- L1 D* }: F( L有的Unity版本是没有PackageManager的,或者PackageManager中没有此插件。 那么我们可以去GitHub下载此插件:传送门

三、插件使用方法介绍* {- \+ m) Z# D9 p$ }) ~7 @
下面介绍如何将Assets中的资源打成AB包。

1、实现导出一个AB包5 |* }6 Y( J- S) J8 k+ B' x
我们以该模型为例,将该模型打成AB包。

/ |- N$ x  X, ^% Z

; r1 v: K7 ?4 Q
" \! s8 _2 E: z) I! i7 x* E; `9 J

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

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


3 G8 i: V/ }$ S5 D3 ]% j9 x/ |
% n- x5 [! r+ ^* E3 P

1 X# t( f  v; i% R' }3 W$ f9 g

Ⅱ、AssetBundle Browser界面介绍

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

Configure界面( U7 \" j/ W2 L0 X4 G+ `
我们能看到所有被标记为AssetBundle的文件。


2 Y+ _& D4 \3 X4 N  H0 ^; J9 ]

( q; r6 }8 R9 @* L# T/ C9 ?, x

$ f& C2 K% S5 r8 ~6 t5 `: x2 V0 O

Build界面
& h* D2 Q1 c2 e* f该界面是进行打包的界面。


2 ?5 U+ t2 Z+ w
  • Build Target:选择发布的平台
  • Output Path:输出路径
  • Clear Folders:构建之前清空文件夹(会把文件夹删除)
  • Copy to StreamingAssets:拷贝至StreamingAssets文件夹
  • Compression:选择压缩格式! K7 j% H! E  _$ _
5 j$ V! Q9 |" p+ T& Q( @5 M0 E9 z$ ^
0 h: v0 ~* J  C2 E, y8 m

Inspect界面
: |% j! x2 X; d: E* O这个界面会展示已经打成AB包的包内部信息。

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

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

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

6 f0 m4 |2 {7 p8 Q4 v# G' ^% v
6 h( i- C1 S) ?# O! p

; b9 T' P  M, ^/ m

Ⅲ、完成打包

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

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

/ G. T3 H8 B* ?" `3 ]) G4 z3 Q0 F

. R" e# j9 o% u3 B! A/ f7 m

5 |1 r' G! ]. E1 z6 @$ M9 U- b6 ]

2、实现资源复用* t0 L( e, h4 @# u4 k4 X
📢 什么是资源复用  [* p/ x. @$ b8 V3 m% y, M
在打包的过程中,有很多资源都是重复的。例如:


' j: ~' ~5 _- d" e: \0 d) E7 m. x# G
  • 多个预制体使用的同一个模型,预制体只是材质颜色不同。
  • 有图片,被多个预制体使用。. f3 p/ S; a- a1 b
如果分别打AB包,这样会造成包体过大。
( [, q9 B* G2 I( C+ y" B  o

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

Ⅰ、一个资源重复的现象
  J% u5 }' l( a, F2 p0 T我们实现一个资源重复的现象:

" ^) [/ W+ f1 Z# V0 m
  • 制作Trigger的复制预制体,新建材质球,替换它的原始材质球。
  • 给该预制体的AssetBundle重命名为tiggernew  s. \2 f7 }3 n
7 E# ?7 X' M2 M/ y  v! j5 }
3 ?" k9 l" j" u6 I4 p$ }

Ⅱ、创建共享AB包; `7 I0 m8 W% ^+ @9 w- @
我们此时再次打开AssetBundle Browser,可以看到很多感叹号。

. p; M4 d0 K0 u6 ]8 x( j
  • 左侧预制体的感叹号,代表它们其中有重复的资源
  • 右侧包体内的感叹号,代表是这些资源重复9 x  e  O( B$ b9 x9 U- i/ [
1 ]; O* Q5 H7 o( Z" ~! n4 ?7 H
! H. [1 U8 J8 W% e; `" }+ w1 k

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


8 J, z4 B$ w! v  P! p, S' w
5 V6 m# l. D7 ?& E) M2 i8 V
将重复资源拖到res包内: 将tiger中的重复资源拖到res包内,我们能看到拖拽完成后,其他ab包内重复的资源也消失了。现在只有一份资源。3 l: i$ A& y2 C  D

0 E1 [! {- q& M7 I

# U( x. F" J4 z+ \

) y" `+ f. i, N" P  P

Ⅲ、完成打包! z6 L5 H% Y( r/ x3 t
同样的操作,点击Build,完成AB包的打包。 此时AB包内容如下:


1 [$ e9 ^( V, H( U3 u
' n0 m: J" {& v$ O+ c% s7 T
- m% O: h/ B. c, V

四、代码实例化AB包资源
1 Q' X! m/ m3 c下面我们完整做完整个流程:使用代码,去加载AB包中的老虎,完成我们的整个测试。

将该脚本挂载在场景中的物体上,运行项目时,便会加载出老虎了!
$ D6 I/ k/ |: W* H

  1. using System.IO;- t& Y( O7 f5 B- L8 H# k7 a; M
  2. using UnityEngine;<p></p>. m) y' t. i% Y
  3. <p style="line-height: 30px; text-indent: 2em;">public class ABTest : MonoBehaviour
    # N. T' O! s! R5 m& Z: W
  4. {
    ( h8 c, e8 p' x6 ]: G( m
  5.     void Start()1 ]( }; w& S# K3 [. m
  6.     {
    7 Y' r0 c" q2 |: q6 p
  7.         //加载AssetBundle之前,先加载依赖的Bundle
    * d* A8 H2 `) s" a- ]8 l* G
  8.         //字符串"StandaloneWindows",是一个文件。这个文件的名字,是根据打包脚本,打包到哪个文件夹下,这个文件就叫什么名字。
    # s" B# F) V4 {  ~* X1 l+ T
  9.         //字符串"AssetBundleManifest",是固定写法。
    8 w  S$ d9 I. ~! ]+ w
  10.         AssetBundle assetBundle =
    6 r, X& C+ L, x  u! X
  11.             AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "StandaloneWindows"));
    ( h) D4 X8 z5 G: k1 R# A2 t
  12.         AssetBundleManifest manifest = assetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");</p>% N; }7 E/ p& @- U. |
  13. <p style="line-height: 30px; text-indent: 2em;">        //字符串"tiger",是你要加载的老虎模型预制体的名字  d* b! _/ y% A3 n8 f$ P+ J
  14.         foreach (var item in manifest.GetAllDependencies("tiger"))
    ( N4 y' M/ b7 F; c9 l8 s
  15.         {* }* Z5 E+ L5 p0 m! E+ B8 o, x6 I
  16.             AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, item));  h: j" T0 ~5 r: H' Z
  17.         }</p>
    ! t* y+ M) [7 w( T
  18. <p style="line-height: 30px; text-indent: 2em;">        //------若要加载的文件只是一个视频或者其他,无依赖,可只做下面,直接加载Bundle文件,直接读Bundle即可------//</p># S) U9 p0 s9 D6 Y- o
  19. <p style="line-height: 30px; text-indent: 2em;">        //现在便可以加载模型了
    0 C" o# O0 ^% h
  20.         string modelPath = Path.Combine(Application.streamingAssetsPath, "tiger");( ^4 m0 {* k. K3 v; ~/ C* M
  21.         AssetBundle useAb = AssetBundle.LoadFromFile(modelPath);
    2 Q  @' ]6 r2 X% ?
  22.         GameObject obj = useAb.LoadAsset<GameObject>("Tiger");</p>
    # z1 M5 }9 r8 P6 ~, \3 Z- j8 x& u
  23. <p style="line-height: 30px; text-indent: 2em;">        Instantiate(obj, transform);
      C- [7 d! M8 o; |. M
  24.     }
    ; w3 |0 J# B; t! l8 G
  25. }</p>
复制代码
好啦,这就是本章所有内容 ~% j" H: ~$ z# C  c+ m; D

. E) A  W+ n8 v, A4 A, n
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|

GMT+8, 2025-2-25 06:20 , Processed in 0.122209 second(s), 23 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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