26.Assetbundle资源加载模块

Resources.load及AssetBundle.Load加载过程研究   /// <summary> /// 对Resources.Load进行试验. /// 试验准备: /// 1.一个Cube预制体,包含一个贴图,放在Resources文件夹下; /// 2.一个只有相机的场景,上面挂着TestScript脚本(也就是本脚本) /// </summary> using UnityEngine; using System.Collec... 阅读详情

一、什么是真正的异步加载

AssetBundle 加载资源包含两个阶段:

加载 AssetBundle 文件
        ↓
从 AssetBundle 中加载资源

如果只有第二步使用异步 API,第一步仍然同步,就不算完整的异步加载。
真正的异步加载需要:

  • 异步加载 AssetBundle。
  • 异步加载 AssetBundle 中的资源。

二、同步与异步加载冲突

异步加载 AssetBundle:

AssetBundle.LoadFromFileAsync(bundlePath);

同步加载 AssetBundle:

AssetBundle.LoadFromFile(bundlePath);

如果同一个 AB 包正在异步加载,又对它进行同步加载,会发生重复加载并报错。

LoadFromFileAsync("test") 正在加载
                ↓
LoadFromFile("test") 再次加载
                ↓
同一个 AssetBundle 被重复加载
                ↓
			   报错

三、StopCoroutine 不能取消 AB 加载

Coroutine coroutine = StartCoroutine(LoadBundleAsync());
StopCoroutine(coroutine);

StopCoroutine() 只停止协程后续代码,不会取消已经发起AssetBundleCreateRequest

停止协程
    ↓
不再执行 yield return 后面的代码

但底层 AssetBundle 异步加载仍可能继续

因此停止协程后,不能立即认为该 AB 包已经停止加载,也不能马上同步加载同一个包。

四、完整代码

1. EditorResMgr.cs

using System.Collections.Generic;
using UnityEngine;

#if UNITY_EDITOR
using UnityEditor;
#endif

/// <summary>
/// 编辑器资源管理器。
/// Editor API 只在开发阶段生效。
/// </summary>
public class EditorResMgr : BaseManager<EditorResMgr>
{
    private const string RootPath = "Assets/Editor/ArtRes/";

    private EditorResMgr()
    {
    }

    /// <summary>
    /// 加载单个编辑器资源。
    /// </summary>
    public T LoadEditorRes<T>(string path)
        where T : UnityEngine.Object
    {
#if UNITY_EDITOR
        string suffixName = GetSuffixName<T>();

        if (string.IsNullOrEmpty(suffixName))
        {
            Debug.LogError(
                $"没有配置资源类型 {typeof(T).Name} 的扩展名"
            );
            return null;
        }

        return AssetDatabase.LoadAssetAtPath<T>(
            RootPath + path + suffixName
        );
#else
        return null;
#endif
    }

    /// <summary>
    /// 加载图集中的指定 Sprite。
    /// </summary>
    public Sprite LoadSprite(
        string path,
        string spriteName)
    {
#if UNITY_EDITOR
        UnityEngine.Object[] sprites =
            AssetDatabase.LoadAllAssetRepresentationsAtPath(
                RootPath + path
            );

        foreach (UnityEngine.Object item in sprites)
        {
            if (item is Sprite sprite &&
                sprite.name == spriteName)
            {
                return sprite;
            }
        }
#endif

        return null;
    }

    /// <summary>
    /// 加载图集中的所有 Sprite。
    /// </summary>
    public Dictionary<string, Sprite> LoadSprites(
        string path)
    {
        Dictionary<string, Sprite> spriteDic = new();

#if UNITY_EDITOR
        UnityEngine.Object[] sprites =
            AssetDatabase.LoadAllAssetRepresentationsAtPath(
                RootPath + path
            );

        foreach (UnityEngine.Object item in sprites)
        {
            if (item is Sprite sprite)
            {
                spriteDic[sprite.name] = sprite;
            }
        }
#endif

        return spriteDic;
    }

    private string GetSuffixName<T>()
        where T : UnityEngine.Object
    {
        System.Type type = typeof(T);

        if (type == typeof(GameObject))
            return ".prefab";

        if (type == typeof(Material))
            return ".mat";

        if (type == typeof(Texture) ||
            type == typeof(Texture2D) ||
            type == typeof(Sprite))
        {
            return ".png";
        }

        if (type == typeof(AudioClip))
            return ".mp3";

        return string.Empty;
    }
}

2. Main.cs

下面的代码用于复现同步与异步加载同一个 AB 包的冲突,不应直接用于正式项目。

using System.Collections;
using System.IO;
using UnityEngine;

public class Main : MonoBehaviour
{
    private string bundlePath;

