728x90
오늘 학습한 내용
1) Awake()가 항상 OnEnable()보다 먼저 실행되는 것은 아니다.
일반적으로 Awake()가 OnEnable()보다 먼저 실행되지만 이는 100% 보장되는 규칙이 아니었습니다.
프로젝트 실행 시 특정 참조값을 Awake()에서 초기화한 후 OnEnable()에서 해당 값을 사용하려 했으나 null이 발생하는 문제가 있었습니다.
2) Script Execution Order 설정을 통해 실행 순서를 제어할 수 있다.
Unity에서는 Edit > Project Settings > Script Execution Order 메뉴를 통해 특정 스크립트의 실행 순서를 지정할 수 있습니다.
이를 활용하여 GameManager의 Awake()가 PlayerController의 OnEnable()보다 먼저 실행되도록 설정함으로써 참조값이 정상적으로 할당되도록 해결하였습니다.
문제 및 해결 과정
문제
GameManager.Instance를 Awake()에서 초기화하고, PlayerController의 OnEnable()에서 이를 참조하려고 했으나 null이 발생하였습니다. 예상과 달리 Awake()와 OnEnable()의 실행 순서가 보장되지 않았기 때문입니다.
시도한 해결 방법
- Edit > Project Settings > Script Execution Order
- GameManager를 PlayerController보다 먼저 실행되도록 설정하였습니다.
- 결과 OnEnable()에서 GameManager.Instance를 정상적으로 참조할 수 있었습니다.
결과
- Awake()가 OnEnable()보다 항상 먼저 실행되는 것이 아니라는 점을 명확히 이해하게 되었습니다.
- Script Execution Order를 활용하면 특정 스크립트의 실행 순서를 제어할 수 있어, 중요한 초기화 작업이 확실하게 수행되도록 설정할 수 있었습니다.
- 실행 순서를 의존하기보다는 Lazy Initialization 패턴을 활용하여 null 체크 후 동적으로 참조하는 방식도 고려할 필요가 있음을 알게 되었습니다.
새롭게 알게 된 점
- Awake()가 항상 OnEnable()보다 먼저 실행된다고 확신할 수 없으므로 실행 순서를 고려한 코드를 작성해야 합니다.
- Script Execution Order를 활용하면 특정 스크립트의 실행 순서를 제어할 수 있습니다.
- 실행 순서에 의존하는 코드보다는 Lazy Initialization과 같은 안전한 설계를 적용하여 예기치 않은 null 참조 문제를 방지하는 것이 중요합니다.
728x90
'내일배움캠프' 카테고리의 다른 글
내일배움캠프 Unity - TIL : 25.03.13 (2) | 2025.03.13 |
---|---|
내일배움캠프 Unity - TIL : 25.03.12 (2) | 2025.03.12 |
내일배움캠프 Unity - TIL : 25.03.07 (0) | 2025.03.07 |
내일배움캠프 Unity - TIL : 25.03.06 (0) | 2025.03.06 |
내일배움캠프 Unity - TIL : 25.03.05 (0) | 2025.03.05 |