카테고리 없음
내일배움캠프: 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 이벤트를 통해 씬 로드 완료시 동작해야할 기능을 정의할 수 있다. 람다식이 아닌 메서드도 등록 가능!