    private void Start()
    {
        bundlePath = Path.Combine(
            Application.streamingAssetsPath,
            "PC/test"
        );

        // 发起异步加载
        Coroutine coroutine = StartCoroutine(
            LoadBundleAsync()
        );

        // 只停止协程,不会取消底层 AssetBundleCreateRequest
        StopCoroutine(coroutine);

        // 此时同步加载同一个包可能产生重复加载错误
        AssetBundle bundle =
            AssetBundle.LoadFromFile(bundlePath);

        if (bundle != null)
        {
            Debug.Log($"同步加载完成:{bundle.name}");
        }
    }

    private IEnumerator LoadBundleAsync()
    {
        AssetBundleCreateRequest request =
            AssetBundle.LoadFromFileAsync(bundlePath);

        yield return request;

        if (request.assetBundle != null)
        {
            Debug.Log(
                $"异步加载完成:{request.assetBundle.name}"
            );
        }
    }
}
Unity AssetBundle字体加载难题:从原理到实战的完整解决方案 在Unity游戏开发中,资源动态加载与热更新是核心技术需求,AssetBundle作为核心资源管理方案,其依赖加载机制与资源序列化原理直接影响项目性能与稳定性。字体资源因其特殊的动态图集生成机制,在AssetBundle体系中常出现加载失败、字符缺失等兼容性问题,这背后涉及资源依赖管理、平台文件访问权限及内存优化等多重技术挑战。针对字体在AB包中的‘水土不服’,开发者需深入理解Unity资源管线与TextMeshPro字体渲染原理,通过预生成静态图集、动态字体文件随包发布或混合模式等策略,在包体大小、内存占 阅读详情

相关推荐

Unity资源管理演进:从AssetBundle到YooAsset实战路径

Unity资源管理是游戏与实时3D应用开发中的核心工程能力,其本质是解决资源加载、内存控制、热更交付与跨平台兼容等系统性问题。底层原理围绕AssetBundle容器机制、Addressable的Catalog依赖图谱、YooAsset的分层加载管线展开,技术价值体现在热更成功率提升、内存峰值可控、CDN调度灵活及多端适配稳定。典型应用场景包括微信小游戏包体压缩、AR工业应用GB级点云流式加载、数字孪生平台多源异构数据动态集成。本文聚焦Unity资源管理演进中的关键决策逻辑与真实项目避坑经验,深入解析Asse

weixin_34320159的博客 247

AssetBundle之服务端资源加载

我把AssetBundless整个文件的资源都放在了我的web服务器上,里面除了有AssetBundless自身的4个文件之外,还有player和plane各4个文件。将本地打包好的AssetBundle 文件上传至web 服务器,然后本地从web 服务器端下载所有的AssetBundle 文件。从服务器端下载AssetBundle 文件,我们需要这些文件的web 路径地址,每一个地址对应一个As...

嘿嘿 422

从零到一:AnythingLLM与Ollama的本地知识库搭建实战

本文详细介绍了如何使用AnythingLLM与Ollama从零开始搭建本地知识库,涵盖技术选型、环境部署、系统配置及优化策略。通过RAG技术架构,实现安全高效的文档管理与智能问答,特别适合企业及个人构建私有化知识管理系统。

weixin_29079643的博客 562

Unity5系列资源管理AssetBundle——加载

上次我们进行了AssetBundle打包,现在我们还把打包的资源加载到我们的游戏中。在加载之前,我们需要把打包好的Bundle包裹放到服务器上,如果没有,也可以使用XAMPP搭建本地服务器。 加载的AssetBundle文件是放在内存中的,所以如果没有很好的管理,会使游戏性能大打折扣,因此,我们在这里最好使用缓存策略。 我们的AssetBundle: 1 using Syst...

244

迪文DGUSII串口屏中文显示实战:手把手教你制作16x16点阵字库

本文提供了一份迪文DGUSII串口屏16x16点阵中文字库制作的完整实战指南。从显示原理、字体选择与参数设置,到使用FontLib Make工具生成字库文件,再到部署、调用及存储空间优化,手把手教你解决中文显示难题,确保界面文字既美观又稳定。

weixin_29190573的博客 152

VirusTotal API密钥获取与Python实战:从注册到自动化威胁分析

在网络安全和自动化运维领域,API(应用程序编程接口)是实现系统间数据交互与功能集成的核心技术。其工作原理是通过预定义的协议和端点,允许程序化访问特定服务的数据与功能。对于安全工程师和威胁分析师而言,API的价值在于能够将手动、重复的安全操作(如文件扫描、情报查询)转化为自动化工作流,从而极大提升威胁检测与响应的效率。一个典型的应用场景是集成第三方威胁情报平台,以实现对可疑文件、URL或哈希值的批量与实时分析。本文聚焦于全球知名的威胁情报服务VirusTotal,详细解析其API密钥的注册流程、安全配置要点

