unity AssetBundle 使用_什么是AssetBundle_导入必要的插件_创建AssetBundles_AB包资源下载_大文件下载

news2024/11/14 17:57:21

一、什么是AssetBundle?

定义AssetBundle。

AssetBundle 是一个存档文件,包含可在运行时由 Unity 加载的特定于平台的非代码资源(比如模型、纹理、预制件、音频剪辑甚至整个场景)。AssetBundle 可以表示彼此之间的依赖关系;例如,一个 AssetBundle 中的材质可以引用另一个 AssetBundle 中的纹理。为了提高通过网络传输的效率,可以根据用例要求(LZMA 和 LZ4)选用内置算法选择来压缩 AssetBundle。

解释为什么使用AssetBundles

热更新,缩小包体积

二、导入必要的插件

Unity内置的AssetBundle支持

可以自己在这里设置资源包的所属包,包名不能是大写,大写会自动转为小写:
在这里插入图片描述
在这里插入图片描述

推荐第三方插件(如果有的话)

Asset Bundle Browser

可以从Github上下载,可以从package manager下载

https://github.com/Unity-Technologies/AssetBundles-Browser

下载好之后将Editor 文件夹重命名,并放到自己项目的Editor文件夹下。
在这里插入图片描述

UniTask Unity 异步插件

在unity中可以使用异步的插件,支持很多平台。

https://github.com/Cysharp/UniTask

将这个文件夹与自己的项目中的Editor文件夹合并。
在这里插入图片描述

插件导入完毕

在这里插入图片描述

三、创建AssetBundles

打开window - Asset Bundle Browser 窗口
在这里插入图片描述

在这里插入图片描述将需要打包的资源拖进去,Asset Bundle Browser 会自动分析依赖,倒入依赖资源
示例:
在场景创建一个image,并将给一个图片,将图片赋值给image,将image作成预制体,然后将image打包
在这里插入图片描述
在这里插入图片描述

切换到Build
在这里插入图片描述
根据自己的实际需求设置。之后点击Build

在这里插入图片描述

文件介绍:

文件名称作用
image包,打包的AB包的包文件
image.manifestimage 包的依赖文件,让开发者看的
StandaloneWindows主包文件,这个项目的主包
StandaloneWindows.manifest主包的依赖文件,让开发者看的,记录全部ab包的依赖关系

在这里插入图片描述

在这里插入图片描述

资源下载

这仅仅是示例,如果性能敏感,请参照文档末尾的:“下载方式教程” 中的教程进行更合适的下载方式

从本地(远程)下载AssetBundles

    /// <summary>
    /// 本地下载的链接_webRequest
    /// </summary>
    private string downFileFromStreamingAssetsUrl = "ABPackageFileResources/image";

    /// <summary>
    /// 加载的资源在ab包内的路径
    /// </summary>
    private string assetsFileInABPackagePath = "Assets/AssetsPackage/Image.prefab";

    void Start()
    {
        DownLoadABAssets();
    }


    /// <summary>
    /// 从SteamingAssets下载文件
    /// </summary>
    /// <returns></returns>
    private async UniTask DownLoadABAssets()
    {
        //异步_从AB包加载模型到内存
        var tmp_downFilePath = new System.Uri(System.IO.Path.Combine(
            Application.streamingAssetsPath, downFileFromStreamingAssetsUrl));

        //等待下载资源
        AssetBundle tmp_ABPackage = await DownLoadAssetBundle(tmp_downFilePath.ToString());

        //资源解析
        var tmp_image =
            tmp_ABPackage.LoadAsset<GameObject>(assetsFileInABPackagePath);

        //资源创建
        GameObject tmp_go_Image = GameObject.Instantiate(tmp_image);
        GameObject tmp_go_Canvas = new GameObject("tmp_go_Canvas");
        tmp_go_Canvas.AddComponent<Canvas>();
        tmp_go_Image.name = nameof(tmp_go_Image);
        tmp_go_Image.transform.parent = tmp_go_Canvas.transform;

        //AB包释放资源
        tmp_ABPackage.Unload(false);
    }


    /// <summary>
    /// 下载AB包
    /// </summary>
    /// <param name="assetBundleUrl">ab包路径</param>
    /// <returns></returns>
    private async UniTask<AssetBundle> DownLoadAssetBundle(string assetBundleUrl)
    {
        // 创建UnityWebRequest
        using (UnityWebRequest webRequest = UnityWebRequestAssetBundle.GetAssetBundle(assetBundleUrl))
        {
            // 发送请求并等待完成
            await webRequest.SendWebRequest();

            if (webRequest.result != UnityWebRequest.Result.Success)
            {
                Debug.LogError($"Failed to download AssetBundle: {webRequest.error}");
                return null;
            }

            // 获取AssetBundle
            AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(webRequest);
            if (bundle == null)
            {
                Debug.LogError("Failed to load AssetBundle!");
                return null;
            } // 卸载AssetBundle

            return bundle;
        }
    }

