들어가며
유니티에 입문하며 다른 게임 개발툴과 비교해서 엄청 편했던 것이 바로 씬 관련 기능들이였다.
“다시하기 기능? 씬 다시 로딩하면 되는데?”
와 이걸 처음 알았을 때는…. 참 무적 기능이라 생각했다.
게임을 만들면서 여러 씬들을 관리하려다 보니 생각보다 관리해야할만한 부분들이 많이 보였다.
특히 이번에 했던 게임 프로젝트에서 튜터님께서 해주신 피드백 중에 ”난이도 구현 같은 부분들을 씬 로딩이 아닌 프리팹으로 구현해보아라”라는 것이 있었다.
씬을 로드하는 것이 생각보다 로딩 시간이 걸리기에 플레이어 입장에서 불편한 경험을 줄 수 있다는 이유에서 였다.
어느 때에 씬 로드가 필요한 지 아닌지는 나의 경험이 필요한 부분이겠지만, 오늘은 한 번 씬을 불러오는 여러 방법에 대해 이야기 해보고자 한다.
기본 씬 로딩(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 Camera
나 Directional Light
같은 기본 오브젝트들도
같이 로드되기 때문에 오류를 발생시키거나 씬의 구성이 내가 의도한 대로 되지 않을 것이다.
따라서 붙이는 목적의 씬에는 이러한 오브젝트들을 두지 않아야 한다.
LoadSceneAsync
앞서 설명하는 것과 같은 맵 로딩 같은 기능을 구현하기 위해서는
Additive Mode
로는 충분하지 않다.
왜냐하면 LoadScene()은 씬이 로딩될 때까지 다른 요소들이 전부 작동하지 않기 때문이다.
이 때 로딩 과정에서도 다른 요소들이 작동할 수 있도록 하는 것이 바로
LoadSceneAsync()
이다.
해당 기능으로 로딩화면을 구현한다던가 하는 등의 작업이 가능하다.
LoadSceneAsync
의 사용을 위해서는 코루틴이 필요하다.
코루틴이 무엇인지는 이전 글을 참고하자.
이게 왜 LoadSceneAsync
의 작동 중 다른 작업을 할 수 있는지에 대해서도 이해할 수 있을 것이다.
IEnumerator LoadSceneCoroutine()
{
yield return SceneManager.LoadSceneAsync("AsyncScene", LoadSceneMode.Additive);
}
StartCoroutine(LoadSceneCoroutine());
Uploaded by N2T
'개발 > Unity 내일배움캠프 TIL' 카테고리의 다른 글
C# 생성자와 소멸자 그리고 가비지 컬렉터 (0) | 2023.08.17 |
---|---|
C# 언어 기본 구조 (0) | 2023.08.14 |
Unity 인보크(Invoke)와 코루틴(Coroutine) 정리 (0) | 2023.08.10 |
Unity 버튼 UI 정리 (0) | 2023.08.09 |
Unity 스크립트 프로퍼티 변경 내용이 반영되지 않을 때? (0) | 2023.08.08 |