Unity AddressableAssets 加载SpriteAtlas

本文介绍如何在Unity中使用AssetReferenceAtlas类异步加载SpriteAtlas资源,并通过回调函数处理加载完成后的Sprite数据。
public AssetReferenceAtlas spriteAtlasReference;
spriteAtlasReference.LoadAssetAsync<SpriteAtlas>().Completed += SpriteAtlasLoaded;

 

    private void SpriteAtlasLoaded(AsyncOperationHandle<SpriteAtlas> async)
    {
        Sprite[] spriteArray = new Sprite[async.Result.spriteCount];
        //spriteArray得到数组
        async.Result.GetSprites(spriteArray);
    }
[Serializable]
public class AssetReferenceAtlas : AssetReferenceT<SpriteAtlas>
{
    public AssetReferenceAtlas(string guid) : base(guid) { }
}

 

Unity中使用脚本创建SpriteAtlas,可以通过继承`EditorWindow`类并使用Unity Editor API来实现。以下是一个详细的实现方法,包括创建SpriteAtlas、设置打包参数以及保存生成的SpriteAtlas文件[^1]。 ### 创建SpriteAtlas的脚本 ```csharp using UnityEngine; using UnityEngine.U2D; using UnityEditor; using UnityEditor.U2D; using System.IO; public class GenerateScript : EditorWindow { [MenuItem("EditorTools/GenerateSpriteAtlas")] public static void ShowCustomEditorWindow() { // 创建SpriteAtlas保存的目录 string directoryPath = Application.dataPath + "/SpriteAtlas"; if (!Directory.Exists(directoryPath)) Directory.CreateDirectory(directoryPath); // 创建一个新的SpriteAtlas实例 SpriteAtlas spriteAtlas = new SpriteAtlas(); // 设置SpriteAtlas的打包参数 SpriteAtlasPackingSettings packSetting = new SpriteAtlasPackingSettings() { blockOffset = 1, enableRotation = false, enableTightPacking = false, padding = 4, }; spriteAtlas.SetPackingSettings(packSetting); // 保存SpriteAtlas到指定路径 string localPath = directoryPath + "/SpriteAtlasName.spriteatlas"; AssetDatabase.CreateAsset(spriteAtlas, localPath); AssetDatabase.Refresh(); } } ``` ### 功能说明 - **目录创建**:在`Assets`目录下创建一个名为`SpriteAtlas`的文件夹,用于存放生成的SpriteAtlas文件。 - **SpriteAtlas实例**:通过`new SpriteAtlas()`创建一个新的SpriteAtlas对象。 - **打包参数设置**:通过`SpriteAtlasPackingSettings`类设置打包参数,如`padding`(精灵之间的间距)、`enableRotation`(是否允许旋转)等。 - **保存文件**:使用`AssetDatabase.CreateAsset`方法将SpriteAtlas保存为一个`.spriteatlas`文件,并调用`AssetDatabase.Refresh()`刷新资源数据库,确保新文件立即生效。 ### 获取SpriteAtlas中的Sprite 如果需要从已有的SpriteAtlas中获取所有Sprite,并将其转换为`Texture2D`对象,可以使用以下代码[^2]: ```csharp window.sprites = new Sprite[window.spriteAtlas.spriteCount]; window.spriteAtlas.GetSprites(window.sprites); window.texture2Ds = new Texture2D[window.sprites.Length]; for (int i = 0; i < window.sprites.Length; i++) { window.texture2Ds[i] = window.sprites[i].texture; } ``` 这段代码首先获取SpriteAtlas中所有的Sprite,然后遍历这些Sprite,提取它们的纹理并存储到`Texture2D`数组中。这在需要对Sprite的纹理进行进一步处理时非常有用[^2]。 ### 复制Sprite的纹理并重新创建Sprite 如果需要复制一个Sprite的纹理并重新创建一个新的Sprite,可以使用以下方法[^3]: ```csharp nowSpriteRenderer1 = nowTrans1.GetComponent<SpriteRenderer>(); Sprite sp = nowSpriteRenderer1.sprite; Texture2D txt = CDrawTexture.CopyTextureFrom(sp); sp = Sprite.Create(txt, new Rect(0, 0, txt.width, txt.height), new Vector2(0.5f, 0.5f)); // nowSpriteRenderer1.sprite = sp; ``` 这段代码通过`Sprite.Create`方法创建了一个新的Sprite,使用复制的纹理和指定的矩形区域及中心点位置。这在需要动态修改Sprite内容时非常有用[^3]。 ### 总结 通过上述代码和方法,可以在Unity中使用脚本创建、管理和操作SpriteAtlas。这不仅有助于自动化资源管理流程,还能提高开发效率,特别是在需要批量处理Sprite资源的情况下。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值