当前位置: 首页 > news >正文

unityAB包(1/2)

unityAB包学习

      • 1.AB包的导出
        • 扩展BuildAssetBundleOptions
          • 无特殊选项
          • 压缩相关选项
      • 2.AB包资源管理
      • 3.Resource和AssetBundle加载方式的区别
      • 4.预设体
      • 5.Unity Asset Bundle Browser 工具
      • 5为什么要勾选拷贝到StreamingAsset里面。
      • 6.AB包的加载

1.AB包的导出

首先在Project窗口,在Asset窗口下创建一个名为Editor的文件夹,并将AB包导出的代码放于此处,否者将报错。
选择你要打包的内容到某个预设定的包中,下图示意为把Sampleplayr这个预制件预处理放置到charactorAb包中。真正开始导出是使用你自定义的导出按键,代码在下方。
在这里插入图片描述

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

public class AssetBundleExport
{
    [MenuItem("Assets/Export AssetBundles")]
    //菜单物品:于 Asset按键下方栏目的“Name”按钮。
    //此处Name是“Export AssetBundles”
    static void BuildAllAssetBundles()
    {//静态方法,工具类,不需要实例化,unity内部似乎已经帮我们处理过了
        string assetBundleDirectory = "E:\\unt\\AssetBundle\\Assets\\ExportAB";
        if (!Directory.Exists(assetBundleDirectory))//检测路径是否存在
        {//如果不存在就新建一个文件夹
            Directory.CreateDirectory(assetBundleDirectory);
        }
        //否者导出
        //参数为 路径/ AB包导出选项(此处为none)/ 导出的目标平台
        BuildPipeline.BuildAssetBundles(assetBundleDirectory,
                                        BuildAssetBundleOptions.None,
                                        BuildTarget.StandaloneWindows);
    }
}

unity官方页面:在这里插入图片描述

扩展BuildAssetBundleOptions
无特殊选项

BuildAssetBundleOptions.None
作用:默认选项,不应用任何特殊的构建选项。构建的 AssetBundle 会包含所有依赖项,并且不会进行额外的优化或压缩。

压缩相关选项

在这里插入图片描述
在这里插入图片描述

2.AB包资源管理

AB包导出的资源最好合理分类,不要引用Project中的Resource内的资源文件,否则会多次调用复制。
在这里插入图片描述
为什么呢?是由于unity内部机制决定的!
在这里插入图片描述

3.Resource和AssetBundle加载方式的区别

在这里插入图片描述
也就是说Resource虽然保证了能引用到某个文件,但它不合理的遍历查找方式和重复资源加载和落后的打包发布使得这个系统不如AssetBundle。
但是Resource的操作方便,适合小型游戏的开发。使用Resources系统可以快速地加载和使用资源,无需过多考虑资源的重复加载和打包优化等问题,能够提高开发效率。开发人员可以更专注于游戏的功能实现,而不必花费过多精力在资源管理上。

4.预设体

预设体是一种“反射”并没有真正存储C#代码,而是对C#脚本的一种关联,这就是为什么预设体即使挂载了C#脚本和组件也能放入AB包中。

5.Unity Asset Bundle Browser 工具

工具下载自行百度。
Configure栏
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/a1e060b342fe4668a9cf760631111dab.png
build栏
在这里插入图片描述
在这里插入图片描述

下图来源:
于毒,空间链接

    1. LZMA 压缩
      压缩原理
      LZMA 是一种通用的数据压缩算法,采用了字典编码和算术编码相结合的方式,能实现较高的压缩比。它会对整个 AB 包进行压缩,生成一个紧凑的文件。
      优点
      高压缩比:生成的 AB 包文件体积最小,在网络传输时可以节省大量的带宽,减少下载时间和流量消耗,适合需要通过网络大量下载资源的情况,例如手游的资源更新。
      缺点
      加载时间长:在加载 AB 包时,需要先将整个压缩包解压,这个过程会消耗较多的 CPU 资源和时间,导致加载速度变慢。
      解压内存需求大:解压过程需要足够的内存来存储解压后的文件,可能会对内存有限的设备造成压力。
      适用场景
      适用于网络带宽有限、下载速度较慢的场景,例如移动设备通过移动网络下载资源,或者资源更新包较大的情况。
    1. LZ4 压缩
      压缩原理
      LZ4 是一种无损数据压缩算法,它采用块压缩的方式,将 AB 包分割成多个小块分别进行压缩。这样在加载时可以按需解压部分块,而不需要解压整个包。
      优点
      快速加载:由于采用块压缩,加载时可以只解压需要的部分,大大缩短了加载时间,提高了资源的加载效率。
      低内存占用:解压过程中只需要解压当前需要的块,对内存的需求相对较小,适合内存有限的设备。
      缺点
      压缩比相对较低:相比 LZMA,LZ4 的压缩比要低一些,生成的 AB 包文件体积会稍大。
      适用场景
      适用于对加载速度要求较高的场景,例如游戏运行时需要频繁加载和卸载资源的情况,如场景切换、动态加载模型等。
    1. 不压缩
      压缩原理
      不进行任何压缩操作,AB 包以原始的二进制数据形式存储。
      优点
      最快的加载速度:由于不需要进行解压操作,加载 AB 包的速度最快,能够立即使用资源。
      缺点
      文件体积大:AB 包的文件大小与原始资源文件大小基本相同,会占用更多的存储空间,并且在网络传输时需要更多的带宽和时间。

