记录一下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]”)
|