在 Unity 中,使用 AssetBundle 加载图集(Atlas)并获取其中的所有 Sprite 图片,通常需要以下步骤:


1. 打包图集到 AssetBundle

首先,确保你的图集(Atlas)已经被打包到 AssetBundle 中。图集通常是一个包含多个 Sprite 的纹理(Texture),并且每个 Sprite 都有对应的元数据(如 UV 坐标、Pivot 等)。


2. 加载 AssetBundle

使用 AssetBundle.LoadFromFile 或 AssetBundle.LoadFromMemoryAsync 等方法加载 AssetBundle。

using UnityEngine;
using System.Collections; public class LoadSpriteFromAssetBundle : MonoBehaviour
{
private AssetBundle assetBundle; IEnumerator Start()
{
string path = Application.streamingAssetsPath + "/your_assetbundle_name";
var request = AssetBundle.LoadFromFileAsync(path);
yield return request; assetBundle = request.assetBundle;
if (assetBundle == null)
{
Debug.LogError("Failed to load AssetBundle");
yield break;
} // 加载图集中的所有 Sprite
LoadSpritesFromAtlas();
}
}

3. 加载图集中的所有 Sprite

图集通常是一个包含多个 Sprite 的纹理(Texture)。你可以通过以下方式加载图集中的所有 Sprite:

方法 1:使用 LoadAllAssets<Sprite>

如果图集中的 Sprite 被打包为独立的资源,可以使用 LoadAllAssets<Sprite> 方法加载所有 Sprite。

private void LoadSpritesFromAtlas()
{
// 加载图集中的所有 Sprite
Sprite[] sprites = assetBundle.LoadAllAssets<Sprite>(); foreach (Sprite sprite in sprites)
{
Debug.Log("Loaded Sprite: " + sprite.name);
// 可以将 Sprite 赋值给 UI Image 或其他用途
}
}

方法 2:加载图集纹理并手动分割

如果图集是一个单独的纹理,并且 Sprite 的元数据没有被打包到 AssetBundle 中,你需要手动加载纹理并根据 UV 坐标分割 Sprite。

private void LoadSpritesFromAtlas()
{
// 加载图集纹理
Texture2D atlasTexture = assetBundle.LoadAsset<Texture2D>("atlas_texture_name"); // 假设你知道图集中每个 Sprite 的 UV 坐标和大小
Rect[] spriteRects = new Rect[]
{
new Rect(0, 0, 64, 64), // Sprite 1 的 UV 坐标和大小
new Rect(64, 0, 64, 64), // Sprite 2 的 UV 坐标和大小
// 添加更多 Sprite 的 UV 坐标
}; // 创建 Sprite
foreach (Rect rect in spriteRects)
{
Sprite sprite = Sprite.Create(atlasTexture, rect, new Vector2(0.5f, 0.5f));
Debug.Log("Created Sprite: " + sprite.name);
// 可以将 Sprite 赋值给 UI Image 或其他用途
}
}

4. 卸载 AssetBundle

private void OnDestroy()
{
if (assetBundle != null)
{
assetBundle.Unload(false); // false 表示不卸载从 AssetBundle 加载的资源
}
}

注意事项

  1. 图集打包方式

    • 如果图集中的 Sprite 被打包为独立的资源,可以直接使用 LoadAllAssets<Sprite>

    • 如果图集是一个单独的纹理,需要手动分割 Sprite。

  2. AssetBundle 依赖

    • 如果图集依赖于其他资源(如材质、Shader 等),确保这些依赖资源也被正确加载。

  3. 内存管理

    • 加载 AssetBundle 后,及时卸载不再需要的资源,避免内存泄漏。

  4. 异步加载

    • 如果 AssetBundle 较大,建议使用异步加载(如 LoadFromFileAsync)以避免卡顿。


完整示例

以下是一个完整的示例代码:

using UnityEngine;
using System.Collections; public class LoadSpriteFromAssetBundle : MonoBehaviour
{
private AssetBundle assetBundle; IEnumerator Start()
{
string path = Application.streamingAssetsPath + "/your_assetbundle_name";
var request = AssetBundle.LoadFromFileAsync(path);
yield return request; assetBundle = request.assetBundle;
if (assetBundle == null)
{
Debug.LogError("Failed to load AssetBundle");
yield break;
} // 加载图集中的所有 Sprite
LoadSpritesFromAtlas();
} private void LoadSpritesFromAtlas()
{
// 加载图集中的所有 Sprite
Sprite[] sprites = assetBundle.LoadAllAssets<Sprite>(); foreach (Sprite sprite in sprites)
{
Debug.Log("Loaded Sprite: " + sprite.name);
// 可以将 Sprite 赋值给 UI Image 或其他用途
}
} private void OnDestroy()
{
if (assetBundle != null)
{
assetBundle.Unload(false); // false 表示不卸载从 AssetBundle 加载的资源
}
}
}

通过以上方法,你可以从 AssetBundle 中加载图集并获取其中的所有 Sprite 图片。