5为什么要勾选拷贝到StreamingAsset里面。

在这里插入图片描述
何时是只读的?
在这里插入图片描述

6.AB包的加载

同一个AB包(指小包)不能够被重复加载,否者报错。

void Start ()
{
	// 第一步 加载 AB 包
	AssetBundle ab = AssetBundle.LoadFromFile (Application.streamingAssetsPath + "/" + "model");
	// 第二步 加载 AB 包中的资源
	// 只是用名字加载 会出现 同名不同类型资源 分不清
	// 建议大家用 泛型加载 或者 是 Type 指定类型
	//GameObject obj = ab.LoadAsset<GameObject>("Cube");
	GameObject obj = ab.LoadAsset("Cube", typeof(GameObject)) as GameObject;
	Instantiate(obj);
}
StartCoroutine (LoadABRes ("head", "23_11100001"));
IEnumerator LoadABRes (string ABName, string resName)
{
// 第一步 加载 AB 包
	AssetBundleCreateRequest abcr = AssetBundle.LoadFromFileAsync (Application.streamingAssetsPath + "/" + ABName);
	yield return abcr;
// 第二步 加载资源
	AssetBundleRequest abq = abcr.assetBundle.LoadAssetAsync (resName, typeof 	(Sprite));
	yield return abq;
//abq.asset as Sprite;
	img.sprite = abq.asset as Sprite;
}
AssetBundle.UnloadAllAssetBundles(bool unloadAllObjects)

参数含义:该方法有一个布尔类型的参数unloadAllObjects 。当参数为true时,会卸载所有已加载的 AB 包,并且会卸载所有通过这些 AB 包加载到内存中的资源,即便这些资源正被其他部分依赖引用;当参数为false时 ,会卸载所有未被其他资源依赖的 AB 包及其资源,对于正被依赖引用的资源则不会卸载。

AssetBundle ab = AssetBundle.LoadFromFile("path/to/your/assetbundle");
// 加载资源
GameObject obj = ab.LoadAsset<GameObject>("YourGameObject");
// 卸载AB包,不卸载已加载资源实例
ab.Unload(false); 
// 此时obj仍可使用,但不能再从ab加载新资源

// 卸载AB包,同时卸载已加载资源实例
ab.Unload(true); 
// 此时obj不可用,相关资源内存被释放

异步卸载包

IEnumerator UnloadABBundleAsync()
    {
        // 进行异步卸载,同时卸载已加载资源实例
        var unloadRequest = ab.UnloadAsync(true);

        // 等待卸载完成
        while (!unloadRequest.isDone)
        {
            yield return null;
        }

        Debug.Log("AB包及其已加载资源实例已成功异步卸载");
        // 此时AB包已卸载,ab引用不再有效,可设置为null
        ab = null;
    }

相关文章:

  • Arduino示例代码讲解:Multiple tone player 多音播放器
  • 【优选算法】二分算法模板总结及应用
  • 图解AUTOSAR_CP_SOMEIP_Transformer
  • Datawhale大语言模型-Transformer以及模型详细配置
  • BFS--------N叉树的层序遍历
  • WPF的主题切换
  • 基于视觉的核桃分级与套膜装置研究(大纲)
  • 深度学习 Deep Learning 第5章 机器学习基础
  • 使用自定义指令实现css样式层叠
  • DeDeCMS漏洞
  • Matrix-Breakout-2-Morpheus靶场通关心得:技巧与经验分享
  • 机器学习-手搓KNN算法
  • 小程序API —— 54 路由与通信 - 编程式导航
  • Mistral AI发布开源多模态模型Mistral Small 3.1:240亿参数实现超越GPT-4o Mini的性能
  • Handler消息机制源码分析
  • 从模拟到现实:Sensodrive高精度力反馈技术赋能物流运输的高效与安全
  • 基于Wasm的边缘计算Pandas:突破端侧AI的最后一公里——让数据分析在手机、IoT设备上飞驰
  • 若依 Excel导入与导出 配置下拉选项
  • 通过蒸馏大模型训练建筑向智能助手模型的思路
  • 63. 根文件系统构建
  • 复旦建校120周年大型义诊举行,百余名专家服务市民超三千人次
  • 上海国际珠宝时尚功能区未来三年如何建设?六大行动将开展
  • 银行积分大幅贬值遭质疑,涉及工行、中行、农行等
  • 上海“城市文明开放麦”全城总动员,樊振东担任首位上海城市文明大使
  • 创同期历史新高!1至4月全国铁路发送旅客14.6亿人次
  • 基金经理调仓引发大金融板块拉升?公募新规落地究竟利好哪些板块