LoadSceneMode.Single과 Additive 의 이벤트함수 실행 순서

2025. 3. 20. 22:37·코드 및 공부/씬
목차
  1. 목차

유니티 버전 - 6000.0.40f1

 

 

 

 

 

목차


  • Single과 Additive 씬의 이벤트함수 실행 순서
더보기

2024.12.23 - [코드 및 공부/씬] - 씬 전환시 해당씬의 CinemachineConfiner로 교체하기

 

씬 전환시 해당씬의 CinemachineConfiner로 교체하기

유니티 버전 - 2022.3.17f1     목차들어가며현 프로젝트 세팅코드     들어가며해당 코드를 이용하여 할 수 있는것은 씬이 전환 될때 전환된 씬의 Polygon Collider 2D를 가져와서 Cinemachine의 Cinemac

ekrxjvpvj0110.tistory.com

 

 

 

씬이 로드될때 Addtive씬의 PolygonCollider2D를 가져오는 코드가있었습니다, 이때는 Title씬에서 InGame씬으로 넘어올때 InGame씬과 Farm씬이 동기적으로 로딩되어서 InGame의 CinemachineConfinerChange 메서드가 Addtive씬의 오브젝트를 잘 가져왔었습니다

if (obj.CompareTag(Setting.ConfinerTag))
{
  PolygonCollider2D polygonCollider2D = obj.GetComponent<PolygonCollider2D>();
                
  cinemachineConfiner2D.m_BoundingShape2D = polygonCollider2D;
                
  cinemachineConfiner2D.InvalidateCache();

 

 

 

그런데 씬 로딩을 비동기적으로바꾸면서 문제가 발생하였습니다, mainScene이 먼저 로드되며 Addtive씬은 로드되지 않은채로 polygonCollider2D를 찾으려고 하니, 참조 오류가 발생하였습니다

public async UniTask StartGame(SceneName mainScene, SceneName additiveScene)
{
  await SceneManager.LoadSceneAsync((int)mainScene, LoadSceneMode.Single).ToUniTask();
  await SceneManager.LoadSceneAsync((int)additiveScene, LoadSceneMode.Additive).ToUniTask();

  Scene additive = SceneManager.GetSceneByBuildIndex((int)additiveScene);
        
  SceneManager.SetActiveScene(additive);
}

 

 

 

Hierarchy를 자세히보니 InGame 로드중 -> Title이 언로드되며 InGame 활성화 ->  Addtive씬 로드중 -> Addtive씬 활성화 순서대로 이루어졌습니다, 그래서 mainScene의 오브젝트의 Start()에서 콜라이더를 찾으려고하니 오류가 발생하는 것이였습니다, 그래서 이벤트 매니저를 통해 ChangeConfiner()를 등록하고

private void Start() // InGame의 스크립트
{
  EventManager.Subscribe(GameEventType.SceneChange, ChangeConfiner);
}

 

 

 

씬 로드가 완전히 완료된 후 실행되도록 바꾸어 해결했습니다

public async UniTask StartGame(SceneName mainScene, SceneName additiveScene)
{
  await SceneManager.LoadSceneAsync((int)mainScene, LoadSceneMode.Single).ToUniTask();
  await SceneManager.LoadSceneAsync((int)additiveScene, LoadSceneMode.Additive).ToUniTask();

  Scene additive = SceneManager.GetSceneByBuildIndex((int)additiveScene);
        
  SceneManager.SetActiveScene(additive);
        
  EventManager.Dispatch(GameEventType.SceneChange, null);
  // 추가
}

 

 

 

메인 씬이 로드된 후 첫 프레임 업데이트가 시작되면 메인 씬의 Start() 함수가 실행되는데, 만약 이 시점에 아직 Additive 씬이 로드되기 전이라면, Additive 씬의 오브젝트를 참조하려 할 때 null 참조 오류가 발생할 수 있습니다

'코드 및 공부 > 씬' 카테고리의 다른 글

allowSceneActivation = false 를 이용한 씬 미리 로딩(PreLoadScene)  (0) 2025.03.21
씬 전환시 해당씬의 CinemachineConfiner로 교체하기  (1) 2024.12.23
Instantiate시 오브젝트가 Addtive씬에 생기는 문제  (0) 2024.12.11
씬의 이벤트 실행 순서(Awake, Start 이외)  (0) 2024.11.30
씬 관리 (1)  (4) 2024.09.22
  1. 목차
'코드 및 공부/씬' 카테고리의 다른 글
  • allowSceneActivation = false 를 이용한 씬 미리 로딩(PreLoadScene)
  • 씬 전환시 해당씬의 CinemachineConfiner로 교체하기
  • Instantiate시 오브젝트가 Addtive씬에 생기는 문제
  • 씬의 이벤트 실행 순서(Awake, Start 이외)
ekrxjvpvj0110
ekrxjvpvj0110
유니티 개발 관련 자료
  • ekrxjvpvj0110
    ekrxjvpvj0110의 유니티 개발
    ekrxjvpvj0110
    • 전체 글 (74) N
      • 코드 및 공부 (73) N
        • 이론 (4)
        • 데이터 관리 (11)
        • 입력 관리 (9)
        • 최적화 (10)
        • UI (3) N
        • 통신 (0)
        • 카메라 (3)
        • 오디오 (3)
        • 물리 (3)
        • 씬 (6)
        • 기타 (21)
        • 분류없음 (0)
  • 인기 글

  • hELLO· Designed By정상우.v4.10.3
ekrxjvpvj0110
LoadSceneMode.Single과 Additive 의 이벤트함수 실행 순서

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.