⏰ FindObjectOfType 호출 시점에 대한 의문
- 강의에서 FindObjectOfType<T>()를 Awak() 시점에 호출하는 코드를 보고 의문이 생겼다.
private void Awake()
{
theStack = FindObjectOfType<TheStack>();
}
- 이 코드는 TheStack이라는 컴포넌트를 씬 안에서 찾아서 참조하는 상황이다.
- 나는 TheStack이 단지 C# 스크립트로 정의된 클래스이며, Awake() 호출 순서는 Unity에서 보장하지 않기 때문에, 이 시점에서 null이 반환될 수 있다고 생각했다.
🔍 Unity의 초기화 순서
- Unity의 씬 로딩 및 초기화 순서는 다음과 같다:
1. 씬에 있는 모든 GameObject를 메모리에 로드한다.
2.활성화된 컴포넌트들의 Awake()를 호출, 단, 호출 순서는 보장되지 않는다.
3. 이후 각 컴포넌트의 Start()가 호출된다.
- 즉, Awake() 시점에 FindObjectOfType<T>()를 사용하더라도 해당 오브젝트가 씬에 존재하고 비활성화되어 있지 않다면 정상적으로 찾을 수 있다.
⚠️ 그럼 언제 null이 될까?
- 다음과 같은 경우에는 null이 반환된다.
| 상황 | 설명 |
| ❌ 오브젝트가 비활성화됨 | FindObjectOfType<T>()는 기본적으로 비활성화된 오브젝트는 무시한다. |
| ❌ 아직 Instantiate되지 않음 | Awake() 시점 이전에 프로그래밍적으로 생성되지 않은 경우, 씬에 존재하지 않으므로 null이 반환된다. |
| ❌ 다른 씬에 있음 | 현재 활성화된 씬이 아닌 다른 씬의 오브젝트는 검색 대상이 아니다. |
✅ 결론
- FindObjectOfType<TheStack>()는 TheStack 오브젝트가 씬에 존재하고 활성화되어 있다면, Awake() 시점에서도 null이 반환되지 않는다.
- 다만, Awake()는 실행 순서가 보장되지 않기 때문에, 다른 컴포넌트에 의존하는 구조에서는 예기치 못한 null 참조가 발생할 수 있다.
'Programming > Unity 정보, 기능' 카테고리의 다른 글
| Unity 기능 - Rigidbody.AddForce() 정리, ForceMode 별 차이와 활용법 (2) | 2025.07.28 |
|---|---|
| Unity 간단 기능 정리 모음 #6 (2) | 2025.07.28 |
| Unity 기능 - transform.Find() 사용 이유와 구조 이해 (3) | 2025.07.23 |
| Unity 기초 개념 정리 모음 #5 (1) | 2025.07.23 |
| Unity 생성 주기 - 인스펙터 값 반영 문제 (0) | 2025.07.02 |
