在 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. 洛谷:P5707 【深基2.例12】上学迟到 (纯净的顺序结构方法)

    本内容纯作者吃饱了没事干做出来的,仅供娱乐和思路参考(当然代码肯定是AC了) 最近我想重新提升一下自己的编程能力,想选一个题量比较精炼的平台,所以就用了洛谷. 题目描述 学校和 yyy 的家之间的距离 ...

  2. JAVA 两个时间 相差的 小时,天数,分钟

    long nd = 1000 * 24 * 60 * 60; //每天毫秒数 long nh = 1000 * 60 * 60; //每小时毫秒数 long nm = 1000 * 60; //每分钟 ...

  3. 鸿蒙hvigor构建任务依赖与生命周期简介

    Hivgor脚本文件 在构建的生命周期中Hvigor使用两个脚本文件来完成插件.任务以及生命周期hook的注册: hvigorconfig.ts:此文件在整个项目中只有根目录下存在一份,不是构建必须的 ...

  4. (Python基础教程之二)在Sublime Editor中配置Python环境

    Python基础教程 在SublimeEditor中配置Python环境 Python代码中添加注释 Python中的变量的使用 Python中的数据类型 Python中的关键字 Python字符串操 ...

  5. 一个关于CountDownLatch的并发需求

    需求 A,B,C可并发运行,全部成功才算成功,一个失败全员回滚. 思考 使用CountDownLatch,可以保证三个线程结束后,才进行提交成功状态.但是怎么才能判断某个任务失败了呢? 捕获子线程异常 ...

  6. kettle 使用 CARTE 执行

    在执行KETTLE 任务的时候,可以使用本地执行,或者使用carte server执行. 1.启动carte server .\Carte.bat localhost 8080 2.配置子服务器 这里 ...

  7. PLC编程—编程语言

    LAD:图形编程语言(电路图表示法--梯形图). FBD:图形编程语言(电路系统表示法--功能块图). SCL:结构化编程语言之一. STL:文本编程语言. 常用的指令 位.定时.计数.比较.数学.赋 ...

  8. .NET静态代码编织——肉夹馍(Rougamo)5.0

    肉夹馍(https://github.com/inversionhourglass/Rougamo),一款编译时AOP组件.相比动态代理AOP需要在应用启动时进行初始化,编译时完成代码编织的肉夹馍减少 ...

  9. Qt 在线程中invokeMethod采用QueuedConnection模式,调用带指针参数槽,实际不会调用

    widgetObject有操函数Test: void Test(int *v); 在线程中调用Test,会被忽略,实际不会调用. QMetaObject::invokeMethod(widgetObj ...

  10. Kettle设置定时跑任务

    1.Kettle设置作业 保存,test.kjb 2. 创建批处理 zxjb.bat C: cd C:\kettle\pdi-ce-9.4.0.0-343\data-integration kitch ...