weixin_28707739的博客 418

Unity网络资源下载实战:基于RestClient的图片、音频与AssetBundle高效加载方案

在Unity应用与游戏开发中,网络资源动态加载是支撑内容更新、丰富用户体验的核心技术。其原理是通过HTTP/HTTPS协议,从远程服务器异步获取文件数据,并转换为引擎可用的资源对象。这项技术的价值在于实现了资源的远程管理与按需加载,是构建可更新应用、减少初始包体、丰富内容生态的基石,广泛应用于游戏热更新、动态UI、媒体内容加载等场景。本文将聚焦Unity开发,深入解析如何利用RestClient这一基于Promise的HTTP客户端,高效、可靠地完成图片(Texture2D)、音频(AudioClip)及热

weixin_34060299的博客 322

深入解析以太网接口中的BOB Smith电路设计

本文深入解析以太网接口中的BOB Smith电路设计,详细介绍了其在共模噪声抑制、浪涌防护和EMI优化中的关键作用。通过实际案例和设计要点,帮助工程师正确选择75Ω电阻和高压电容等元件,优化PCB布局,解决电压型与电流型PHY的设计差异,以及千兆与百兆以太网的特殊考量。

weixin_28339967的博客 684

[unity]AssetBundle加载

加载 大致经历以下过程 WWW AssetBundle Asset WWW 加载:通过url加载 内存大小: 压缩资源:翻倍(为什么会得出翻倍?) 非压缩:几乎相同 内存对象:WebStream AssetBundle 加载:随着WWW加载,第一次访问的时候会在内存生成一个SerializeFile,内存也会跟着增加0

xv_ly15的专栏 629

手把手教你离线部署bert-base-uncased模型(附完整文件清单)

本文提供了一份详尽的bert-base-uncased模型离线部署指南。针对严格内网或无网络环境,文章不仅列出了包括config.json、pytorch_model.bin在内的完整必需文件清单,还详细解释了每个文件的作用,并给出了使用snapshot_download工具或手动下载的两种文件获取方法。重点阐述了如何正确设置本地路径、编写健壮的加载代码,并通过多层次验证确保模型在离线环境下成功运行,有效解决了部署过程中常见的文件缺失和路径错误问题。

weixin_29034963的博客 318

主板USB接口全部失效解决方案(通用串行总线USB控制器有黄色叹号)保姆级教程亲测有效

通用串行总线控制器总是有叹号解决办法 办公室的崩腾时代老电脑,疫情期间没人用,来了开机之后发现鼠标键盘都用不了,本以为是主机放时间长出了问题,后来想起来就百度了“鼠标键盘都失效”的标题,结果发现了“串行总线控制器总是感叹号”的关联问题。正好办公室电脑都装有teamviwer常用来远程办公(在家偷懒)。所以通过远程发现电脑室可以运行的。并在控制面板发现:通用串行总线控制器总是感叹号,插入外设时USB无反应。如图:​ 并且右键选中其中一个,点击最后一个选项:“属性” 可以发现“设备状态”中会提示“由...

xiao_bai_0_0的博客 2万+

U3D assetbundle加载

