[Unity] 비동기로 Scene 전환

Date:     Updated:

카테고리:

태그:

유니티에서는 여러가지 씬을 활용하여 게임을 구현합니다. 씬은 로드가 될 때, 현재의 씬의 모든 오브젝트를 파괴하고, 새로운 씬의 모든 오브젝트를 새로 로드하게 됩니다.

메모리 입장에서 가장 무거운 작업이 할당과 해제 입니다. 즉, 씬을 로드할 때, 파괴할 오브젝트나 다시 생성할 오브젝트에 따라서 씬 마다 로드할 시간이 달라집니다.

즉, 어떤 전환효과를 넣게 됐을 때, 씬 마다 전환시간이 달라 전환효과가 중간에 끊길 수도 있습니다. 따라서, 전환효과가 나올 때, 씬을 로딩하는 작업을 비동기로 하여 해당 문제를 해결할 수 있습니다.

   // 지연시간 기다렸다가 씬 전환함
        // 지연시간은 디폴트 3초
        private IEnumerator LoadingAsync(string _name, float _shouldWaitTime, Action<float> _onLoadingAction = null)
        {
            AsyncOperation asyncOperation = UnityEngine.SceneManagement.SceneManager.LoadSceneAsync(_name);

            //로딩이 완료되는대로 씬을 활성화할것인지
            asyncOperation.allowSceneActivation = false;

            float waitTime = 0f;

            //로딩이 완료되지 않았을 때
            while (!asyncOperation.isDone)
            {
                Debug.Log(asyncOperation.progress);

                waitTime += Time.deltaTime;

                //로딩할 때 할 행동이 있으면 함
                _onLoadingAction?.Invoke(asyncOperation.progress);

                //시간 다 채울때까지 기다림
                if (waitTime > _shouldWaitTime)
                {
                    //씬 활성화
                    asyncOperation.allowSceneActivation = true;
                }

                yield return null;
            }
        }
    }

비동기로 씬을 전환할 때, AsyncOperation 이라는 객체를 사용합니다. 해당 객체를 사용하면, 비동기 작업이 얼마나 진행되었는지, 비동기작업이 끝이 났는지 등을 알 수 있습니다.

비동기로 작업을 한다고 해도, 2D 게임이나 가벼운 3D 게임은 거의 지연시간 없이 로딩이 되므로, 전환효과가 깜빡하며 끊기듯 없어질 수 있습니다. 따라서, 지연시간을 임의로 설정해, 로드가 다 되었더라도 지연시간이 지난 후에 씬이 바뀌도록 할 수도 있습니다.

Unity 카테고리 내 다른 글 보러가기

댓글 남기기