找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 251|回复: 0

AssetBundle Browser 教程

[复制链接]

983

主题

83

回帖

5万

积分

管理员

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

一、插件功能
$ _, J9 b, V4 y3 c4 h1 X1、插件是发布AB包的工具
0 J( `2 W* C7 z2 E  W0 TAssetBundle Browse可以将项目中的资源打包成AB包,发布游戏后,项目将通过加载StreamingAssets中AB包的形式,加载所需资源,而不是像之前那样,从Assets中进行加载。

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

2、为什么要用AB包
7 Y4 R* k0 @2 ZⅠ、热更新

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

Ⅱ、Resources加载存在问题

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

0 K# N& ?" E! P: n4 V
  • 对内存管理造成一定的负担。
  • 在打开应用时加载时间很长。
  • Resources文件夹下的所有资源统一合并到一个序列化文件中(可以看成统一打一个大包,巨型AB包有什么问题它就有什么问题),对资源优化有一定的限制。
    5 p' ^4 s- E2 Y: r/ z! G
因此不建议大量使用Resources。
: C' l3 ^7 n0 c

二、安装插件的方式& t2 q% L0 [3 z8 ?# g
1、PackageManager安装
0 `9 l/ R( P' A! `5 l* l8 ?橙子测试在Unity2019.3版本中,PackageManager中便有此插件, 同学们可以先看看自己版本的Unity是否可以直接安装。


( T& |7 R  ]. V1 w- h+ q' ]
+ ]) ~% C6 `( L7 S9 Z. c

3 o% d2 P9 l  d9 ]1 S

2、GitHub下载4 _  q0 e" `2 h( j7 h1 ~- f
有的Unity版本是没有PackageManager的,或者PackageManager中没有此插件。 那么我们可以去GitHub下载此插件:传送门

三、插件使用方法介绍
+ A# A7 p$ t" v, a下面介绍如何将Assets中的资源打成AB包。

1、实现导出一个AB包* n; a  b1 _3 C/ _2 R0 O: p" }
我们以该模型为例,将该模型打成AB包。


& k# l' R7 M! _) e, V5 L
3 I! g$ f+ _9 g

/ Y2 D1 H  q% x

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

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


$ P/ ^9 G9 D* |2 P* c1 a, m4 }5 t
* `: [0 W& l3 i6 M$ e# i; d
! P2 \" z! {% r4 u- K7 Z& z7 Z

Ⅱ、AssetBundle Browser界面介绍

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

Configure界面3 u% v) X$ S; s) a, B5 B
我们能看到所有被标记为AssetBundle的文件。


5 R& q* Y4 u; p) ^* b

4 J( h0 R: R% T
* Z% N) [0 _8 d4 f8 {- Y+ j

Build界面
; Q$ Q/ |' C8 S$ q该界面是进行打包的界面。

& _0 g# j9 G1 y- a
  • Build Target:选择发布的平台
  • Output Path:输出路径
  • Clear Folders:构建之前清空文件夹(会把文件夹删除)
  • Copy to StreamingAssets:拷贝至StreamingAssets文件夹
  • Compression:选择压缩格式- }. q* @, z$ h+ n. w

+ f: G9 Q4 n* G% s9 e6 t5 t

% g2 A$ d7 j7 |3 Y) s! f

Inspect界面
# B7 M2 Q1 a4 i% V) q这个界面会展示已经打成AB包的包内部信息。

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

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

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

, q0 p+ h* C' n' g
% g5 d/ r" v8 T) _: V9 t3 Q" o7 J2 G/ Z

; m' _2 |1 p5 h* D

Ⅲ、完成打包

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

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

+ w6 [8 k6 u# Z9 k; v, K5 F

& b$ r) O7 H( |# i3 O
9 o9 g5 c) E4 X% u2 g4 |% F

2、实现资源复用
* g4 r. N0 `% H' G$ |1 I. q📢 什么是资源复用
, Q% d' }0 Z; q% s3 k- ~在打包的过程中,有很多资源都是重复的。例如:


5 ?6 G+ P: P1 w; b  n) {
  • 多个预制体使用的同一个模型,预制体只是材质颜色不同。
  • 有图片,被多个预制体使用。( A. H) B3 Y: K$ v) ~  d
如果分别打AB包,这样会造成包体过大。* W" Z7 C6 R" Q- H, v% f; v, ?$ B

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

Ⅰ、一个资源重复的现象1 q+ Y% Y; ~! W$ C
我们实现一个资源重复的现象:


5 D5 x" K  x3 d4 [! b
  • 制作Trigger的复制预制体,新建材质球,替换它的原始材质球。
  • 给该预制体的AssetBundle重命名为tiggernew
    & z6 E6 b; a2 o- m3 j- c

- I: u9 \0 ^4 Y& H; a" e

