Unity官方案例-Addressables-Sample-笔记(4)-Sprite Land(Sprite加载)

记录一下Addressables-Sample项目中的脚本和学习的笔记,主要是熟悉API及其使用方式.方便日后工作查询.

项目地址:

github: Addressables-Sample

Unity官方教程

Bilibili-Unity官方教程 Addressables【中文字幕】

4. Sprite Land

本示例中目前演示了三种sprite访问方法。

场景说明

Scenes/SampleScene

  • 首先是直接对单个sprite进行AssetReference。因为这个精灵是单个条目,所以我们可以直接引用资源并获取精灵。这是最简单的例子。

  • 第二种方法是从sprite表中访问sprite。这是导致撞车的原因,但现在应该修复。在这里,我们将sprite表资产作为IList类型加载。这告诉addressables加载所有作为sprite的子对象,并将它们作为列表返回。

  • 第三种是从地图册中访问精灵。在这种情况下,必须使用addressables加载sprite atlas,然后使用普通atlasapi从中加载给定的sprite。本例还显示了扩展AssetReference以提供可寻址项不附带的类型化引用(本例中为AssetReference)。

脚本说明

Scripts/SpriteControlTest.cs

using System;
using System.Collections;
using System.Collections.Generic;
using UnityEditor.AddressableAssets.GUI;
using UnityEngine;
using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;
using UnityEngine.SceneManagement;
using UnityEngine.U2D;
using UnityEngine.UI;

public class SpriteControlTest : MonoBehaviour
{
    public AssetReferenceSprite singleSpriteReference;
    
    public AssetReference spriteSheetReference;
    
    
    public AssetReferenceAtlas spriteAtlasReference;
    public AssetReference spriteSubAssetReference;
    public AssetReference atlasSubAssetReference;
    
    
    public List<SpriteRenderer> spritesToChange;

    public Button button;
    public Text buttonText;

    int m_ClickCount = 0;
    public void OnButtonClick()
    {
        button.interactable = false;
        m_ClickCount++;
        switch (m_ClickCount)
        {
            case 1:
                singleSpriteReference.LoadAssetAsync<Sprite>().Completed += SingleDone;
                break;
            case 2:
                spriteSheetReference.LoadAssetAsync<IList<Sprite>>().Completed += SheetDone;
                break;
            case 3:
                spriteAtlasReference.LoadAssetAsync().Completed += AtlasDone;
                break;
            case 4:
                spriteSubAssetReference.LoadAssetAsync<Sprite>().Completed += SheetSubDone;
                break;
            case 5:
                atlasSubAssetReference.LoadAssetAsync<Sprite>().Completed += AtlasSubDone;
                break;
            case 6:
                Addressables.LoadAssetAsync<Sprite>("sheet[sprite_sheet_4]").Completed += SheetNameSubDone;
                break;
            case 7:
                Addressables.LoadAssetAsync<Sprite>("Atlas[u7]").Completed += AtlasNameSubDone;
                break;
        }
    }
    
    

    void SingleDone(AsyncOperationHandle<Sprite> op)
    {
        if (op.Result == null)
        {
            Debug.LogError("no sprites here.");
            return;
        }
        
        spritesToChange[0].sprite = op.Result;
        
        button.interactable = true;
        buttonText.text = "Change with sheet list";
    }

    void SheetDone(AsyncOperationHandle<IList<Sprite>> op)
    {
        if (op.Result == null)
        {
            Debug.LogError("no sheets here.");
            return;
        }

        spritesToChange[1].sprite = op.Result[5];
        
        button.interactable = true;
        buttonText.text = "Change with atlas";
    }

    void AtlasDone(AsyncOperationHandle<SpriteAtlas> op)
    {
        if (op.Result == null)
        {
            Debug.LogError("no atlases here.");
            return;
        }

        spritesToChange[2].sprite = op.Result.GetSprite("u3");
        
        button.interactable = true;
        buttonText.text = "Change with sprite sub-object ref";
    }

    void SheetSubDone(AsyncOperationHandle<Sprite> op)
    {
        if (op.Result == null)
        {
            Debug.LogError("no sprite in sheet here.");
            return;
        }

        spritesToChange[3].sprite = op.Result;
        
        button.interactable = true;
        buttonText.text = "Change with atlas sub-object ref";
    }

    void AtlasSubDone(AsyncOperationHandle<Sprite> op)
    {
        if (op.Result == null)
        {
            Debug.LogError("no sprite in atlas here.");
            return;
        }

        spritesToChange[4].sprite = op.Result;
        
        button.interactable = true;
        buttonText.text = "Change with sprite[name]";
    }

    void SheetNameSubDone(AsyncOperationHandle<Sprite> op)
    {
        if (op.Result == null)
        {
            Debug.LogError("no sprite in sheet here.");
            return;
        }

        spritesToChange[5].sprite = op.Result;
        
        button.interactable = true;
        buttonText.text = "Change with atlas[name]";
    }

    void AtlasNameSubDone(AsyncOperationHandle<Sprite> op)
    {
        if (op.Result == null)
        {
            Debug.LogError("no sprite in atlas here.");
            return;
        }

        spritesToChange[6].sprite = op.Result;
        
        buttonText.text = "The End";
    }

    void Start()
    {
        Addressables.InitializeAsync();
    }

}

[Serializable]
public class AssetReferenceAtlas : AssetReferenceT<SpriteAtlas>
{
    public AssetReferenceAtlas(string guid) : base(guid) { }
}

  • AssetReferenceAtlas 继承至AssetReferenceT,是自定义SpriteAtlas类型的AssetReference

  • 加载Sprite,

    • singleSpriteReference.LoadAssetAsync()
  • 加载SubSprite

    • spriteSheetReference.LoadAssetAsync<IList>
  • 加载图集SpriteAtlas

    • spriteAtlasReference.LoadAssetAsync()
  • 加载SubSprite里面的单张Sprite

    • spriteSubAssetReference.LoadAssetAsync()
  • 加载SpriteAtlas里面的单张Sprite

    • atlasSubAssetReference.LoadAssetAsync()
  • 按可寻址路径加载Sprite里面的单张Sprite

    • Addressables.LoadAssetAsync(“sheet[sprite_sheet_4]”)
  • 按可寻址路径加载SpriteAtlas里面的单张Sprite

    • Addressables.LoadAssetAsync(“Atlas[u7]”)

猜你喜欢

转载自blog.csdn.net/kill566666/article/details/119186887