일단 기본 사용법이
Addressable.LoadAssetAsync<T>(key).Completed += (handle) =>
{
obj = handle.Result;
};
대충 이런식인데 이렇게 로드할 경우 저거 하나하나 보기에도 안좋고 특정 씬에서 로드되는 Asset은 별도로 관리해주고 싶어서 조건문도 달아줄겸
랩핑 함수 하나 파려하는데 Unity 비동기는 유니티 메인스레드에서 처리해야한대서 코루틴으로 구현했거든 ?
public static IEnumerator LoadAsync<T> (this T obj, string key)
{
Addressable.LoadAssetAsync<T>(key).Completed += (handle) =>
{
if(특정 씬 )
LoadAssetList.Add(handle);
obj = handle.Result;
};
yield return null;
}
이런식으로 구현한 다음
StartCoroutine(obj.LoadAsync<T>(key)); 이렇게 실행했는데 정상적으로 동작을 안하는데 코드상 문제가 있는걸까 ?
아니면 혹시 다른 방식으로 랩핑해서 쓰는 사람들 어케 썻는지 알려줄 수 있어 ?
나는 비동기 잘 못써먹겠어서 WaitForCompletion인가 동기로 쓰는거 썼어...
나도 해외 커뮤 좀 찾아보다 정 안되겠음 동기로 처리해야겠네 ㄳㄳ
뭘 저렇게 복잡하게 했누. 그냥 async함수에서 await하고 쓰면되지안나
난 리소스가 없을거에 대한 예외처리때문에 랩핑해서 쓰긴하는데, 저런 이유로 랩핑해서 쓰진않아
유니티에서 별도 쓰레드 쓰는거 권장하지 않아서 최대한 걍 코루틴에서 작업하려 하느라 await 안썻는데 흠...
async써도 별도스레드 안타요. 유니티가 SynchronizationContext 커스텀용으로 지들이 넣어놔서 무조건 메인스레드 타
https://docs.unity3d.com/kr/2020.3/Manual/overview-of-dot-net-in-unity.html
"Unity는
기본 SynchronizationContext를 커스텀 UnitySynchronizationContext로 덮어쓰고, 편집 및 플레이 모드 둘 다에서 메인 스레드에서 모든 작업을 실행합니다."
ㄴ니가 써도 메인에서 돌아간다는 소리
"async 작업을 활용하려면 TaskFactory를 사용하여 자체 스레드를 생성 및 처리"
ㄴasync함수를 멀티스레드에서 쓰고 싶으면 TaskFactory로 쓰라는 말
아하 그래 ? 하나 배워감 좋은 정보 ㄳㄳ.
씬 구분되어 있는 경우에는 타이틀이나 메인씬에서 미리 로드만 해두고, 게임씬에서 로드해둔 거 복제해서 쓰는 방식으로 사용했는데
쓰레드 신경안쓰고 구현해도 괜찮을듯?