본문 바로가기

Unity 기능 - FindObjectOfType 호출 시점

@코야딩구2025. 7. 23. 20:22

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 참조가 발생할 수 있다.

목차