从本地加载AssetBundles

本地的添加一些错误处理。


    /// <summary>
    /// 本地下载的链接_webRequest
    /// </summary>
    private string downFileFromStreamingAssetsUrl = "ABPackageFileResources/image";

    /// <summary>
    /// 加载的资源在ab包内的路径
    /// </summary>
    private string assetsFileInABPackagePath = "Assets/AssetsPackage/Image.prefab";

    void Start()
    {
      //  _ = DownLoadABAssets();
        _ = LoadFromLoadTest();
    }
 
    /// <summary>
    /// 从本地加载文件
    /// </summary>
    private async UniTask LoadFromLoadTest()
    {
        AssetBundleCreateRequest tmp_assetBundleCreateRequest = await LoadFileFromLocal(downFileFromStreamingAssetsUrl);

        if (tmp_assetBundleCreateRequest == null || !tmp_assetBundleCreateRequest.isDone)
        {
            Debug.LogError("Failed to load asset bundle from local path.");
            return;
        }

        AssetBundle tmp_assetBundle = tmp_assetBundleCreateRequest.assetBundle;

        if (tmp_assetBundle == null)
        {
            Debug.LogError("Failed to get the asset bundle.");
            return;
        }

        GameObject tmp_loadedGameObject;
        try
        {
            tmp_loadedGameObject = tmp_assetBundle.LoadAsset<GameObject>(assetsFileInABPackagePath);
            if (tmp_loadedGameObject == null)
            {
                Debug.LogError($"Failed to load asset '{assetsFileInABPackagePath}' from the asset bundle.");
            }
            else
            {
                GameObject tmp_go_Image = GameObject.Instantiate(tmp_loadedGameObject);
                GameObject tmp_go_Canvas = new GameObject("tmp_go_Canvas");
                tmp_go_Canvas.AddComponent<Canvas>();
                tmp_go_Image.name = nameof(tmp_go_Image);
                tmp_go_Image.transform.parent = tmp_go_Canvas.transform;
                
            }
        }
        catch (Exception e)
        {
            Debug.LogError($"Error loading asset from asset bundle: {e.Message}");
        }
        
    }

    /// <summary>
    /// 本地加载
    /// </summary>
    /// <param name="_pathInStreamingAssets"></param>
    /// <returns></returns>
    private async UniTask<AssetBundleCreateRequest> LoadFileFromLocal(string _pathInStreamingAssets)
    {
        string tmp_filePath = Path.Combine(Application.streamingAssetsPath, _pathInStreamingAssets);
        var tmp_assetBundle = AssetBundle.LoadFromFileAsync(tmp_filePath);

        if (tmp_assetBundle == null)
        {
            Debug.LogError($"Failed to load asset bundle from local path: {_pathInStreamingAssets}");
        }

        return tmp_assetBundle;
    }
    
    

大文件下载

没搞明白

