I'm FanJae.

[20260528] Unity 정리 ( Find 계열 ) 본문

Unity/Unity 초격차캠프

[20260528] Unity 정리 ( Find 계열 )

FanJae 2026. 5. 28. 20:51

1. 정의

- Find 계열 메서드는 씬 안에 존재하는 GameObject나 특정 Component를 코드에서 검색할 때 사용하는 기능이다.

- 크게 보면 Find 계열은 두 개의 종류로 나뉜다. 종류를 나눈 근거는 씬 전체에서 오브젝트를 찾는 방식인가, 자식 또는 부모 방향에서 컴포넌트를 찾는 방식인가에 따라 뉜다.

 

① 씬 전체에서 object를 찾는 방식

GameObject.Find()
GameObject.FindWithTag()
GameObject.FindGameObjectsWithTag()
FindAnyObjectByType<T>()
FindObjectsByType<T>()

 

② 특정 오브젝트의 자식 또는 부모 방향에서 Component를 찾는 방식

GetComponentInChildren<T>()
GetComponentInParent<T>()

- 이처럼 씬 전체에서 찾는가? 자식 또는 부모 방향에서 찾는가에 따라 메서드를 나눌 수 있다.


2. 필요한 이유

- 게임을 만들다 보면 코드에서 다른 오브젝트를 참조해야 하는 경우가 있다.

GameObject player = GameObject.Find("Player");

- 아니면, 특정 태그를 가진 오브젝트를 찾아야 할 때가 있다.

GameObject player = GameObject.FindWithTag("Player");

- 자식 오브젝트에 붙어있는 컴포넌트를 가져와야 하는 상황도 필요하다.

Rigidbody rb = GetComponentInChildren<Rigidbody>();

- GetComponentInChildren<T>()는 현재 오브젝트 또는 자식 오브젝트에서 해당 타입의 컴포넌트를 찾는다.


3. 적용할 때 유의사항

- 주의할 점은 Find 계열을 아무 곳에서나 사용하면 안된다.

- 특히 Update() 안에서 반복 호출하면 안 된다.

void Update()
{
		GameObject player = GameObject.Find("Player");
}

- 이렇게 할 경우 매 프리엠미다 씬 전체에서 Player라는 이름의 오브젝트를 찾는다.

- 게임이 실행되는 동안 계속 씬을 탐색하게 되므로 비용이 커진다.

- 따라서, 보통은 Awake()나 Start()에서 한 번만 찾고, 변수에 저장해서 사용한다.

private GameObject player;

void Start()
{
    player = GameObject.FindWithTag("Player");
}

4. 적용 예시

using UnityEngine;

public class FindBasic : MonoBehaviour
{
    private GameObject player;
    private Animator anim;

    private void Start()
    {
        // 이름으로 오브젝트 찾기
        player = GameObject.Find("Player");

        // 태그로 오브젝트 찾기
        // player = GameObject.FindWithTag("Player");

        // 자식 오브젝트에서 Animator 컴포넌트 찾기
        anim = GetComponentInChildren<Animator>();
    }
}

- 이 경우, 자식 오브젝트에서 Animator 컴포넌트를 찾는 다는 의미가 된다.


5. 주요 메서드 정리

GameObject.Find("이름") - 이름으로 오브젝트 검색
GameObject.FindWithTag("태그") - 지정 태그를 가진 오브젝트 하나 검색
GameObject.FindGameObjectsWithTag("태그") - 지정 태그를 가진 모든 오브젝트 검색
FindAnyObjectByType<T>() - 씬에서 특정 타입의 오브젝트 하나 검색
FindObjectsByType<T>() - 씬에서 특정 타입의 오브젝트들을 검색
GetComponentInChildren<T>() - 현재 오브젝트 또는 자식에서 컴포넌트 검색
GetComponentInParent<T>() - 현재 오브젝트 또는 부모에서 컴포넌트 검색

6. 장점

- Find 계열은 간단하게 다른 오브젝트를 찾을 수 있다.

- 따라서 간단한 예제에서는 빠르게 Component나 GameObject를 가져올 수 있다.

GameObject player = GameObject.FindWithTag("Player");

- 또한 GetComponentInChildren, GetComponentInParent 는 계층 구조를 기준으로 컴포넌트를 찾을 수 있어서 자식 오브젝트나 부모 오브젝트에 연결할 때 편리하게 사용할 수 있다.


7. 주의점

- 가능하면 인스펙터에서 직접 연결하는 방식이 더 좋다.

1. 가능하면 [SerializeField]를 추가한 Inspector에서 직접 연결
2. 필요하면 Start나 Awake에서 한 번만 Find한다.
3. Update에서 Find 반복 호출은 가급적 피해야 한다.

8. 정리

- Find계열은 씬 안의 오브젝트나 컴포넌트를 코드로 찾을 때 사용한다.

- 다만 씬을 탐색하는 방식이기 때문에 비용이 발생할 수 있다. 그래서 매 프레임 호출되는 Update()안에서 반복적으로 사용하는 것은 피하는 것이 좋다.

- 따라서 Find를 남발하기보다, 인스펙터에서 직접 참조를 연결하거나 Start, Awake에서 한 번만 찾아 캐싱해서 사용하는 방식이 더 안정적이다.

Comments