首页 > 其他分享 >unity assetbundle 加载图集的所有sprite图片

unity assetbundle 加载图集的所有sprite图片

时间:2025-01-11 18:11:40浏览次数:1  
标签:sprite AssetBundle unity assetbundle assetBundle Sprite 图集 加载

 

在 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 图片。

标签:sprite,AssetBundle,unity,assetbundle,assetBundle,Sprite,图集,加载
From: https://www.cnblogs.com/flamesky/p/18666060

相关文章

  • 偶然看到Unity引擎中托管堆的扩展策略,于是想挖掘这个策略的巨大隐患
    导语Unity引擎中托管堆的扩展策略看起来非常不错,但是深究下去存在巨大隐患,下面我们带大家通过非常简单的案例让其暴露出来。unity引擎托管堆扩展策略在Unity引擎中,托管堆的扩展策略是一个重要的主题,尤其是在开发大型游戏或应用程序时。托管堆是用于存储托管对象的内存......
  • unity下零GC反射实现思路
    C#反射GC怎么产生的?C#的反射API确实在某些情况下会导致频繁的垃圾回收(GC),尤其是在使用MethodInfo.Invoke等方法时。反射API的设计使得值类型在传递时需要进行装箱(boxing),这会导致额外的内存分配,从而增加GC的压力。反射导致GC的原因装箱和拆箱:当值类型(如int、......
  • Unity Android 调用 so 卡死问题 (so 编译踩坑)
    问题描述把Unity工程编译到Android上运行后,出现了一个必现的界面卡死bug。表现为:每次轮到自己出大招时,必现界面卡死,但程序不会crash。在Unity编辑器和iOS下都无法重现。分析日志发现,卡死前最后调用了算法库中的一个函数。算法库是c++写的,用cmake组织,编译成......
  • Windows下Dll在Unity中使用的一般方式
    Windows下Dll在Unity中使用的一般方式Unity中虽然已经有广泛的库和插件,但是相较于C++的库生态而言,还是有一定的差距;因此本篇博文记录Windows下将C++函数打包成动态链接库在Unity中使用的一般方法。环境VisualStudio2019,Unity2022,Windows11,OpenCV说明Unity中有针对Wind......
  • Unity URP Shader Graph 实现复古电视机效果
    想到一出实现一出的复古电视机效果实现。复古电视机效果显示展示:使用素材一张纹理需要放映的图片,一张遮罩贴图,一个电视机模型。UV使用Spherize模拟电视机球状显示屏。扫描线A效果扫描线B效果像素化/随机UV偏移屏幕做旧效果边缘变暗效果屏幕黑边效果自制一张合适......
  • 理解Unity脚本编译过程:程序集
    https://docs.unity3d.com/Manual/script-compilation.html关于UnityC#脚本编译的细节,其中一个比较重要的知识点就是如何自定义Assembly。预定义的assembly默认情况下,Unity会按照这个规则进行编译。PhaseAssemblynameScriptfiles1Assembly-CSharp-firstpassRuntimes......
  • 【c# Unity-Shader版本贪吃蛇教程】一张Plane渲染的Shader贪吃蛇
    前言    开局一张plane,其余靠shader编。本游戏为shader绘制贪吃蛇,没有3D模型,想了解3D版本的开发,可以跳转到【c#Unity贪吃蛇教程】    已经是第五期C#不同平台制作贪吃蛇了,前三期分别是【c#控制台贪吃蛇教程】、【c#winform贪吃蛇教程】、【c#WPF贪吃蛇教......
  • C# 类(Class)及其在 Unity 引擎开发中的应用总结
    1.什么是C#类?在C#中,类(Class)是一种用户定义的数据结构,用于封装一组数据(字段)和操作数据的方法。类是面向对象编程(OOP)的核心,它支持封装、继承和多态等特性。1.1类的基本结构一个类通常由以下部分组成:字段(Fields):存储数据或状态。属性(Properties):封装字段,提供安全的访......
  • C# 多态性及其在 Unity 引擎开发中的应用总结
    1.什么是多态性?多态性(Polymorphism)是面向对象编程(OOP)的核心特性之一,指同一个接口或方法可以根据对象的不同类型表现出不同的行为。多态性通常通过继承和接口实现,主要体现在以下两种形式:方法重写(Override):子类通过重写父类的虚方法实现不同的行为。方法重载(Overload):......
  • Unity QFrameWork--IOC
    IOCContainerusingSystem;usingSystem.Collections.Generic;namespaceQFramework{publicclassIOCContainer{///<summary>///存储实例///</summary>publicDictionary<Type,object>mInstances=ne......