/ t; y: B7 M; J2 n* ]8 v

Ⅱ、创建共享AB包: E( e5 E! l6 _6 i
我们此时再次打开AssetBundle Browser,可以看到很多感叹号。


0 U$ Q, @, `. k
  • 左侧预制体的感叹号,代表它们其中有重复的资源
  • 右侧包体内的感叹号,代表是这些资源重复
    1 x1 M4 N& k" P9 [' j  x
- x, _! w! {* g6 F- a* e  H

; U4 p- u1 v( w4 d8 ?5 [

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

" w; ^9 R6 p( A
  J9 b/ S4 q. j
将重复资源拖到res包内: 将tiger中的重复资源拖到res包内,我们能看到拖拽完成后,其他ab包内重复的资源也消失了。现在只有一份资源。
3 Q/ a7 X- w3 u" C2 _4 F
9 B: X2 p2 Z& g. e

( T) f' _' C- z
+ i; l3 u" G* h7 t! D& d5 k$ u

Ⅲ、完成打包( {& U3 x* A8 C. p
同样的操作,点击Build,完成AB包的打包。 此时AB包内容如下:


/ R4 X/ }/ A( q1 \0 ~" p( S

1 m7 Q* r& K. S1 S  b3 U

0 ^& V2 E$ d- L8 C$ o  K

四、代码实例化AB包资源
7 d# ]% A" v; z6 s1 s$ E下面我们完整做完整个流程:使用代码,去加载AB包中的老虎,完成我们的整个测试。

将该脚本挂载在场景中的物体上,运行项目时,便会加载出老虎了!' b0 d1 n7 ]& j  @7 R# j

  1. using System.IO;
    4 g) y7 A: R% @8 @
  2. using UnityEngine;<p></p>
    / H+ J( q$ I& g. H% w# L
  3. <p style="line-height: 30px; text-indent: 2em;">public class ABTest : MonoBehaviour
    : L/ @) {* {  B9 ^4 c! D% {
  4. {3 p- M4 Q6 C* f& ]7 l1 K
  5.     void Start()
    ; a* ?1 o2 t8 S9 \( w  }" [& M
  6.     {
    ( {2 M4 |# J; z% Q8 M
  7.         //加载AssetBundle之前,先加载依赖的Bundle
    . I4 G1 b: F, c
  8.         //字符串"StandaloneWindows",是一个文件。这个文件的名字,是根据打包脚本,打包到哪个文件夹下,这个文件就叫什么名字。
    0 a( Z  C& n* A- G, q3 l
  9.         //字符串"AssetBundleManifest",是固定写法。
    5 Y: S4 e- R# r  ]3 T
  10.         AssetBundle assetBundle =
    6 B, ?) T0 u& r5 C
  11.             AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "StandaloneWindows"));
    $ @& a. ?8 T: G, b. {5 X
  12.         AssetBundleManifest manifest = assetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");</p>
    % {- F. A$ ^1 r3 t$ n
  13. <p style="line-height: 30px; text-indent: 2em;">        //字符串"tiger",是你要加载的老虎模型预制体的名字
    ( l& a7 P8 m. o6 o7 P
  14.         foreach (var item in manifest.GetAllDependencies("tiger"))
    + P- j& r) z( w. H2 o7 G
  15.         {! O0 U9 t/ x* T. ~
  16.             AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, item));# k& |8 {/ Y! x# c. V+ q" O& A8 A
  17.         }</p>, E  K0 K, E4 {* e  G, B. I
  18. <p style="line-height: 30px; text-indent: 2em;">        //------若要加载的文件只是一个视频或者其他,无依赖,可只做下面,直接加载Bundle文件,直接读Bundle即可------//</p>5 m4 Q% v! A) g  G! {
  19. <p style="line-height: 30px; text-indent: 2em;">        //现在便可以加载模型了
    ( P9 p- s( S$ x
  20.         string modelPath = Path.Combine(Application.streamingAssetsPath, "tiger");( Y# K7 H5 t2 }0 i% h; Z! U6 g  n
  21.         AssetBundle useAb = AssetBundle.LoadFromFile(modelPath);8 h. \4 U' P) ?
  22.         GameObject obj = useAb.LoadAsset<GameObject>("Tiger");</p>- X2 |9 O) ]; a/ R" U
  23. <p style="line-height: 30px; text-indent: 2em;">        Instantiate(obj, transform);" a& [: X! z# _( K
  24.     }
    + J3 B- F5 x' X
  25. }</p>
复制代码
好啦,这就是本章所有内容 ~
2 @, s. O; a* i# k$ \8 q
: Q6 ^9 }4 d3 G! A- B( W/ I1 B; Y
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|返回首页

GMT+8, 2024-12-23 20:52 , Processed in 0.106457 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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