본문 바로가기
게임 개발 일지/내일배움캠프 TIL

[Unity] 유니티에서 오브젝트 찾기

by 빛하_ 2024. 3. 5.

코드 작성 시 특정 오브젝트를 찾아서 명령을 전달하고 싶을 때가 있다.

Unity의 GameObject는 항상 transform 컴포넌트를 가지고 있다.

따라서 게임 오브젝트를 찾는 가장 쉬운 방법은 transform 컴포넌트를 활용하는 것이다.

 

1. transform을 통해 부모나 자식 transform에 접근하기

(1) transform.Find("오브젝트의 이름");

자식 transform 중 Find 함수의 입력부에 해당하는 문자열과 일치하는 오브젝트 이름을 가진 transform을 반환한다.

만약 없다면 null을 리턴한다.

 

(2) transform.GetChild(index)

transform의 자식 중 index 번호에 맞는 transform을 반환한다.

GetChild(0)은 첫 번째 자식이다. 자식이 없는 경우 Transform child out of bounds 에러가 발생한다.

 

(3) transform.parent

transform의 부모를 찾는다.

 

* 특징 *

1) 게임 오브젝트에서 transform으로 바로 접근이 가능함, 또한 그 역도 가능

2) transform에서 부모나 자식 transform으로 접근이 가능함

 

 

2. 게임 오브젝트 찾기

(1) Inspector 직접 참조하기

코드 내에서 [SerializeField] 사용, 또는 public 으로 게임 오브젝트 선언해 Inspector 상에서 참조를 얻는다.

 

(2) GameObject.FindWithTag("태그 이름");

GameObject.FindGameObjectWithTag("태그 이름");

입력부의 문자열과 동일한 태그를 가진 오브젝트를 hierarchy 에서 찾는다.

검색되는 첫 번째 오브젝트를 반환한다. 

해당 태그를 가진 오브젝트가 없는 경우 null을 리턴한다.

 

(3) GameObject.Find("오브젝트 이름");

입력부의 문자열과 동일한 이름을 가진 오브젝트를 hierarchy 에서 찾는다.

검색되는 첫 번째 오브젝트를 반환한다.

해당 태그를 가진 오브젝트가 없는 경우 null을 리턴한다.

 

(4) GameObject.FindGameObjectsWithTag("태그 이름");

하나의 태그를 가진 모든 오브젝트를 찾을 때 유용하다.

FindWithTag()와 동일하지만, 오브젝트의 배열을 반환한다는 차이가 있다.

 

 

3. Find 함수의 단점

  • GameObject.Find는 유니티의 씬에 있는 모든 GameObject를 검색해 매칭되는 이름을 찾는다. (오버헤드)
  • 문자열로 입력하기 때문에 대소문자를 잘못 입력하거나 오타가 있으면 오류가 발생한다.
  • 중복된 이름의 GameObject가 있으면 어떤 GameObject를 가져올지 모르기 때문에 신뢰성이 떨어진다.
  • GameObject.Find() 함수의 오류는 주로 런타임 환경에서 발생하는데,   
    컴파일 과정에서 오류를 확인하지 못하기 때문에 버그를 잡기 어려워질 수 있다.
  • 문자열로 입력하기 때문에 IDE를 이용한 자동 완성 기능을 사용할 수 없다.
  • 만약 찾고자 하는 오브젝트의 이름이 변경되면 더 이상 찾을 수 없게 된다. (코드와 게임 환경 간의 일관성 오류)

* find의 대안으로 직접 참조, 싱글턴 패턴 사용 등이 있다.

직접 참조 : inspector에서 컴포넌트와 게임 오브젝트를 직접 할당함

싱글턴 : 전역 단일 인스턴스가 필요하다면 싱글턴 사용

 

 

댓글