본문 바로가기
개발/Unity 내일배움캠프 TIL

Unity 씬 로드 (Scene Load) 정리

by 석시 2023. 8. 11.



들어가며

유니티에 입문하며 다른 게임 개발툴과 비교해서 엄청 편했던 것이 바로 씬 관련 기능들이였다.

“다시하기 기능? 씬 다시 로딩하면 되는데?”

와 이걸 처음 알았을 때는…. 참 무적 기능이라 생각했다.

게임을 만들면서 여러 씬들을 관리하려다 보니 생각보다 관리해야할만한 부분들이 많이 보였다.

특히 이번에 했던 게임 프로젝트에서 튜터님께서 해주신 피드백 중에 ”난이도 구현 같은 부분들을 씬 로딩이 아닌 프리팹으로 구현해보아라”라는 것이 있었다.

씬을 로드하는 것이 생각보다 로딩 시간이 걸리기에 플레이어 입장에서 불편한 경험을 줄 수 있다는 이유에서 였다.

어느 때에 씬 로드가 필요한 지 아닌지는 나의 경험이 필요한 부분이겠지만, 오늘은 한 번 씬을 불러오는 여러 방법에 대해 이야기 해보고자 한다.

기본 씬 로딩(Single Mode)

using UnityEngine.SceneManagement;

SceneManager.LoadScene("MyScene");

이러한 방식의 씬 로드를 Single 모드라고 한다.

LoadScene의 매개변수로 string이 아닌 int 값을 받을 수 있다.

그걸 sceneBuildIndex라 부르는데, 빌드 세팅에서 볼 수 있다.

참고로

Scene '~~' couldn't be loaded because it has not been added to the build settings or the AssetBundle has not been loaded.

이런 에러가 뜨면 빌드 세팅에 들어가 씬을 추가해주면 된다.

씬을 추가해주면 옆에 숫자가 써있는데, 이것이 LoadScene()에서 쓰는 sceneBuildIndex이다.

Additive Mode

Single 모드 말고는 Additive 모드라는 것이 있는데, 이는 아예 씬을 갈아타는 것이 아니라 기존 씬 위에 새로운 씬을 중복해서 로드하는 모드이다.

사용자 입장에서 엄청 크게 느껴지는 맵을 만드려면 이를 한 번에 로드하는 방식이 아니라 사용자의 위치에 따라 가까운 부분을 차례차례 로딩하는 것이 끊기는 부분이 없을 것이다.

SceneManager.LoadScene("AdditiveScene", LoadSceneMode.Additive);

이 때 새로 붙이려는 씬의 Main CameraDirectional Light 같은 기본 오브젝트들도 같이 로드되기 때문에 오류를 발생시키거나 씬의 구성이 내가 의도한 대로 되지 않을 것이다.

따라서 붙이는 목적의 씬에는 이러한 오브젝트들을 두지 않아야 한다.

LoadSceneAsync

앞서 설명하는 것과 같은 맵 로딩 같은 기능을 구현하기 위해서는 Additive Mode로는 충분하지 않다.

왜냐하면 LoadScene()은 씬이 로딩될 때까지 다른 요소들이 전부 작동하지 않기 때문이다.

이 때 로딩 과정에서도 다른 요소들이 작동할 수 있도록 하는 것이 바로 LoadSceneAsync()이다.

해당 기능으로 로딩화면을 구현한다던가 하는 등의 작업이 가능하다.

LoadSceneAsync의 사용을 위해서는 코루틴이 필요하다.

코루틴이 무엇인지는 이전 글을 참고하자.

이게 왜 LoadSceneAsync의 작동 중 다른 작업을 할 수 있는지에 대해서도 이해할 수 있을 것이다.

Unity 인보크(Invoke)와 코루틴(Coroutine) 정리
들어가며인보크 기본인보크 사용방법InvokeRepeatingCancelInvokeIsInvoking인보크 주의점코루틴코루틴 사용 방법StartCoroutineStopCoroutine 들어가며이번에 했던 프로젝트를 하고 나서, 가장 많이 느꼈던 점은 Invoke를 너무 남발한 거 같다는 점이다. 해당 함수 때문에 버그가 발생했을 때, 찾기도 버거웠을 뿐더러 (Invoke는 함수를 string으로 받기 때문에 참조 함수 목록에 들어가지 않게 된다.) 시전 타이밍을 스크립트의 코드 순서가 아닌 시간으로 정한다는 것이 게임을 구현하는데 있어 너무 불안요소였다. 따라서 이번에는 아예 Invoke에 대해 정리해보고 어느 때 쓰면 좋을지 알아보는 시간을 가지자. 인보크 기본인보크는 MonoBehaviour 클래스에서..
https://seoksii.tistory.com/21

IEnumerator LoadSceneCoroutine()
{
	yield return SceneManager.LoadSceneAsync("AsyncScene", LoadSceneMode.Additive);
}

StartCoroutine(LoadSceneCoroutine());


Uploaded by N2T