카테고리 없음

LoadScene()와 LoadSceneAsync() 차이

MJ_119 2024. 9. 24. 17:51

1. LoadScene()

  • 동기적 로드(Synchronous Loading): LoadScene() 함수는 즉시 새로운 씬을 로드합니다. 현재 씬에서 새로운 씬으로 전환될 때까지 모든 작업이 멈추게 됩니다. 즉, 씬이 완전히 로드될 때까지 게임이 멈추는 현상이 발생합니다.
  • 사용 상황: 간단한 씬 전환이나, 씬이 로드되는 동안 게임이 일시적으로 멈춰도 괜찮은 경우에 적합합니다.
  • 장점: 처리 방식이 직관적이고 간단합니다. 바로 씬 전환이 필요할 때 사용하기 적합합니다.
  • 단점: 큰 씬을 로드할 때 프레임 드랍이나 로딩 중 일시적인 멈춤이 발생할 수 있습니다.

2. LoadSceneAsync()

  • 비동기적 로드(Asynchronous Loading): LoadSceneAsync()는 백그라운드에서 씬을 로드합니다. 씬이 로드되는 동안에도 게임이 멈추지 않고 계속 진행될 수 있습니다. 이 함수는 씬이 로드되는 동안 게임이 프레임마다 진행되는 걸 보장합니다.
  • 사용 상황: 큰 씬을 로드하거나, 씬 로드 중에도 사용자에게 계속 UI나 애니메이션 등을 보여주고 싶을 때 사용합니다. 로딩 바를 표시하거나 비동기적인 처리에 적합합니다.
  • 장점: 씬을 로드하는 동안 멈추지 않기 때문에 플레이어 경험을 더 부드럽게 할 수 있습니다. 또한, 씬 로드의 진행률(progress)을 얻을 수 있어 로딩 화면 등을 구현하기 좋습니다.
  • 단점: 구현이 조금 더 복잡할 수 있습니다. 씬이 완전히 로드되기 전에 새로운 씬의 일부 기능을 사용할 수 없다는 점도 고려해야 합니다.

 

// 동기적 씬 로드
SceneManager.LoadScene("SceneName");

// 비동기적 씬 로드
AsyncOperation asyncLoad = SceneManager.LoadSceneAsync("SceneName");

 

LoadSceneAsync()는 비동기 로드여서, 게임이 중단되지 않고 백그라운드에서 로드가 진행되며, asyncLoad 객체로 로딩 상태(진행률)를 확인할 수 있습니다.

결론:

  • 즉시 로드가 필요하고 로딩 시간이 짧다면 LoadScene()이 적합합니다.
  • 부드러운 전환로딩 중 진행률 표시가 필요하다면 LoadSceneAsync()가 더 나은 선택입니다.

 

 

코루틴으로 로딩씬 기다리는 방법.

IEnumerator Transition()
{
    SceneManager.LoadSceneAsync(loadScene); // 로딩 시작
    yield return null; // 바로 한 프레임 기다림
}

1. yield return null;

이 버전에서는 SceneManager.LoadSceneAsync(loadScene); 호출 후, 다음 프레임까지 대기하는 것입니다. 즉, 씬 로딩 작업이 비동기로 시작되지만, 그 작업이 끝날 때까지 기다리지는 않습니다. 그냥 로딩이 시작되고, 코루틴은 한 프레임을 쉬고 계속 진행됩니다.

 

IEnumerator Transition()
{
    yield return SceneManager.LoadSceneAsync(loadScene); // 로딩이 완료될 때까지 기다림
}

2. yield return SceneManager.LoadSceneAsync(loadScene);

이 버전에서는 씬이 완전히 로드될 때까지 기다립니다. SceneManager.LoadSceneAsync가 완료된 후에야 코루틴이 다음으로 진행됩니다. 이 방식은 씬 로딩이 끝나야만 코루틴이 계속되는 것이므로, 로딩 상태를 관리하기 좋습니다.

 

 

어느 것을 사용해야 할까?

  • 씬이 완전히 로드되기 전까지 다른 작업을 하지 않으려면,
  • 두 번째 코드 (yield return SceneManager.LoadSceneAsync(loadScene);)가 적합합니다.
  • 로딩 중에 다른 작업을 하거나, 다음 프레임부터 추가적인 처리를 하려면, 첫 번째 코드가 더 적합할 수 있습니다.