07/23 장면 흐름 (Scene Flow) 구성 및 스크립팅

댓글 0
댓글을 작성하려면 로그인이 필요합니다.
아직 댓글이 없습니다. 첫 번째 댓글을 작성해보세요!

댓글을 작성하려면 로그인이 필요합니다.
아직 댓글이 없습니다. 첫 번째 댓글을 작성해보세요!
SceneManager는 게임 실행 중 Scene을 불러오고, 제거하고, 전환하는 정적 클래스입니다. Scene은 메뉴·스테이지·로딩 화면처럼 게임 공간을 나누는 단위이며, 사용하려면 using UnityEngine.SceneManagement;를 선언합니다. 불러올 Scene은 먼저 빌드의 Scene 목록에 등록해야 합니다. Unity 공식 문서
| 기능 | 주요 코드 | 용도 |
|---|---|---|
| Scene 즉시 전환 | LoadScene("Game") | 현재 Scene에서 다른 Scene으로 전환 |
| 비동기 로딩 | LoadSceneAsync("Game") | 끊김을 줄이고 로딩 화면 구현 |
| 추가 로딩 | LoadSceneAsync("UI", LoadSceneMode.Additive) | 기존 Scene을 유지한 채 다른 Scene 추가 |
| Scene 제거 | UnloadSceneAsync("UI") | 추가로 불러온 Scene 제거 |
| 활성 Scene 확인·변경 | GetActiveScene(), SetActiveScene() | 새 오브젝트가 생성될 Scene 및 조명 설정 기준 지정 |
| 로딩 완료 감지 | SceneManager.sceneLoaded | Scene 로딩 후 초기화 작업 실행 |
Scene 로딩 모드는 두 가지입니다. Single은 기존 Scene들을 제거하고 새 Scene 하나를 불러오는 기본 모드이고, Additive는 기존 Scene을 유지하면서 새 Scene을 겹쳐 불러옵니다. Additive로 불러온 Scene은 자동으로 활성 Scene이 되지 않으므로 필요하면 SetActiveScene()을 호출해야 합니다. 활성 Scene은 렌더링 여부가 아니라 새 GameObject의 소속과 조명 설정의 기준을 결정합니다.
using UnityEngine.SceneManagement;
// 일반적인 Scene 전환
SceneManager.LoadSceneAsync("GameScene", LoadSceneMode.Single);
실제 게임에서는 LoadScene()이 프레임 끊김을 일으킬 수 있어 대부분 LoadSceneAsync()가 권장됩니다. 음악·게임 매니저처럼 Scene이 바뀌어도 유지할 오브젝트는 DontDestroyOnLoad()를 사용하되, 중복 생성되지 않도록 싱글턴 등의 처리가 필요합니다. 또한 sceneLoaded 이벤트를 구독했다면 OnDisable()에서 반드시 구독을 해제하는 것이 안전합니다.
// Scene 이름으로 불러오기
SceneManager.LoadScene("GameScene");
// Scene 빌드 인덱스로 불러오기
// Enum을 사용하여 좀 더 안전하게 진행 가능
SceneManager.LoadScene(0);
File → Build Profiles의 Scene List에 등록되어 있어야 합니다.LoadSceneAsync()가 권장됩니다.| 구분 | LoadScene | LoadSceneAsync |
|---|---|---|
| 로딩 방식 | 다음 프레임에 로딩을 완료하는 동기 방식 | 백그라운드에서 비동기로 로딩 |
| 게임 화면 | 로딩 중 멈춤이나 끊김이 발생할 수 있음 | 로딩 중에도 화면·애니메이션 처리 가능 |
| 반환값 | 없음(void) | AsyncOperation 반환 |
| 진행률 확인 | 불가능 | progress, isDone으로 확인 가능 |
| 주요 용도 | 작은 Scene, 간단한 테스트 | 큰 Scene, 로딩 화면이 필요한 실제 게임 |
| 권장도 | 제한적으로 사용 | 일반적으로 권장 |
using UnityEngine;
public abstract class SingletonBehavior<T> : MonoBehaviour where T : MonoBehaviour
{
// 내부에서 사용하는 인스턴스
private static T instance;
// 외부로 접근점 열어둠
public static T Instance
{
get
{
if (instance == null)
{
// 이미 씬에 배치되었는지 찾음.
instance = FindAnyObjectByType<T>();
// 씬에 없으면 생성
if (instance == null)
{
GameObject singleton = new GameObject(typeof(T).Name);
instance = singleton.AddComponent<T>();
}
}
return instance;
}
}
// 싱글톤 만들기
protected virtual void Awake()
{
if (instance != null)
{
Destroy(gameObject);
return;
}
instance = this as T;
DontDestroyOnLoad(gameObject);
}
// 삭제되었을때 처리
protected virtual void OnDestroy()
{
if (instance == this as T)
{
instance = null;
}
}
}
사용 예시
public class LoadSceneManager : SingletonBehavior<LoadSceneManager>

| 구역 | 사는 것 | 수명 |
|---|---|---|
| 스택 | 함수의 지역 변수 | 함수가 끝나면 사라집니다 |
| 힙 | new로 만든 객체, Scene의 오브젝트들 | 아무도 참조하지 않으면 정리됩니다 |
| 정적 영역 | static 변수 | 프로그램 시작부터 종료까지 |
XR을 활용한 게임 개발 3기(유니티) 수강생입니다. 곧 수료 하지만 앞으로 이곳에 가끔 저의 개발 경험이 나 지식 기록할까 합니다. 더 나아가 이 사이트가 제 개인위키의 역할을 할 수 있으면 좋겠습니다. 한국 게임 시장을 흔들겠습니다

게임 광고 수익은 단순히 광고를 붙이는 것이 아니라, 여러 광고 네트워크를 경쟁시켜 가장 높은 수익을 만드는 구조입니다.

안녕하세요. 플밍 4기 입니다. 게임 개발을 배우기 전 네트워크 엔지니어 도메인에서 익히고 배웠던 네트워크 이론에 대한 기초 입니다. 학습에 도움이 되길 바라며 공유 드립니다.
XR을 활용한 게임 개발 3기(유니티) 수강생입니다. 곧 수료 하지만 앞으로 이곳에 가끔 저의 개발 경험이 나 지식 기록할까 합니다. 더 나아가 이 사이트가 제 개인위키의 역할을 할 수 있으면 좋겠습니다. 한국 게임 시장을 흔들겠습니다



게임 광고 수익은 단순히 광고를 붙이는 것이 아니라, 여러 광고 네트워크를 경쟁시켜 가장 높은 수익을 만드는 구조입니다.


안녕하세요. 플밍 4기 입니다. 게임 개발을 배우기 전 네트워크 엔지니어 도메인에서 익히고 배웠던 네트워크 이론에 대한 기초 입니다. 학습에 도움이 되길 바라며 공유 드립니다.