카테고리 없음

내일배움캠프: LoadSceneAsync(1)

pracumj 2024. 12. 4. 22:27

 

유니티 공식 문서 

오늘은 유니티 LoadSceneAsync를 공부했다. LoadSceneAsync 는 씬을 비동기로 로드하기 위해서 사용하는 키워드이다 씬을 동기가 아닌 비동기로 로드하게 된다면 씬이 로드 될 때 렉이 가는 현상을 줄일 수 있다! 

 

 

1. 씬 기다리기 

LoadSceneAsync를 사용하면 씬 로드 중 진행 상황을 확인하고, 로드가 완료되었을 때 특정 로직을 수행할 수 있다!

 

유니티 공식 문서 예제

public class Example : MonoBehaviour
{
    void Update()
    {
        // Press the space key to start coroutine
        if (Input.GetKeyDown(KeyCode.Space))
        {
            // Use a coroutine to load the Scene in the background
            StartCoroutine(LoadYourAsyncScene());
        }
    }

    IEnumerator LoadYourAsyncScene()
    {
		// 애플리케이션이 현재 씬이 실행되는 동안 백그라운드에서 새로운 씬을 로드합니다.
		// 이는 특히 로딩 화면을 만드는 데 유용합니다.
		// 또한 sceneBuildIndex를 사용하여 씬을 로드할 수도 있습니다. 이 경우, 
		// Scene2는 빌드 설정(Build Settings)에서 1의 sceneBuildIndex를 가지고 있습니다.

        AsyncOperation asyncLoad = SceneManager.LoadSceneAsync("Scene2");

        // asyncLoad.isDone을 통해서 씬 로드 상태를 파악할 수 있다! 
        while (!asyncLoad.isDone)
        {
            yield return null;
        }
    }
}


2. 다중 씬

Unity에서는 비동기로 여러 씬을 동시에 로드할 수 있으며, LoadSceneMode.Additive를 사용해 현재 씬에 추가로 다른 씬을 로드할 수 있다! 

 

예시 코드

 var asyncLoad = SceneManager.LoadSceneAsync(sceneToLoad.SceneName, LoadSceneMode.Additive);


3. Trigger를 이용한 씬 전환!

트리거(Collider)를 활용해 플레이어가 특정 영역에 들어왔을 때 씬 전환을 비동기적으로 처리가 가능하다!

    private void LoadScene()
    {
        if (sceneToLoad == null || string.IsNullOrEmpty(sceneToLoad.SceneName))
        {
            Debug.LogWarning("로드할 씬이 설정되지 않았습니다.");
            return;
        }

        if (!IsSceneLoaded(sceneToLoad.SceneName))
        {
            var asyncLoad = SceneManager.LoadSceneAsync(sceneToLoad.SceneName, LoadSceneMode.Additive);
            asyncLoad.completed += operation =>
            {
                Debug.Log($"씬 로드 완료: {sceneToLoad.SceneName}");         
            };
        }
    }

asyncLoad.completed 이벤트를 통해 씬 로드 완료시 동작해야할 기능을 정의할 수 있다. 람다식이 아닌 메서드도 등록 가능!