[Unity] Scene

gest·2025년 6월 3일

unity

목록 보기
1/11
using UnityEngine.SceneManagement;

//0 인덱스 로드
SceneManager.LoadScene(0);

//현재 Scene 로드
SceneManager.LoadScene(SceneManager.GetActiveScene().name);

//다음 Scene 로드
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex + 1);

씬 제거 함수

SceneManager.UnloadScene 함수를 쓴다.
SceneManager.UnloadScene();

  • 씬 제거

SceneManager.UnloadSceneAsync(index);

  • 비동기로 제거

비동기 실행

AssetReference를 사용하려면 Addressable 라이브러리가 있어야 한다.


addressable을 설치한다.


이후 groups 설정하면 된다.

using UnityEngine.AddressableAssets;
using UnityEngine.ResourceManagement.AsyncOperations;

//클래스 내부
public AssetReference scenes;
AsyncOperation op = 
	scenes.LoadSceneAsync(LoadSceneMode.Additive, bool activateOnLoad);

매개변수1

  • LoadSceneMode.Additive : 기존의 scene에 scenes를 추가하는 느낌 [기존의 scene는 제거X]
  • LoadSceneMode.Single : 기존의 scene를 제거하고 scenes를 로딩

매개변수2

  • activateOnLoad : true면 완료 되자마자 Scene 실행

이후에 op.isDone으로 아직 끝났는지 안끝났는지 판단 가능
op.allowSceneActivation = true; //scene 장면 활성화

  • scene.IsValid;
    • 씬의 내용이 존재하지 않으면 false
    • 가끔 비동기로 씬이 가끔 없는 경우가 있다.

씬 전환 후 환경광 갱신

(DynamicGI.UpdateEnvironment)

Additive로 씬을 올리고 활성 씬을 바꾸면, 화면이 어두워지거나 그림자가 과하게 진해지는(harsh) 경우가 있다.

원인은 활성 씬을 바꿔도 환경광(Ambient) 이 자동으로 다시 계산되지 않기 때문이다.

using UnityEngine; // DynamicGI
using UnityEngine.SceneManagement;

//Additive로 올린 씬을 활성 씬으로 지정
SceneManager.SetActiveScene(loadedScene);

//활성 씬 기준으로 환경광(Ambient/Reflection) 다시 계산
DynamicGI.UpdateEnvironment();

왜 필요한가

  • Ambient(환경광) = 그림자 속을 채워주는 은은한 빛. 보통 Skybox에서 색을 뽑아온다.
  • Unity는 이 환경광을 Skybox에서 미리 분석해 Ambient Probe 라는 요약 데이터로 저장해 둠.
  • 씬을 직접 열면 로드 시 자동으로 이 Probe가 구워짐 → 멀쩡.
  • 근데 SetActiveScene() 은 "주인공 씬"만 바꿀 뿐, Ambient Probe는 갱신 안 함.
    → 옛날 환경광이 그대로 남아서 그림자가 안 채워지고 어두워지는 경우가 생긴다.

결론

additive 전환에선 SetActiveScene함수와 DynamicGI.UpdateEnvironment 함수를 세트로 호출해야 함.

주의

  • 에디터에서 씬 단독으로 열면 자동 갱신돼서 멀쩡해 보임.
  • 런타임 additive 전환에서만 빠지는 함정이라, 빌드/실제 플레이에서만 티가 난다.

0개의 댓글