获取进度

    private IEnumerator LoadFromLocal()
    {
        string tmp_filePath = Path.Combine(Application.streamingAssetsPath, downFileFromStreamingAssetsUrl);
        AssetBundleCreateRequest tmp_abcr = AssetBundle.LoadFromFileAsync(tmp_filePath);

        while (tmp_abcr.progress <= 0.9f)
        {
            UnityEngine.Debug.Log(tmp_abcr.progress);
            yield return null;
        }

        tmp_abcr.assetBundle.Unload(false);
        yield return null;
    }

UI将TMP字体打包进去解决办法

在这里插入图片描述

暂时没有办法[/摊手]

参照文档

Unity 用户手册

https://docs.unity.cn/cn/2021.1/Manual/AssetBundlesIntro.html
https://docs.unity3d.com/cn/2020.1/Manual/AssetBundles-Native.html

下载方式教程

https://docs.unity.cn/cn/2021.1/Manual/AssetBundles-Native.html

Unity Asset Bundle Browser 工具

https://docs.unity.cn/cn/2021.1/Manual/AssetBundles-Browser.html

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

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

相关文章

PD取电快充协议方案

PD快充协议是通过调整电压和电流来提供不同的充电功率。它采用了一种基于USB-C端口的通信协议&#xff0c;实现了充电器于设备之间的信息交换。在充电过程中设备会向充电器发出请求&#xff0c;要求提供不同的电压和电流&#xff0c;充电器接收到请求后&#xff0c;会根据设备的…

数据本地化软件架构-SAAS本地化未来之窗行业应用跨平台架构

一、未来之窗行业应用跨平台架构 未来之窗跨平台架构采用Hybird&#xff08;混合模式移动应用&#xff09;是一种结合了原生应用&#xff08;Native App&#xff09;和网页应用&#xff08;Web App&#xff09;特点的移动应用开发模式。 二、特点 2.1. 开发成本相对较低 - 与…

C++码表之Unicode

今日诗词&#xff1a; 折花逢驿使&#xff0c;寄与陇头人。 江南无所有&#xff0c;聊赠一枝春。 ——《赠范晔诗》【南北朝】陆凯 引言&#xff1a; 上一期我们说到了ASCII码表&#xff0c;这是一种现如今不是那么通用的机制&#xff0c;随着计算机的普及&#xff0c;越来越…

电脑ip地址为什么会自己变更?电脑ip怎么改

在当今这个高度依赖互联网的时代&#xff0c;IP地址作为网络设备的身份标识&#xff0c;其稳定性和可管理性对于网络通信的顺畅至关重要。然而&#xff0c;许多用户可能会遇到电脑IP地址自动变更的情况&#xff0c;这不仅可能影响到网络连接的稳定性&#xff0c;还可能给远程访…

怎么使用win10录屏快捷键 ?分享三款录屏工具

录屏软件在我们日常生活中越来越常见&#xff0c;无论是做教程、记录游戏精彩瞬间还是进行远程教学&#xff0c;一个好的录屏软件都能让我们的生活变得更加便捷。不少人也会选怎win10自带的录屏&#xff0c;使用WIN10 录屏快捷键【winG】&#xff0c;就可以唤出录屏工具&#x…

【Node】【1】node和nvm安装

安装nvm、node、npm 安装node 18 &#xff0c;最简单的办法是使用nvm&#xff0c;就不用手动安装了&#xff0c;那么就得先安装nvm。 NVM 是Node Version Manager&#xff0c;用于管理 Node.js 版本。你设备上的不同项目可能使用不同版本的 Node.js。通过 nvm&#xff0c;用户…

Redis | 非关系型数据库Redis的初步认识

本节内容相对理论&#xff0c;着重看基础通用命令这一节 Redis 非关 kv型{字典} 概念应用ubuntu安装配置 windows添加密码 可能问题【ubuntu】远程连接 基础通用命令 ⭐ 概念 特点&#xff1a; 1、开源的&#xff0c;使用C编写&#xff0c;基于内存且支持持久化 2、没有表 支持…

ssrf例题分析

我们第一步先在ubuntu中解压web-ssrfme.zip&#xff0c;更新镜像后重启容器。 我们可以看到代码中成功拉取到ssrfme镜像 ig(preg_match(/file\:\/\/&#xff5c;dict\:\/\/.&#xff5c;\.\.\/&#xff5c;127.0.0.1&#xff5c;localhost/is,$url,$match)) 使用端口访问文件&…

