在 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. Linux基础常识

    1 什么是shell shell是Linux系统的用户界面,提供了用户与内核交互的一种接口,它接收用户输入的命令并到送到内核去执行,因此也被称为Linux的命令解释器. 显示系统当前使用的shell ...

  2. MySQL查询BLOB类型的字段

    1.MySQL有四种BLOB类型: 1.TinyBlob 最大能容纳255B的数据 2.Blob 最大能容纳65KB的 3.MediumBlob 最大能容纳16MB的数据 4.LongBlob 最大能 ...

  3. Nginx 配置 浏览器显示真实接口地址

    server { listen 9780; server_name localhost; #charset koi8-r; access_log /var/log/nginx/host.access. ...

  4. 解决Delphi应用程序向桌面资源管理拖放问题 win10,winxp,win2003测试成功

    解决Delphi应用程序向桌面资源管理拖放问题 win10,winxp,win2003测试成功 如果是实体拖动,是比较好解决的. 如果是虚拟应用程序数据,拖动到本机桌面或资源管理器目录下,获取目录路径 ...

  5. 性能调优、虚拟机、垃圾回收、软硬件协调相关文章和视频 — Part1

    本文由 ImportNew - 顾星竹 翻译自 javacodegeeks.如需转载本文,请先参见文章末尾处的转载要求. ImportNew注:如果你也对Java技术翻译分享感兴趣,欢迎加入我们的 J ...

  6. Elasticsearch之常见问题

    一. 聚合操作时,报Fielddata is disabled on text fields by default GET /megacorp/employee/_search { "agg ...

  7. @EnableAutoConfiguration 标签使用

    @EnableAutoConfiguration 这个注解的作用是: 从classpath中搜索所有META-INF/spring.factories配置文件然后,将其中org.springframe ...

  8. Vue 二维码组件

    1.前言 该组件依赖qrcode.js与element-ui 支持二维码大小配置,点击大图预览 该组件以vue文件形式进行封装,需要配置httpVueLoader插件进行引入,其他格式请自行更改源码 ...

  9. 题解 ICPC 2019 SH 区域赛 F 树上简单问题

    题解 ICPC 2019 SH 区域赛 F 树上简单问题 CF的Gym里没找着 牛客的题目链接 首先这个题多测非常SB, 每次都要清空, 需要特别注意. 树剖应该都会吧, Defad之后也会发博客讲解 ...

  10. .NET 使用 ZXing.Net 生成二维码,并识别

    .NET 使用 ZXing.Net 生成二维码,并识别 前言 前面已经分享给很多创建二维码,条形码...等一系列的方式 各有优缺点,暂时不做评价.今天推荐ZXing.Net .也是比较全面的一种方式, ...