I'm FanJae.
[20260528] Unity 정리 ( Find 계열 ) 본문
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에서 한 번만 찾아 캐싱해서 사용하는 방식이 더 안정적이다.
'Unity > Unity 초격차캠프' 카테고리의 다른 글
| [20260529] Unity 정리 ( 싱글톤 패턴, Singleton Pattern ) (0) | 2026.05.29 |
|---|---|
| [20260528] Unity 정리 ( Coroutine ) (0) | 2026.05.28 |
| [20260527] Unity 정리 ( UI Canvas ) (0) | 2026.05.27 |
| [20260527] Unity 정리 ( Overlap 계열, Check 계열 ) (0) | 2026.05.27 |
| [20260527] Unity 정리 ( Unity Raycast 응용 : LayerMask, Tag, Raycast를 이용한 상호작용 ) (0) | 2026.05.27 |