U3D assetbundle加载 1 using UnityEngine; 2 using System.Collections; 3 public class testLoadFromAB : MonoBehaviour { 4 5 IEnumerator DownloadAndCache() 6 { 7 whi...

c1sdn19的专栏 118

华为OD机试真题 新系统【查找温度记录统计信息】

华为OD机试 新系统真题【查找温度记录统计信息】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【查找温度记录统计信息】多语言题解。

qq_45776114的博客 485

AssetBundle应用分享

AssetBundle应用按照步骤命名打包资源加载AssetBundle 按照步骤 命名 使用AssetBundle最先注意到的便是资源的命名。 最普通的命名方式,便是: 如图上标识的地方直接手动输入,命名。 但如果资源量较大时,这种方式会很枯燥、繁琐,而且自己想对应的名字,也是件很头疼的事情。所以,我便使用了代码的方式,实现了批量的资源命名。 using System.IO; using Un...

天富儿的博客 220

win10锁屏或登录时会自动弹出触摸按键的问题解决办法

本篇文章主要讲解win10锁屏或登录时会自动弹出触摸按键的问题解决方式。日期:2023年5月17日作者:任聪聪。

任聪聪的博客 1万+

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

AssetStudio:Unity资源提取与AssetBundle解包的专业工具指南

AssetStudio作为一款专业的Unity资源提取工具,为开发者和资源管理爱好者提供了强大的AssetBundle解包能力。无论您需要处理纹理、音频、模型还是脚本资源,这款工具都能帮助您高效完成Unity资源探索与管理任务。 ## 🚀 极速安装配置指南 ### 一键获取项目源码 想要立即开始使用AssetStudio?通过以下命令快速获取最新版本: ```bash git clone

gitblog_00976的博客 1176

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

unity 加载资源

Unity3D中的资源的处理种类 Unity中的资源资源的处理种类大致分为:Resources、StreamingAssets、AssetBundle Resources 是作为一个Unity的保留文件夹出现的,也就是如果你新建的文件夹的名字叫Resources,那么里面的内容在打包时都会被无条件的打到发布包中。 特点: 只读,即不能动态修改。所以想要动态更新的资源不要放在...

dingwen9398的博客 254

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Unity 资源打包Assetbundle

在手游的运营过程中,更新资源是比不可少的。资源管理第一步是资源打包。传统的打包可以将所有物件制成预设Prefab,打包成场景。今天我们来一起学习官方推荐的Assetbundle,它是Unity(Pro)提供的资源打包策略。利用AssetBundle,可以将几乎所有的资源都打包封装,便于客户端更新下载新的资源。 (转载请注明原文出处http://blog.csdn.net/janeky/art

u010291222的博客 543

[Unity]AssetBundle资源更新以及多线程下载

此文章适合不太了解资源加载的萌新,有了入门基础之后再去github上搜大牛写的专业的资源加载方案才能得心应手,不然的话会看的很吃力或者说一脸懵逼。Unity里面关于资源加载我们都知道是下载更新AssetBundle,关于AssetBundle我之前的文章已经详细介绍过,没看过的朋友可以在看一下。下面介绍的资源加载的Demo有以下几点:  1.WWW下载图片资源  2.HTTP下载apk文件,并

Unity 1094

Unity3D研究院之Assetbundle的实战

[雨松MOMO] Unity3D研究院之Assetbundle的实战(六十三) 上一篇文章中我们相惜讨论了Assetbundle的原理,如果对原理还不太了解的朋友可以看这一篇文章:Unity3D研究院之Assetbundle的原理(六十一)本篇文章我们将说说assetbundle是如何实现的。1.创建Assetbundle         无论是模型资源还是UI资源,最好是先把他们放在Prefab中

u010707274的博客 480

YooAsset资源配置实战:从零构建高效AssetBundle收集器

本文详细介绍了如何使用YooAsset的AssetBundle Collector进行高效资源配置,从基础配置到高级技巧全面覆盖。通过实战案例展示了Package创建、Group管理、Collector选择等核心功能,帮助开发者优化资源打包策略,提升游戏开发效率。特别适合中小型团队和独立开发者掌握AssetBundle管理的最佳实践。

wind6的博客 710

Unity的WebGL发布在IIS上并加载资源的若干问题

一、前言 本此使用的Unity版本位2018.4.26,ISS为win10自带的版本。首先,在使用Unity的Webgl的时候我们就会遇到这几个问题: 1)无法直接打开,如果像Exe程序那样Build之后直接点index.html文件是无法运行的,会在浏览器中弹出如图1提示:显然,我们是不能这样直接打开webgl程序,当然,你可以选择直接BuildandRun,打包完之后会直接在浏览器中运行,可以看到此时运行的webgl程序的网址 图1 和直接点index.html文件的地址不一样,这...

Just do IT 3966

Unity教程之-Unity5.x版本AssetBundle加载研究

之前说了 “unity4.x版本AssetBundle打包研究”,没看过的请先看一下《Unity教程之-Unity3d打包Assetbundle并加载》,再来看本文,有一定的连接性。 先梳理一下思路: 要加载一个资源A,必须先去加载它的所有依赖资源 要知道这个资源A依赖了哪些资源,必须先去加载AssetBundleManifest 通过AssetBundleManifest对象的GetAl

RainsSoft 4505

【JVM】对象内存布局

HotSpot JVM 中,Java 对象内存布局由对象头(12字节,含Mark Word与压缩Klass Pointer)、实例数据及对齐填充构成,总大小为8字节倍数。对象头支持锁状态动态复用,指针压缩使引用仅4字节,但堆超32GB时失效。实例字段按类型优先级重排序以减少间隙,最小对象大小为16字节。通过JOL工具可精准验证布局,理解锁机制、GC、伪共享等底层行为。

2301_79732484的博客 148
上一篇: 25.Editor 资源加载:基本实现
下一篇: 27.Assetbundle资源加载:优化重复加载
Unity黑马王子
博客等级 码龄4年 1846粉丝 181原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值