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


1. 打包图集到 AssetBundle

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


2. 加载 AssetBundle

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

  1. using UnityEngine;
  2. using System.Collections;
  3.  
  4. public class LoadSpriteFromAssetBundle : MonoBehaviour
  5. {
  6. private AssetBundle assetBundle;
  7.  
  8. IEnumerator Start()
  9. {
  10. string path = Application.streamingAssetsPath + "/your_assetbundle_name";
  11. var request = AssetBundle.LoadFromFileAsync(path);
  12. yield return request;
  13.  
  14. assetBundle = request.assetBundle;
  15. if (assetBundle == null)
  16. {
  17. Debug.LogError("Failed to load AssetBundle");
  18. yield break;
  19. }
  20.  
  21. // 加载图集中的所有 Sprite
  22. LoadSpritesFromAtlas();
  23. }
  24. }

3. 加载图集中的所有 Sprite

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

方法 1:使用 LoadAllAssets<Sprite>

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

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

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

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

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

4. 卸载 AssetBundle

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

注意事项

  1. 图集打包方式

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

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

  2. AssetBundle 依赖

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

  3. 内存管理

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

  4. 异步加载

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


完整示例

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

  1. using UnityEngine;
  2. using System.Collections;
  3.  
  4. public class LoadSpriteFromAssetBundle : MonoBehaviour
  5. {
  6. private AssetBundle assetBundle;
  7.  
  8. IEnumerator Start()
  9. {
  10. string path = Application.streamingAssetsPath + "/your_assetbundle_name";
  11. var request = AssetBundle.LoadFromFileAsync(path);
  12. yield return request;
  13.  
  14. assetBundle = request.assetBundle;
  15. if (assetBundle == null)
  16. {
  17. Debug.LogError("Failed to load AssetBundle");
  18. yield break;
  19. }
  20.  
  21. // 加载图集中的所有 Sprite
  22. LoadSpritesFromAtlas();
  23. }
  24.  
  25. private void LoadSpritesFromAtlas()
  26. {
  27. // 加载图集中的所有 Sprite
  28. Sprite[] sprites = assetBundle.LoadAllAssets<Sprite>();
  29.  
  30. foreach (Sprite sprite in sprites)
  31. {
  32. Debug.Log("Loaded Sprite: " + sprite.name);
  33. // 可以将 Sprite 赋值给 UI Image 或其他用途
  34. }
  35. }
  36.  
  37. private void OnDestroy()
  38. {
  39. if (assetBundle != null)
  40. {
  41. assetBundle.Unload(false); // false 表示不卸载从 AssetBundle 加载的资源
  42. }
  43. }
  44. }

通过以上方法,你可以从 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. Power BI 通过输入数据新建表后重新进入编辑状态

    在使用Power BI时,有时候我们会直接通过输入数据构建一些简单的表,但是构建好后我们可能还需要对表格进行增删改的操作,这时候我们需要怎么才会恢复到表格的编辑状态呢?其实很简单,我们回到PQ里面,双 ...

  2. 鸿蒙Banner图一多适配不同屏幕

    认识一多 随着终端设备形态日益多样化,分布式技术逐渐打破单一硬件边界,一个应用或服务,可以在不同的硬件设备之间随意调用.互助共享,让用户享受无缝的全场景体验.而作为应用开发者,广泛的设备类型也能为应用 ...

  3. .NET 9 发布 性能提升、AI 支持与全方位改进

    前言 .NET 9 正式发布,这是迄今为止最高效.现代.安全.智能且高性能的 .NET 版本. 新版本凝聚了全球数千名开发者的共同努力,包含了数千项性能.安全性和功能性改进. 主要亮点 性能提升:全面 ...

  4. IDEA常用插件推荐

    IDEA支持特别多的插件,今天记录一下我常用的插件.欢迎在评论区推荐更多插件!!! 1.Translation - 必备翻译插件 基于 IntelliJ 的 IDE 的翻译插件 推荐指数: 插件链接: ...

  5. mysql8创建用户

    create user test_user@'%' identified by 'test2022@'; grant all privileges on test.* to test_user@'%' ...

  6. MySQL创新版9.1.0于2024年10月15日正式发布-新功能特性先睹为快[译]

    这个十月发布的版本是MySQL宣布转向新的LTS/Innovation发布模式后的第三个长期支持(LTS)版本和第二个创新(Innovation)版本.更多细节请参见MySQL发布:创新和长期支持.在 ...

  7. YOLOv8-PyQT5可视化界面

    使用PyQT5实现YOLOv8图形化界面 准备工作: 1.首先在YOLOv8环境中安装pyqt5 pip install pyqt5 pip install pyqt5-tools 然后再你的anac ...

  8. 基于golang的swagger

    Swagger 相关的工具集会根据 OpenAPI 规范去生成各式各类的与接口相关联的内容,常见的流程是编写注解 =>调用生成库->生成标准描述文件 =>生成/导入到对应的 Swag ...

  9. Golang常见问题汇总

    在开始使用golang的时候,经常会遇到各种问题,总结在此 1.unrecognized import path "golang.org/x/.. golang 在 github 上建立了一 ...

  10. 如何在wpf窗口中播放PPT。

    前一段时间接到一个需求(大概内容讲一下): 将PPT播放窗口嵌入到我们的系统中,用自己系统控制PPT的播放,在PPT页面上可以手写将手写内容记录下来. 一开始,对于WPF还是一个彩笔的我是懵逼的.后来 ...