문제 발생
Addressables 를 사용하다 얘기치 못한 문제에 마딱드림..
기존의 사용방법으로는 멀티모드의 Sprite 형태의 리소스를 가지고 올 수 없는 문제가 있습니다.
지금 코드의 Addressable은 PrimeKey 값을 Armor01[Armor01]
이렇게 가져오고 있는데
멀티에서는 보는 것과 같이 Body, Left, Right 등 의도하지 않은 문자가 들어서 데이터를 로드할 수 없는 문제가 발생합니다.
별도로 하위 녀석에게 접근하여 바꿀 수 없는 문제가 있어 해결에 난항을 겪고 있는 와중 2016년 자료를 보게 되었는데 이 당시에는 문제가 많았던 기능이었지만 지금은 가능하지 않을까해서 Source Code를 다 뒤져보았습니다.
- 해당 소스코드를 보면 기존 Load 스크립트와 다르다는 것을 알수 있다. 단일 객체가 아닌 다중 객체를 가져오기 위해 IList<> 를 사용하여 멀티 Sprite를 처리할 수 있습니다.
수정된 코드는 다음과 같습니다.
private void HandleCallback<T>(string key, AsyncOperationHandle<T> handle, Action<T> cb) where T : Object
{
handle.Completed += operationHandle =>
{
_resources.Add(key, operationHandle.Result);
cb?.Invoke(operationHandle.Result);
};}
private void HandleCallback<T>(string key, AsyncOperationHandle<IList<T>> handle, Action<IList<T>> cb) where T : Object
{
handle.Completed += operationHandle =>
{
IList<T> resultList = operationHandle.Result;
// 리스트의 각 아이템을 _resources에 추가합니다.
for (int i = 0; i < resultList.Count; i++)
{
string resourceKey = $"{key}[{i}]"; // 리스트 아이템에 대한 고유 키
_resources.Add(resourceKey, resultList[i]);
}
cb?.Invoke(resultList);
};
}
private void LoadAsync<T>(string key, Action<T> cb = null) where T : Object
{
string loadKey = key;
if (_resources.TryGetValue(key, out Object resource))
{
cb?.Invoke(resource as T);
return;
}
if (key.Contains(".multiSprite"))
{
AsyncOperationHandle<IList<Sprite>>handle = Addressables.LoadAssetAsync<IList<Sprite>>(loadKey);
HandleCallback<Sprite>(key, handle, objs => cb?.Invoke(objs as T));
}
else if (key.Contains(".sprite"))
{
// 싱글 스프라이트 처리
AsyncOperationHandle<Sprite> handle = Addressables.LoadAssetAsync<Sprite>(loadKey);
HandleCallback(key, handle, cb as Action<Sprite>);
}
else
{
// 일반 에셋 처리
AsyncOperationHandle<T> handle = Addressables.LoadAssetAsync<T>(loadKey);
HandleCallback(key, handle, cb);
}}
-
로드하고자 하는 객체들을 IList로 묶어 로드 할 수 있으면 calback 또한 묶어서 처리할 수 있게 됩니다.
-
해당 방법으로 리소스 로드 자체는 성공했지만 아직 사용할 수 있는 상태는 아니게 된다 해당 리소스를 어떤 키로 부를 수 있는지 좀 더 연구 해봐야 한다.