unity assetbundle 加载图集的所有sprite图片的更多相关文章

  1. Unity动态加载和内存管理(三合一)

    原址:http://game.ceeger.com/forum/read.php?tid=4394#info 最近一直在和这些内容纠缠,把心得和大家共享一下: Unity里有两种动态加载机制:一是Re ...

  2. AssetBundle加载API

    AssetBundle加载API 在Unity 5当中,可以通过4个不同的API来加载AssetBundle,4个API可以用两个条件来区分: AssetBundle是 LZMA压缩. LZ4压缩还是 ...

  3. unity动态加载(翻译) .

    AssetBundles are files which you can export from Unity to contain assets of your choice. These files ...

  4. 细谈unity资源加载和卸载

    转载请标明出处:http://www.cnblogs.com/zblade/ 一.概要 在了解unity的资源管理方式之后,接下来细谈一下Unity的资源是如何从磁盘中加载到运行时的内存中,以及又是如 ...

  5. Dll的编写 在unity中加载

    1. 在VS中新建Dll项目 2.在头文件中对函数进行声明 extern "C" int _declspec(dllexport) testunity(); 3.在源文件中写函数体 ...

  6. wp加载本地HTML(附带图片,CSS,JS)

    wp加载本地HTML(附带图片,CSS,JS) Windows Phone:Load Local HTML with Img,Css,Js by 唐小崇 http://www.cnblogs.com/ ...

  7. 测试页面,页面里边一次加载50张不同的图片,每张5M以上,查看浏览器的内存使用情况

    测试页面 1.需要你写个测试页面,页面里边一次加载50张不同的图片,每张5M,查看浏览器的内存使用情况 2.可以10张 递增的方式测试 3.图片需要缩放,比如所有图片缩放成600*800的比例 目的 ...

  8. jquery文档加载几种写法,图片加载写法

    jquery文档加载写法: $(function(){ }) ; //个人最常使用方式 $(document).ready(function(){ }); //调用文档对象下的ready方法传入一个函 ...

  9. RecyclerView加载更多用notifyDataSetChanged()刷新图片闪烁

    首先来看看对比ListView看一下RecyclerView的Adapter主要增加了哪些方法: notifyItemChanged(int position) 更新列表position位置上的数据可 ...

  10. 动态加载/删除css文件以及图片预加载

    动态加载/删除css文件以及图片预加载   功能模块页面   最近,工作中遇到了一个比较奇葩的需求:要在一个页面(PC端)增加一个功能模块,但是这个页面在不久之后要重构,为了新增加的模块可以继续复用, ...

随机推荐

  1. 反思---树上LIS

    反思---树上LIS 题目描述 给你一棵 n个节点的树,树的每个节点上都有一个值 a[i] . 现在要您求出从 1 号点到 i 号点的最短路径上最长上升子序列的长度. 就是单调栈优化+dfs回溯 对比 ...

  2. "安装VMware Tools"显示灰色的解决办法

    用VMware Workstation Pro好几年了,期间这个问题也遇到过好几次,这次把解决方案记录一下,若后续有其他情况其他解决方案将在此博文更新. Step1:关闭虚拟机: Step2:在虚拟机 ...

  3. composer 基础操作

    一.composer入门 1.每次安装新的包文件,会更新/vendor/autoload.php文件 2.composer.lock与composer.json的关系 文件composer.lock会 ...

  4. 根据不同的dpi 媒体查询

    /* 默认样式 */ .element { width: 100px; height: 100px; background-color: blue; } /* 当设备像素比为1.5时,调整.eleme ...

  5. Docker配置Trojan代理

    1.遇到的问题 在做云计算作业,使用阿里云的ECS服务器尝试使用docker拉取镜像的时候,发现一直无法从仓库拉取,更换了多个镜像源也没有解决问题,于是决定学会去配置linux的代理,记录过程. 2. ...

  6. 2023NOIP A层联测31 T4 民主投票

    2023NOIP A层联测31 T4 民主投票 思维好题. 思路 首先可以设 \(s\) 每个人最多获得的票数,一开始所有点都把自己的票投给自己父亲. 如果一个点的票数超过 \(s\) 了,那么这个点 ...

  7. 从零开始学机器学习——K-Means 聚类

    首先给大家介绍一个很好用的学习地址:https://cloudstudio.net/columns 在上一章节中,我们重点探讨了聚类的可视化分析方法,帮助我们更好地理解数据之间的关系和结构.今天,我们 ...

  8. Nuxt.js 应用中的 webpackConfigs 事件钩子

    title: Nuxt.js 应用中的 webpackConfigs 事件钩子 date: 2024/11/20 updated: 2024/11/20 author: cmdragon excerp ...

  9. QT6.8 编译 MSVC2022-64位MySQL驱动

    QT6.8没有编译MySql驱动,也没有.pro的项目文件,只能自己想办法编译,网上找了很多方法,终于找到了可以成功编译的方法,下面将我的编译过程详细记录如下: [声明:本文为原创,未经允许,不得转载 ...

  10. ibatis源码学习(一)整体设计和核心流程

    本文主要从ibatis框架的基本代码骨架进行切入,理解ibatis框架的整体设计思路,各组件的实现细节将在后文进行分析. 背景  介绍ibatis实现之前,先来看一段jdbc代码:  Class.fo ...