【Linux系列】SH 与 BASH 的区别:深入解析与使用案例

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Leetcode JAVA刷刷站(93)复原IP地址

一、题目概述 二、思路方向 为了解决这个问题&#xff0c;我们可以使用回溯算法。回溯算法在这里非常适用&#xff0c;因为我们需要尝试在字符串中的不同位置插入点&#xff08;.&#xff09;来分割出可能的IP地址段&#xff0c;并且需要验证每个段是否满足条件&#xff08;即…

如何使用ssm实现铁岭河医院医患管理系统+vue

TOC ssm077铁岭河医院医患管理系统vue 系统概述 进过系统的分析后&#xff0c;就开始记性系统的设计&#xff0c;系统设计包含总体设计和详细设计。总体设计只是一个大体的设计&#xff0c;经过了总体设计&#xff0c;我们能够划分出系统的一些东西&#xff0c;例如文件、文…

从web.xml动态读取sunspringmvc.xml文件

文章目录 1.问题分析1.SunWebApplicationContext.java 中sunspringmvc.xml是写死的2.但是web.xml已经配置了init-param&#xff0c;所以应该是可以读取的 2.具体实现1.SunDispatcherServlet.java 得到ServletConfig传递给Spring容器完成初始化2.SunWebApplicationContext.java …

C_03 函数学习

函数 优点&#xff1a; 降低代码耦合度降低代码冗余度提高代码复用率提高代码可读性 思想&#xff1a; 封装【包装】 声明&#xff1a; 语法&#xff1a; extern 函数名(形参列表)&#xff1b;// 注意&#xff1a;此时 形参列表中变量名可以忽略不写&#xff1b;定义&#xff1…

2024.8.26

一、对于第三模态加入对于模型性能的影响 yes/no other num 尝试通过 1、删去第一次反向传播时第三模态的梯度更新 &#xff08;1&#xff09;第三次反向传播会再进行一次更新 &#xff08;2&#xff09;阻止模型频繁的学习训练样本 2、取消第三模态共享头部更新时的权重修正&…

Vue.js实战教程:如何一步步构建HSK在线学习平台

✍✍计算机毕业编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java、…

3ds Max 2025新增功能、安装教程及下载

3ds Max 2025 引入了一些新的功能和改进&#xff0c;提升了建模、动画和渲染的效率&#xff1a; 增强的建模工具&#xff1a;增加了新的多边形建模和修改器工具&#xff0c;支持更复杂的几何形状和更高效的建模流程。 改进的材质和渲染&#xff1a;引入了新的材质类型和改进的…

05.C++类和对象(下)

1.再探构造函数 • 之前我们实现构造函数时&#xff0c;初始化成员变量主要使用函数体内赋值&#xff0c;构造函数初始化还有一种方式&#xff0c;就是初始化列表&#xff0c;初始化列表的使用方式是以一个冒号开始&#xff0c;接着是一个以逗号分隔的数据成员列表&#xff0c…

基于springboot+vue+uniapp的短文写作竞赛管理系统小程序

开发语言&#xff1a;Java框架&#xff1a;springbootuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#…

Maven的配置文件pom.xml标签详解(含常用plugin)

一、什么是pom.xml pom.xml是Maven项目的核心配置文件&#xff0c;它是 项目对象模型 - Project Object Model&#xff08;POM&#xff09; 的缩写。POM定义了项目的所有属性&#xff0c;包括项目的名称、版本、依赖关系、构建配置等。使用pom.xml&#xff0c;我们可以轻松地管…

pwm子系统

一、系统框架 内核的PWM core&#xff0c;向下对实际pwm控制器驱动&#xff0c;提供了pwm_chip,soc厂商编程控制器驱动&#xff0c;只需注册结构体&#xff0c;配置好private_data&#xff0c;实例化pwm_ops操作&#xff0c;编写具体函数即可。 向上为其他驱动调用提供了统一的…