AssetBundle如何打包

AssetBundle是什么?

AssetBundle是一个存档文件,包含可运行时加载特定于平台的资源(模型、纹理、预制体、场景)

AssetBundle可以表达彼此之间的依赖关系,AssetBundle A中的材质可以引用AssetBundle B中的纹理

为通过网络进行有效传递,可以根据用例要求选用内置算法来压缩(LZMA,LZ4

 LZMA算法:压缩的包更小,加载时间更长。使用之前需要整体解压。一旦被解压,这个包会使用LZ4重新压缩。这时候使                       用资源的时候不需要整体解压。         

 LZ4算法:加载时间与不压缩相近,使用前不用整体解压。

1.用于可下载内容,减小初始安装大小

2.加载针对于最终用户平台优化的资源,减轻运行时内存压力

3.需要更新一些简单的东西,如节日活动的UI需要更改之类的,可以使用AssetBundle包去更新而不需要用户重新下载游戏

AssetBundle中有什么?

包含磁盘上的实际文件,称为AssetBundle存档,可以视为一个容器,可以在其中包含其他的文件。这些文件分为两类:

1.serialized file(序列化文件):资源被打碎放在一个对象中,最后统一被写进一个单独的文件(只有一个)

resource files(源文件):资源文件只是为某些资源(纹理,音频)单独存储的二进制数据块,允许我们有效地在另一个线程上从磁盘上加载它们

2.AssetBundle对象:通过代码从一个特定的压缩包中加载出来的对象,此对象包含了所有我们当初添加到这个压缩包里面的内容,我们可以通过这个对象加载出来使用

AssetBundle使用流程: 

1.指定资源的AssetBundle属性

在要打包的资源的Inspector面板中指定AssetBundle的属性

 

2.构建AssetBundle包

创建Editor文件夹,在文件夹中创建一个C#脚本,代码为:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;
using System.IO;

public class CreateAssetBundles{
    /*MenuItem属性允许你添加菜单项到主菜单和检视面板上下文菜单。 
    该属性把任意静态函数变为一个菜单命令。仅静态函数能使用这个MenuItem属性*/
    [MenuItem("Assets/Build AssetBundles")]
    
    static void BulidAllAssetBundles()
    {
        string dir = "AssetBundles";
        if (Directory.Exists(dir) == false)
            Directory.CreateDirectory(dir);
        //输出路径 打包压缩格式 打包到的平台
        BuildPipeline.BuildAssetBundles(dir, BuildAssetBundleOptions.None, BuildTarget.StandaloneWindows64);
    }
}

BuildAssetBundleOptions.None:使用LZMA算法压缩        

BuildAssetBundleOptions.UncompressedAssetBundle:不压缩,包大,加载快         BuildAssetBundleOptions.ChunkBasedCompression:使用LZ4压缩
 

通过 MenuItem我们在Unity的Asset选项中创建了Bulid AssetBundles选项调用此代码将资源打包到dir指定的目录中

在项目的文件中就可以看到我们打包出来的AssetBundles包了

游戏发布后需要AssetBundle包在服务器上,这时我们才需要游戏从服务器下载AssetBundle包进行加载,开发时因为需要进行频繁的调试,我们将包放在本地来进行加载

3.在本地对AssetBundle进行加载和使用:游戏场景中创建空物体挂载脚本,内容为:

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class LoadWallFormFile : MonoBehaviour {
	// Use this for initialization
	void Start () {
        //1.加载AssetBundle
        AssetBundle ab = AssetBundle.LoadFromFile("AssetBundles/wall.dz");
        //2.从AssetBundle中取得要加载的资源
        GameObject wallPrefab = ab.LoadAsset<GameObject>("Wall");
        //3.把资源实例化到场景当中
        Instantiate(wallPrefab);
	}
}

这样就可以在场景中看到之前我们打包好的东西了

AssetBundle分组策略:

指定资源的AssetBundle标签其实就是一种对资源的分类

1.经常更新的资源放在一个单独的包,与不经常更新的包分离
2.需要同时加载的资源(小资源)放在一个包里
3.其它包共享的资源放在一个包中(减小AB包的大小)
4.同一个资源有两个版本可以考虑通过后缀来区分

对于第三点,存在共享的资源怎么进行依赖打包的案列:

如图场景中存在一个sphere和cube,都使用了名为wood的材质

假如我们没有采用依赖打包,那么就会出现下图中左边的情况,AB包中为sphere和cube打包的文件中,包含着一样的贴图和材质,如果我们采用右边的依赖打包方案,就能对包的大小进行一个优化

首先将要共用的贴图和材质的AssetBundle设为share

再为cube和sphere分别设置一个AssetBundle的属性,名字随意

观察再次打包出来的文件,cube和sphere的文件大小都很小了,share的大小是最大的

而如果没有对要共用的资源设置AssetBundle的标签的话,打包出来就会如下图一样,cube和sphere中都含有一套一样的贴图和材质

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AssetBundle 打包是 Unity 引擎中的一项功能,它可以将游戏资源(如模型、贴图、声音等)打包成一个可供Unity项目使用的二进制文件。 在Unity中,资源一般存储在项目中的Assets文件夹下。AssetBundle打包可以将Assets文件夹下的相关资源打包成二进制文件,这样可以提高游戏加载效率和节约存储空间。使用AssetBundle打包后的资源可以在运行时动态加载,而无需把所有资源都放在游戏启动时一次性加载。 AssetBundle打包有两个主要步骤:构建AssetBundle和导入AssetBundle。 构建AssetBundle是将指定的资源打包成二进制文件的过程。在Unity编辑器中,可以通过选择要打包的资源并设置相关的打包属性,然后点击菜单中的Build选项来执行构建。AssetBundle的构建可以针对不同的平台进行,比如PC、移动设备、Web等,以便在不同平台上使用相应的AssetBundle。 导入AssetBundle是将打包好的二进制文件导入到Unity项目中的过程。导入AssetBundle时,可以通过提供AssetBundle的路径或URL来加载资源,然后通过代码将资源实例化、加载到场景中或执行其他操作。 使用AssetBundle打包可以优化游戏的性能和加载速度,特别是对于大型游戏项目或需要频繁更新资源的项目来说。通过打包资源成AssetBundle,可以实现资源的动态加载,提高游戏的流畅性和用户体验。 需要注意的是,在使用AssetBundle打包资源时,要注意打包资源的依赖关系,确保打包的资源能够正确加载和使用,并且需要注意资源的版本控制,以便在项目更新时能够正确地更新AssetBundle中的资源。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值