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

posted @ 2025-01-11 17:57 Flamesky 阅读(227) 评论(0) 推荐(0) 编辑
摘要: 行为树是在游戏开发中常见的业务解决方案。 可用于在怪物AI、新手引导、技能逻辑和机器人等模块中进行可视化的流程控制。行为树就其运行过程可分为轮询驱动与事件驱动两种,前者会在每个节点上有一个Update方法用于返回当前节点状态(正在运行、运行成功或运行失败),对于当前所有行为树对象正在运行的所有节点, 阅读全文
posted @ 2024-12-31 16:00 Flamesky 阅读(45) 评论(0) 推荐(0) 编辑
摘要: 效果如图,项目来源于 yoshi389111/github-profile-3d-contrib: This GitHub Action creates a GitHub contribution calendar on a 3D profile image. 1. 创建自己的github主页属性项 阅读全文
posted @ 2024-12-23 17:53 Flamesky 阅读(30) 评论(0) 推荐(0) 编辑
摘要: 首先运行 consul 下载 consul 以开发模式运行 consul agent -dev 2. 调试 用 Visual Studio 2022 IDE 打开项目; 右击解决方案-选择“属性” 在属性界面下,选择多项目启动, News.Server, Auth.Server, Register. 阅读全文
posted @ 2024-12-10 20:22 Flamesky 阅读(316) 评论(0) 推荐(0) 编辑
摘要: 网关提供外部访问内部微服务的统一入口,基于分布式和服务治理等功能特点,外部不能绕过网关调用内部微服务(框架本身提供外部可以直接访问内部微服务的功能,这里不作详细说明),外部通过 http 协议请求网关暴露的接口,网关再用基于 TCP/IP 协议的 RPC 方式调用内部被发现的微服务。 1 创建网关 阅读全文
posted @ 2024-12-03 11:18 Flamesky 阅读(502) 评论(0) 推荐(2) 编辑
摘要: 导语: 表现丰富、机制多变的技能作为MMORPG游戏战斗体验的核心组成部分,是吸引玩家的一大亮点,本文总结了在MMORPG技能系统设计上的一些经验,供大家参考。 1、设计思路 早期的MMORPG手游中,技能的表现相对简单,因此技能流程被分为几个固定的阶段(如准备阶段、攻击阶段、受击阶段),可以实现成 阅读全文
posted @ 2024-11-23 12:00 Flamesky 阅读(448) 评论(0) 推荐(2) 编辑
摘要: 探讨 Unity 实时多人游戏的现状,不同游戏类型中的不同网络架构。 网络架构模式 游戏开发者使用各种网络架构模式来确保多人游戏中玩家之间可靠且快速的互动。每种模式都有其自身的优缺点,选择合适的模式取决于您正在使用的特定游戏类型和互动场景。 在本节中,我们将讨论以下模式:锁步、回滚、快照插值和延迟补 阅读全文
posted @ 2024-11-19 11:42 Flamesky 阅读(855) 评论(0) 推荐(2) 编辑
摘要: 提供新闻浏览和发布服务 有 3 个需要授权公开的 api: GetAllNews 获取所有新闻 PostNews 发布新闻, 具有 admin 角色的会员才能发布新闻 GetNews 根据 id 获取指定的新闻 1 声明接口,创建基于 .Net Core 6.0 的类库项目,命名为 News.ISe 阅读全文
posted @ 2024-11-13 20:13 Flamesky 阅读(336) 评论(2) 推荐(1) 编辑
摘要: 提供会员注册服务,用户必须注册成会员才能享受应用提供的服务,如浏览和发布新闻, 但有些服务又需要指定角色的会员才能操作,如所有会员都可以浏览新闻,只有管理员(admin)角色的会员才可以发布新闻。 有 2 个公开的 api: CheckName:判断用户名是否可用; Register:根据用户名注册 阅读全文
posted @ 2024-11-07 17:25 Flamesky 阅读(333) 评论(0) 推荐(2) 编辑
摘要: 搭建微服务 下面通过示例一步步搭建一个分布式微服务 1. 业务场景 假设有一个业务场景是要实现一个会员在线浏览新闻的应用,支持手机和PC端。分析了详细需求,把项目拆分成三个微服务: 会员注册微服务; 会员授权微服务; 浏览新闻微服务; 2. 框架简图 如图所示: client 是调用 api 的主体 阅读全文
posted @ 2024-11-02 14:27 Flamesky 阅读(89) 评论(0) 推荐(0) 编辑
点击右上角即可分享
微信分享提示