AssetBundle打包与加载

news2025/1/16 13:57:27

官方文档
参照视频

1.AssetBundle打包

1.1设置资源的命名和后缀

命名只支持小写
在这里插入图片描述

1.2创建Editor文件夹,在里面创建编辑器打包AssetBundle的脚本

using UnityEditor;
using System.IO;

public class CreateAssetBundles  {

    [MenuItem("Assets/Build AssetBundles")]
    static void BuildAllAssetBundles()
    {
        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压缩,压缩率没有LZMA高,但是我们可以加载指定资源而不用解压全部
注意:使用LZ4压缩,可以获得可以跟不压缩相媲美的加载速度,而且比不压缩文件要小

1.3选择菜单Assers-》点击Build AssetBundles 进行打包

在这里插入图片描述
得到打包后的文件
在这里插入图片描述

2.AssetBundle加载方式

原则上在使用资源之前需要先加载材质包,再创建prefab,防止材质丢失。share.unity3d为cubewallf的材质贴图包,share.unity3d和cubewall.unity3d加载先后顺序不影响

加载方式1:本地加载 AssetBundle.LoadFromFile

AssetBundle ab = AssetBundle.LoadFromFile("AssetBundles/share.unity3d");
 AssetBundle ab = AssetBundle.LoadFromFile("AssetBundles/cubewall.unity3d");
 GameObject wallPrefab = ab.LoadAsset<GameObject>("CubeWall");
 Instantiate(wallPrefab);

加载方式2: 内存中加载(异步) AssetBundle.LoadFromMemoryAsync

IEnumerator LoadFromMemoryAsync(string path)
    {
        AssetBundleCreateRequest createRequest = AssetBundle.LoadFromMemoryAsync(File.ReadAllBytes(path));
        yield return createRequest;
        AssetBundle bundle = createRequest.assetBundle;
        var prefab = bundle.LoadAsset<GameObject>("MyObject");
        Instantiate(prefab);
    }

内存中加载(同步) AssetBundle.LoadFromMemory

AssetBundle ab=AssetBundle.LoadFromMemory(File.ReadAllBytes(path));

加载方式3:网络加载 UnityWebRequestAssetBundle

IEnumerator InstantiateObject()
{
    string uri = "file:///" + Application.dataPath + "/AssetBundles/" + assetBundleName; 
    UnityEngine.Networking.UnityWebRequestAssetBundle request 
        = UnityEngine.Networking.UnityWebRequestAssetBundle.GetAssetBundle(uri, 0);
    yield return request.SendWebRequest();
    AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(request);
    GameObject cube = bundle.LoadAsset<GameObject>("Cube");
    GameObject sprite = bundle.LoadAsset<GameObject>("Sprite");
    Instantiate(cube);
    Instantiate(sprite);
}

(弃用)网络加载2 LoadFromCacheOrDownload(string url, int version);

IEnumerator Start()
    {
        while (!Caching.ready)
            yield return null;

        using (var www = WWW.LoadFromCacheOrDownload("https://myserver.com/myassetBundle.unity3d", 5))
        {
            yield return www;
            if (!string.IsNullOrEmpty(www.error))
            {
                Debug.Log(www.error);
                yield return null;
            }
            var myLoadedAssetBundle = www.assetBundle;

            var asset = myLoadedAssetBundle.mainAsset;
        }
    }

API2:LoadFromCacheOrDownload(string url, int version, uint crc); crc表示校验完整性,crc在.mainifest文件里
在这里插入图片描述

3.通过Manifest文件得到某个包的依赖

AssetBundles.manifest 里面包含所有包对应的依赖
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/44e22eec07d7485fb7acc569b00c1cf2.png
代码:

AssetBundle manifestAB = AssetBundle.LoadFromFile("AssetBundles/AssetBundles");//固定为AssetBundles
AssetBundleManifest manifest = manifestAB.LoadAsset<AssetBundleManifest>("AssetBundleManifest");//固定为“AssetBundleManifest”
string[] strs = manifest.GetAllDependencies("cubewall.unity3d");
foreach (string name in strs) {
    print(name);//share.unity3d
    AssetBundle.LoadFromFile("AssetBundles/"+ name); //加载cubewall.unity3d的依赖包
}

4.AssetBundle的卸载

  • 卸载可以减少内容的使用
  • 不当的卸载,有可能导致丢失(材质丢失bug红等)
  • AssetBundle.Unload(true) 卸载所有资源,即使有资源被使用着,推荐这个方法,卸载前确保依赖的包不被其他物体使用了。可以在切换场景是loading scene阶段去卸载
  • AssetBundle.Unload(false) 卸载所有没有被使用的资源,一般不用这个方法,会导致某些资源不被卸载,导致内存被滥用
  • 个别资源的卸载 1.通过Resources.UnloadUnusedAssets 2.场景切换的时候,自动调用Resources.UnloadUnusedAssets

5.Unity AssetBundle Browser Tool

使用文档
github下载地址
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1513551.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux:好用的Linux指令

进程的Linux指令 1.查看进程信息 ​​​​ps ajx | head -1 && ps ajx | grep 进程名创建一个进程后输入上述代码&#xff0c;会打印进程信息&#xff0c;当我们在code.exe中写入打印pid&#xff0c;ppid&#xff0c;这里也和进程信息一致。 while :; do ps ajx | he…

力扣日记3.8-【回溯算法篇】37. 解数独

力扣日记&#xff1a;【回溯算法篇】37. 解数独 日期&#xff1a;2023.3.8 参考&#xff1a;代码随想录、力扣 37. 解数独 题目描述 难度&#xff1a;困难 编写一个程序&#xff0c;通过填充空格来解决数独问题。 数独的解法需 遵循如下规则&#xff1a; 数字 1-9 在每一行只…

上位机图像处理和嵌入式模块部署(qmacvisual串口输出结果)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们谈到了图像的输入、算法的添加&#xff0c;一切看上去都没有问题。但是这中间缺少了一个重要的环节&#xff0c;那就是结果的输出。如果我…

Java中的参数传递

程序设计语言将实参传递给方法&#xff08;或函数&#xff09;的方式分为两种&#xff1a; 值传递&#xff1a;方法接收的是实参值的拷贝&#xff0c;会创建副本。引用传递&#xff1a;方法接收的直接是实参所引用的对象在堆中的地址&#xff0c;不会创建副本&#xff0c;对形…

一文掌握mysql中的查询语句

目录 1. 聚合查询1.1 聚合函数1.2 GROUP BY子句1.3 HAVING 2. 联合查询2.1 内连接2.2 外连接2.3 自连接2.4 子查询2.5 合并查询 1. 聚合查询 1.1 聚合函数 常见的统计总数、计算平局值等操作&#xff0c;可以使用聚合函数来实现&#xff0c;常见的聚合函数有&#xff1a; 函…

Ubuntu 基本操作-嵌入式 Linux 入门

在 Ubuntu 基本操作 里面基本就分为两部分&#xff1a; 安装 VMware 运行 Ubuntu熟悉 Ubuntu 的各种操作、命令 如果你对 Ubuntu 比较熟悉的话&#xff0c;安装完 VMware 运行 Ubuntu 之后就可以来学习下一章节了。 1. 安装 VMware 运行 Ubuntu 我们首先来看看怎么去安装 V…

[MYSQL数据库]--表内操作(CURD)

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、表的 Cre…

【rk3368 android6.0 恢复出厂设置功能】

rk3368 android6.0 恢复出厂设置功能 恢复出厂设置三种方法一&#xff0c;设置--进入恢复出厂设置页面二&#xff0c;发送广播形式三&#xff0c;命令形式总结 郑重声明:本人原创博文&#xff0c;都是实战&#xff0c;均经过实际项目验证出货的 转载请标明出处:攻城狮2015 恢复…

视频素材网站哪个好?推荐几个高清无水印的短视频素材网

小伙伴们&#xff0c;如果你也是短视频的狂热爱好者&#xff0c;想要制作出优质满分的短视频作品&#xff0c;但苦于不知道从哪儿搞来那些高清无水印的素材&#xff0c;那今天你就来对地方啦&#xff01;我这里有几个绝佳的素材网站推荐给你&#xff0c;让你的创作源源不断。 …

Kubernetes kafka系列 | k8s部署kafka+zookeepe集群(可外部通信)| kafka docekr镜像制作-v3.5.2

一、 Kafka、ZooKeeper 的分布式消息队列系统总体架构 典型的 Kafka 体系架构包括若干 Producer(消息生产者),若干 Broker(作为 Kafka 节点的服务器),若干 Consumer (Group),以及一个 ZooKeeper 集群。 Kafka 通过 ZooKeeper 管理集群配置、选举 Leader,并在 Consum…

自动化运维工具 ---------------Ansible

一、Ansible 发展史及功能 作者&#xff1a;Michael DeHaan&#xff08; Cobbler pxe kikstar 与 Func 作者&#xff09;ansible 的名称来自科幻小说《安德的游戏》中跨越时空的即时通信工具&#xff0c;使用它可以在相距数光年的距离&#xff0c;远程实时控制前线的舰队战斗2…

AI人员睡岗识别摄像机

近年来&#xff0c;随着人工智能技术的不断发展&#xff0c;智能监控系统也得到了广泛应用。其中&#xff0c;AI人员睡岗识别摄像机作为一种新型的智能监控设备&#xff0c;正在逐渐受到企业和机构的关注和使用。这种摄像机利用人工智能技术&#xff0c;能够实时监测和识别工作…

智能指针的讲解

1.为什么要智能指针 首先我们分析一段代码&#xff1a; 1、如果p1这里new 抛异常会如何&#xff1f; 2、如果p2这里new 抛异常会如何&#xff1f; 3、如果div调用这里又会抛异常会如何&#xff1f; int div() {int a, b;cin >> a >> b;if (b 0)throw invalid_ar…

别再写传统简历了!AI简历5个超实用的功能,助你求职一臂之力(强烈建议收藏)

你们在制作简历时,是不是基本只关注两件事:简历模板,还有基本信息的填写。 当你再次坐下来更新你的简历时,可能会发现自己不自觉地选择了那个“看起来最好看的模板”,填写基本信息,却没有深入思考如何使简历更具吸引力。这其实是一个普遍现象:许多求职者仍停留在传统简历…

使用Julia语言展示几何平均值与算数平均值在实际应用中的差别(采用注册计量师考试试题)

理论部分 在注册计量师考试中有一道试题&#xff0c;大体内容为&#xff1a; 现在有一块砝码在等臂天平上进行测量&#xff0c;第一次测得值是19.6g&#xff0c;调换两边位置后的测得值是19.7g&#xff0c; 天平最终测得检测样品的重量为多少&#xff1f; 个别同事可能会将算…

每日一题leetcode -299.猜数字游戏

水一期 class Solution { public:string getHint(string secret, string guess) {int bulls 0;vector<int> cntS(10), cntG(10);for (int i 0; i < secret.length(); i) {if (secret[i] guess[i]) {bulls;} else {cntS[secret[i] - 0];cntG[guess[i] - 0];}}int c…

蓝桥杯真题讲解:三国游戏(贪心)

蓝桥杯真题讲解&#xff1a;三国游戏&#xff08;贪心&#xff09; 一、视频讲解二、正解代码 一、视频讲解 蓝桥杯真题讲解&#xff1a;三国游戏&#xff08;贪心&#xff09; 二、正解代码 //三国游戏&#xff1a;贪心 #include<bits/stdc.h> #define int long lon…

DJI RONIN 4D变0字节恢复案例

RONIN 4D这个产品听起来比较陌生&#xff0c;还是DJI大疆出品。没错&#xff0c;这是大疆进军影视级的重点明星机型。前阵子刚处理过大疆RONIN 4D的修复案例&#xff0c;下边这个案例是和exfat有关的老问题:文件长度变成0字节。 故障存储:希捷18T /MS Exfat文件系统。 故障现…

navicat查询结果导出(excle、txt、sql、html等)

执行查询结果后按照如下流程操作&#xff1a; 1、点击“文件”&#xff0c;选择“导出结果” 2、在弹出的弹窗中选择“导出当前的结果” 3、选择需要导出的格式&#xff0c;点击“下一步” 4、选择路径后&#xff0c;点击“下一步” 5、默认点击“下一步” 6、点击“开始” 7、…

计算机缺失iutils.dll怎么办,分享5种靠谱的解决方法

​在计算机系统运行过程中&#xff0c;如果发现无法找到或缺失iutils.dll文件&#xff0c;可能会引发一系列的问题与故障。首先&#xff0c;由于iutils.dll是系统中一个重要的动态链接库文件&#xff0c;它的主要功能可能涉及到系统核心服务、应用程序支持或者特定功能模块的运…