[2025_10_24]다양한 미니게임이 있는 메타버스만들기-2(유니티 생명 주기 및 주기에 따른 스크립트 실행 순서 관련)

2025. 10. 24. 20:53TIL

 오늘 한 일

  • 캐릭터 커스터마이징 (장착 및 해금 기능 구현)
  • 상점 시스템 구현
  • JsonData 저장 및 관리 로직 정리

문제 상황

GameManager에서 컴포넌트들이 지연되어 붙는 현상이 발생했다.
참조 자체는 정상적으로 잡히지만, Inspector 상에서 컴포넌트가 4~5초 후에 표시되는 문제가 있었다.

 

+추가 문제 상황

또한 GameManager의 Awake()에서 초기화를 해주는 구조였는데,
다른 스크립트들이 GameManager를 대상으로 하는 이벤트 구독이 제대로 이루어지지 않았다.
이는 Unity의 스크립트 실행 순서가 Awake → OnEnable → Start로 고정되어 있지만,
모든 스크립트의 Awake가 동시에 실행되는 것이 아니라 실행 순서가 보장되지 않기 때문이었다.


시도한 방법

  • Json 구조 경량화
  • 불필요한 주석 제거
  • 필요 없는 [Serializable] 속성 제거
  • 생성자를 이용한 초기화 시도
  • 제네릭 싱글톤 구조 변경 → 원래대로 복구

추가 문제상황에 대해 시도한 방법

  • Unity Script Execution Order 설정->GameManager를 -100으로 설정하여 실행 순서 우선 적용
  • 코드 상으로 해결하고 싶어 계속 OnEnable에서 Start로 코드를  옮겨봄

하지만 이러한 시도에도 불구하고 지연 현상 자체는 해결되지 않음.


해결 방법

Unity Editor를 재시작하니 정상 작동.
(에디터 내부 캐싱 혹은 일시적인 에디터 버그로 추정)

 

추가 문제상황에 대해 해결 방법

  • 튜터님께서 알려주신 제네릭 싱글톤 구조 사용 시 이벤트 구독은 정상 작동했으나, PlayerData의 골드 값 로드 타이밍 문제로 인해 UI에 0이 표시됨.
  • 이를 해결하기 위해 OnEnable()의 코드를 Start()로 옮기자 정상 표시됨.

느낀 점

4시간 동안 구조를 의심하고, 초기화 순서를 점검하고,경량화 하였지만...
결국 문제는 코드가 아니라 Unity Editor 자체의 일시적인 오류였다.

앞으로는 코드에 명확한 논리적 문제가 없고, 에디터 상에서 로그가 안 떳을 때는 일단 Unity를 재시작 해봐야겠다.
+
스크립트별로 각자 다르게 생명주기가 돌아간다는걸 알았다... 그 동안은 이런 문제에 대해 깊이 생각해 본적이 없었는데... 튜터님께서 설명해주셧다... 운이 없으면 Awake에 메서드들이 들어있어도 다른 스크립트들의 Start보다 늦게 실행될 수 있다고...