- AssetReference
AssetReference
AssetReference는 Addressable Systemd에서 사용되는 클래스로 에셋의 주소의 정보를 저장하고 있는 클래스이다.
AssetReference는 직렬화를 지원하여 인스펙터 창에 할당 할 수 있으며
Addressable.Asset과 같은 프로퍼티를 통해 해당 정보로 로드 되어있는 리소스를 리턴 받을 수있다
이를 통해서 리소스를 따로 캐싱하지 않아도 Asset이 null이 아닌것을 확인하여 이미 로딩된 리소스인지 파악할 수 있으며
Addressable.Asset을 리턴 받아 중복 로딩 없이 리소스를 관리할 수 있다.
주의 사항으로는 Addressable을 통해서 리소스를 로드할 때에는 사용하지 않는 리소스를 Release() 통해
관리해줄 필요성이 있다.
하지만 우리 프로젝트의 경우에는 리소스를 재사용 하는 경우가 대부분이라서
테스트를 하며 최적화의 필요성이 커지지 않는 이상 따로 관리해주지는 않아도 될 것 같다.
AssetReference를 사용함으로써 원래 제작했던 ResourceManager는 굳이 필요가 없어졌다.
Addresable System 자체에서 이런 AssetReference와 같은 클래스를 활용하며 ResourceManager의 역할을 대신 해주기 때문이다.
[SerializeField] private AssetReference normalCardList;
[SerializeField] private AssetReference rareCardList;
[SerializeField] private AssetReference epicCardList;
[SerializeField] private AssetReference legendCardList;
[SerializeField] private AssetReference Card;
public async Task AddCardObject()
{
while (cards.Count != dm.selectCardCount)
{
cards.Add(await ObjectManager.Instance.UsePool<Card>(Card, cardSlot));
}
}
public async Task SelectCard(Card card)
{
CardRarity rarity = SelectRarity();
AssetReference address = await SelectAssetReference(rarity);
CardSO so = await ScriptableObjectManager.Instance.LoadScriptableObject<CardSO>(address);
card.InitCard(so);
}
public async Task<T> UsePool<T>(AssetReference address, Transform parent = null)
{
GameObject obj;
string key = address.AssetGUID;
AddKey(key);
if (ObjectPool[key].Count <= 0)
{
obj = await Addressables.InstantiateAsync(address,parent).Task;
obj.name = key;
}
else
{
obj = ObjectPool[key][ObjectPool[key].Count - 1];
ObjectPool[key].RemoveAt(ObjectPool[key].Count - 1);
obj.transform.SetParent(parent);
obj.SetActive(true);
}
return obj.GetComponent<T>();
}
public async Task<T> LoadScriptableObject<T>(AssetReference address) where T : ScriptableObject
{
if (address.Asset == null)
{
var handle = address.LoadAssetAsync<Object>();
await handle.Task;
}
return address.Asset as T;
// AssetReference.Asset에는 해당 에셋이 이미 로드된 상태인 경우 로드된 정보를 참조하고 있기 때문에
// 이미 로드된 AssetReference를 LoadAssetAsnyc하면 자동으로 AssetReference.Asset을 반환할 수 있음
// 결론적으로 캐싱을 따로 해줄 필요가 없다
//
// 1. 문제 발생 중복로드 -> 이미 로드를 했던 에셋을 로드하려고 하면 오류 발생
// Asset이 없는 경우에만 로드
}