{!See https://docs.google.com/document/d/1takg_GmIBBKKTj-GHZCwzxohpQz7Bhekivkk72kYMtE/edit for reference implementation of OneTrust, dataLayer and GTM} {!OneTrust Cookies Consent} {!OneTrust Cookies Consent end} {!dataLayer initialization push} {!dataLayer initialization push end} {!Google Tag Manager} {!Google Tag Manager end} 동기식 로드 | Addressables | 1.21.17
docs.unity3d.com
"{0}"의 검색 결과

    목차 표시/숨기기

    동기식 로드

    동기식 어드레서블 API는 Unity 에셋 로딩 워크플로를 미러링하는 데 도움이 됩니다. AsyncOperationHandles에는 비동기 작업을 완료시키고 작업의 Result를 반환하는 WaitForCompletion()이라는 메서드가 있습니다.

    WaitForCompletion의 결과는 호출된 비동기 작업의 Result입니다. 작업이 실패하면 default(TObject)를 반환합니다.

    작업이 실패하지 않으면 default(TObject)를 결과로 얻을 수 있습니다. 완료 시 AsyncOperationHandle 인스턴스를 자동으로 해제하는 비동기 작업이 이러한 경우에 해당합니다. Addressables.InitializeAsync 및 autoReleaseHandle 파라미터가 true로 설정된 모든 API는 작업이 성공하더라도 default(TObject)를 반환합니다.

    성능 고려 사항

    WaitForCompletion을 호출하면 Resources.Load 또는 Instantiate를 직접 호출하는 경우와 비교했을 때 런타임 성능에 영향을 미칠 수 있습니다. AssetBundle이 로컬이거나 이전에 다운로드되어 캐시된 경우 이러한 성능 저하는 적습니다.

    Unity가 비동기 작업을 처리하는 방식 때문에 모든 에셋 로드 작업에서 WaitForCompletion이 호출되면 모든 활성 에셋 로드 작업이 완료됩니다. 예기치 않은 지연을 방지하려는 경우, 현재 작업 수를 알고 있고 모든 활성 작업이 동기적으로 완료되게 하려면 WaitForCompletion을 사용하십시오.

    원격 AssetBundle을 페치 및 다운로드하는 작업에서는 WaitForCompletion을 호출하지 마십시오.

    동기식 로드 예시

    void Start()
    {
        //Basic use case of forcing a synchronous load of a GameObject
        var op = Addressables.LoadAssetAsync<GameObject>("myGameObjectKey");
        GameObject go = op.WaitForCompletion();
        
        //Do work...
        
        Addressables.Release(op);
    }
    

    씬 제한 사항

    Unity는 씬 로딩을 동기적으로 완료하지 못합니다. activateOnLoad가 true로 설정되어 있더라도 Addressables.LoadSceneAsync에서 반환된 작업에 대해 WaitForCompletion을 호출했을 때 씬이 완전히 로드되지는 않습니다. 종속성과 에셋이 완료될 때까지 기다리지만 씬 활성화는 비동기적으로 수행해야 합니다.

    이 작업은 sceneHandle을 사용하거나 SceneInstance의 ActivateAsync에서 AsyncOperation을 통해 수행할 수 있습니다.

    IEnumerator LoadScene(string myScene)
    {
        var sceneHandle = Addressables.LoadSceneAsync(myScene, LoadSceneMode.Additive);
        SceneInstance sceneInstance = sceneHandle.WaitForCompletion();
        yield return sceneInstance.ActivateAsync();
        
        //Do work... the scene is now complete and integrated
    }
    

    Unity는 씬을 동기적으로 언로드하지 못합니다. 씬 언로드 시 WaitForCompleted를 호출해도 씬이나 에셋이 언로드되지 않으며 콘솔에 경고가 기록됩니다.

    SceneManager API를 통한 메인 스레드에서의 씬 통합에는 제한이 있으므로, 씬을 로드하기 위해 WaitForCompletion을 호출할 때 Unity 에디터 또는 플레이어를 잠글 수 있습니다. 이 문제는 두 개의 씬을 연속으로 로드할 때 발생하며, 두 번째 씬 로드 요청 시 AsyncOperationHandle에서 WaitForCompletion이 호출됩니다.

    씬 로딩은 메인 스레드에서 완전히 통합하는 데 추가 프레임을 사용하며 WaitForCompletion은 메인 스레드를 잠그기 때문에, SceneManager로부터 모든 작업이 완료되지 않았는데도 첫 번째 씬이 완전히 로드되었다는 알림을 어드레서블에 받게 될 수 있습니다. 이 시점에 씬은 완전히 로드되었지만, 씬이 Single 모드에서 로드된 경우 SceneManager는 메인 스레드에서 UnloadUnusedAssets를 호출하려고 시도합니다. 그런 다음 두 번째 씬 로드 요청은 메인 스레드를 WaitForCompletion으로 잠그지만, SceneManager가 다음 씬 로드를 시작하기 전에 UnloadUnusedAssets를 완료하도록 요청하므로 로드를 시작할 수 없습니다.

    이러한 교착 상태를 방지하려면 연속된 씬을 비동기적으로 로드하거나 씬 로드 요청 사이에 지연을 추가하십시오.

    커스텀 작업

    어드레서블은 InvokeWaitForCompletion의 고유한 구현을 지원하는 커스텀 AsyncOperation 인스턴스를 지원합니다. 이 메서드를 오버라이드하여 커스텀 동기식 작업을 구현할 수 있습니다.

    커스텀 작업은 ChainOperation 및 GroupsOperation 인스턴스와 함께 작동합니다. 연계 작업을 동기적으로 완료하려면 커스텀 작업이 InvokeWaitForCompletion을 구현하도록 하고 커스텀 작업을 사용하여 ChainOperation을 생성합니다. 이와 유사하게 GroupOperations는 커스텀 작업을 포함한 AsyncOperations 컬렉션을 완료하는 데 적합합니다.

    ChainOperation 및 GroupOperation은 모두 종속된 작업의 InvokeWaitForCompletion 구현에 의존하는 InvokeWaitForCompletion의 자체 구현을 포함하고 있습니다.

    WebGL 지원

    WebGL은 WaitForCompletion을 지원하지 않습니다. WebGL에서는 웹 요청이 모든 파일을 로드합니다. 다른 플랫폼에서는 웹 요청이 백그라운드 스레드에서 시작되고 메인 스레드는 웹 요청이 완료될 때까지 기다리는 동안 빠른 루프로 진행됩니다. 어드레서블은 웹 요청이 사용될 때 WaitForCompletion에 대해 이렇게 작업을 수행합니다.

    WebGL은 단일 스레드이기 때문에 빠른 루프로 인해 웹 요청이 차단되고 작업이 완료될 수 없습니다. 웹 요청이 생성된 프레임과 동일한 프레임에서 완료되면 WaitForCompletion은 아무런 문제가 없습니다. 그러나 이러한 상황이 보장되지는 않습니다.

    문서 개요
    맨 위로
    Copyright © 2023 Unity Technologies — 상표 및 이용약관
    • 법률정보
    • 개인정보처리방침
    • 쿠키
    • 내 개인정보 판매 금지
    • Your Privacy Choices (Cookie Settings)