본문 바로가기
Unity

FindObjectOfType<T>() 함수 설명

by Oz Driver 2025. 3. 10.

FindObjectOfType<T>() 는 컴포넌트를 찾는 함수라고 알고 있는데, Rigidbody, Transform 같은 컴포넌트뿐만 아니라 UIManager, GameManager 같은 사용자가 정의한 클래스도 들어갈 수 있다는 게 어색하게 느껴질 수 있습니다.

 

이 의문을 풀기 위해 Unity에서 컴포넌트가 무엇인지, 그리고  FindObjectOfType<T>()가 MonoBehaviour를 상속받은 클래스만 찾을 수 있는지 알아보겠습니다.

 

 

MonoBehaviour 는 컴포넌트(Component) 다

Unity에서 MonoBehaviour는 단순한 클래스가 아니라, 게임 오브젝트에 부착할 수 있는 컴포넌트입니다. 이는 MonoBehaviour가 내부적으로 Unity의 Component 클래스를 상속받고 있기 때문입니다.

즉, 우리가 MonoBehaviour를 상속받아 만든 클래스는 자동으로 Unity의 컴포넌트가 되는 것입니다.

 

MonoBehaviour의 상속 구조

Unity 내부적으로 MonoBehaviour 클래스는 Component 클래스를 상속하고 있습니다. 이를 코드로 표현하면 다음과 같습니다:

public class Component : Object
{
    // Unity의 기본 컴포넌트 클래스
}

public class MonoBehaviour : Component
{
    // Unity에서 게임 오브젝트에 추가할 수 있는 컴포넌트
}

 

즉, MonoBehaviour는 Component를 상속한 클래스이며, Component는 결국 Unity 엔진의 핵심 클래스인 Object에서 파생되었습니다.

이를 기반으로 우리가 MonoBehaviour를 상속받아 만든 클래스는 게임 오브젝트에 부착할 수 있는 컴포넌트가 됩니다.

public class UIManager : MonoBehaviour
{
    // MonoBehaviour를 상속받았기 때문에 컴포넌트가 됨
}

 

위의 UIManager 클래스는 MonoBehaviour를 상속받았으므로 Unity 씬의 게임 오브젝트에 부착할 수 있습니다. 따라서 FindObjectOfType<UIManager>()를 호출하면 씬에서 이 컴포넌트를 찾아 반환할 수 있습니다.

하지만, 아래처럼 MonoBehaviour를 상속하지 않은 일반 C# 클래스라면?

public class UIManager
{
    // MonoBehaviour를 상속받지 않았으므로 Unity 오브젝트가 아님
}

 

이 클래스는 단순한 C# 클래스일 뿐이고, Unity 씬 안에서 존재하는 컴포넌트가 아니기 때문에 FindObjectOfType<UIManager>()로 찾을 수 없습니다.

 

 

FindObjectOfType()는 컴포넌트를 찾는 함수다

FindObjectOfType<T>()는 씬 안에 존재하는 모든 게임 오브젝트에서 해당 타입의 컴포넌트를 검색하는 함수입니다. 즉, T 타입이 MonoBehaviour를 상속받은 컴포넌트여야만 찾을 수 있습니다.

내부적으로 다음과 같은 동작을 합니다

 

* 씬 내의 모든 활성화된 게임 오브젝트를 검색한다.

* 각 게임 오브젝트에 부착된 컴포넌트들을 확인한다.

* T 타입(MonoBehaviour를 상속받은 클래스) 에 해당하는 컴포넌트를 찾으면 반환한다.

 

이 과정에서 MonoBehaviour를 상속받지 않은 일반 클래스는 애초에 Unity의 게임 오브젝트에 부착될 수 없으므로 FindObjectOfType<T>() 의 대상이 될 수 없습니다.

즉, FindObjectOfType<T>() 는 씬 안에 존재하는 컴포넌트를 대상으로 검색하는 함수이며, 일반 C# 클래스는 컴포넌트가 아니므로 찾을 수 없습니다.

 

 

정리

* FindObjectOfType<T>()는 씬 안의 "컴포넌트(Component)" 를 검색하는 함수다.
* MonoBehaviour 자체가 Unity의 Component 를 상속받아 게임 오브젝트에 부착할 수 있는 구조다.
* 일반 C# 클래스는 씬 안에 존재하지 않기 때문에 FindObjectOfType<T>() 로 찾을 수 없다.

 

즉, FindObjectOfType<T>()는 컴포넌트를 찾는 함수이기 때문에, MonoBehaviour를 상속받은 클래스만 검색할 수 있는 것입니다.

이제 FindObjectOfType<T>()가 왜 MonoBehaviour 기반 클래스만 찾을 수 있는지 확실하게 이해할 수 있을 것입니다.