에러 코드
UnityException: get_enterPlayModeOptionsEnabled can only be called from the main thread.
Constructors and field initializers will be executed from the loading thread when loading a scene.
Don't use this function in the constructor or field initializers, instead move initialization code to the Awake or Start function.
UnityEngine.AddressableAssets.Addressables.get_m_Addressables () (at
한글 번역
UnityException: get_enterPlayModeOptionsEnabled는 메인 스레드에서만 호출할 수 있습니다.
장면을 로드할 때 로드 스레드에서 생성자 및 필드 초기화자가 실행됩니다.
생성자 또는 필드 초기화에서 이 기능을 사용하지 말고 초기화 코드를 깨우기 또는 시작 기능으로 이동하십시오.
상황
회사에서 async / await 비동기 프로그래밍 부분을 진행하다가 발견하게 된 이슈입니다.
async void AddressableTask()
{
var a = Task.Run(() => LoadAssetAsync());
bool result = await a;
Debug.Log(result);
}
bool LoadAssetAsync()
{
// 해당 부분에서 발생한 이슈 입니다.
var downloadScene = Addressables.LoadSceneAsync(sceneStr, LoadSceneMode.Additive);
downloadScene.Completed += (handle) =>
{
if (handle.Status == AsyncOperationStatus.Succeeded)
{
isSceneOn = true;
sceneHandle = handle;
}
};
isSceneOn = true;
return isSceneOn;
}
다른 상황에서의 테스크에는 에러가 안 나오는데 어드레서블 활용 시 에러가 발생합니다.
구글링 하던 도중에 원인을 찾았습니다.
중간 부분 답변에 다음과 같은 텍스트가 있습니다.
All current versions of Addressables API can only be called from the main thread.
현재 모든 버전의 Addressables API는 기본 스레드에서만 호출할 수 있습니다.
여기서 말하고 있는 기본 스레드는 유니티 API 즉 MonoBehaviour 기반으로 사용되는 API를 Thread에서 사용하게 되면
위 오류가 나타나게 되는 것입니다.
해당 현상을 해결하는 방법으로는 큐나 스택 등에 데이터를 담아서 처리하는 방법 등이 있지만,
사실 어드레서블 자체에서 async를 어느 정도 지원해주고 있어서 AssetReference 타입으로 참조를 하는 방식이나
아니면 제가 구현한 방식에선 코루틴을 활용해서도 작성을 했습니다.
이번 에러는 유니티 비동기 프로그래밍을 공부하던 중에 발견하게 된 에러입니다.
앞으로도 해당 주제를 가지고 공부를 조금 깊게 할 예정입니다.
이직 준비를 한다고 하는 게 최근 마지막 작성한 글이었는데 생각보다 이직이 수월하게 잘 진행이 되었습니다.
이전과 다른 근무환경, 출근 등의 피곤함은 조금 생겼지만 좋은 동료들과 이전 연봉에 53% 인상인 부분은 아주 좋습니다.
다들 원하는 바를 이루시기를 바랍니다. 파이팅입니다.