Unity) Scene

1. 씬 (Scene)이란?
Hierarchy에 놓인 게임 오브젝트와 그 설정을 담아 둔 파일입니다.
1-1) 게임을 여러 씬으로 나누는 이유
- 한 씬이 담는 오브젝트 수가 줄어 Hierarchy에서 찾기 쉬워집니다.
- 지금 만들고 있는 화면만 열어 두고 작업할 수 있습니다.
- 여러 사람이 나눠 작업할 때 서로 다른 씬을 고치면 부딪히지 않습니다.
1-2) 빌드 세팅
목록에 등록하는 이유 :
코드로 씬을 불러오기 위해서는 Build Settings 목록에 등록되어 있어야 합니다.
코드 상에서 씬을 변경할때 Build Settings에 있는 Build Index나 "Title" 같은 string 타입인 씬 이름으로 변경할 수 있습니다.
1-3) SceneManager를 통한 씬 전환
- 네임스페이스
C#은 형식이 많아 형식들을 성격별로 묶어 두는데, 그 묶음을 네임스페이스(namespace, 이름을 묶어두는 단위) 라고 합니다.
파일 맨 위의 using은 어느 묶음에 든 이름을 앞에 묶음 이름 없이 그대로 쓰겠다 라는 선언입니다.
먼저, SceneManager를 사용하기 위해서는
using UnityEngine.SceneManagement;
해당 네임스페이스를 먼저 선언해줘야합니다.
- LoadScene
인자로 씬의 이름을 넘기거나, 빌드 인덱스를 넘겨줍니다.
SceneManager.LoadScene("Play");
SceneManager.LoadScene(1);
==LoadScene== 같은 경우 씬이 다음 프레임에 로드되며, 즉시 로드 되지 않다고 공식문서에 명시되어 있습니다.
따라서, Update 이벤트 함수 내에 있는 ==LoadScene== 바로 다음줄에서 새 씬의 오브젝트를 찾으려고 하면 동작하지 않습니다.
- Single과 Additive
==LoadScene==은 두 번째 인자로 어떻게 부를지를 받습니다. 생략하면 ==LoadSceneMode.Single==입니다.
| 값 | 무엇을 하나 |
|---|---|
LoadSceneMode.Single | 열려 있던 씬을 닫고 새 씬을 엽니다 |
LoadSceneMode.Additive | 열려 있던 씬을 그대로 두고 새 씬을 겹쳐 엽니다 |
- 지금 씬의 이름 확인
지금 활성 상태인 씬은 **SceneManager.GetActiveScene() ** 으로 가져옵니다.
활성 씬은 지금 화면에 보이는 씬이 아닌
새로 만들어지는 게임 오브젝트가 놓이는 곳이자 조명 설정의 출처로 정의되어있습니다.
- DontDestroyOnLoad
씬이 바뀔때 그 씬에 있던 게임 오브젝트가 전부 사라집니다.
DontDestroyOnLoad 를 통해 게임오브젝트를 넘기면 그 오브젝트는 씬이 바뀌어도 사라지지 않습니다.
DontDestroyOnLoad(gameObject);
※ 단, 그 게임 오브젝트가 계층의 맨위, 부모가 없는 오브젝트여야 합니다.
- 현재는 싱글톤 기법을 배우지 않은 상태라, ==DontDestroyOnLoad== 만 사용하게 된다면, 해당 오브젝트가 씬을 옮길때마다
삭제되지 않고 중복되는 현상이 발생한다.

