본문 바로가기
유니티 공부

Unity 오브젝트를 스크립트로 찾는법

by g-builder 2024. 10. 18.

1. GameObject.Find("찾고자 하는 오브젝트 이름");

특정 이름을 가진 오브젝트를 직접적으로 찾는 방법이다.

장점:

  • 간단하고 직관적, 특정 이름의 오브젝트를 찾고 싶을 때 바로 사용할 수 있다.

단점:

 

  • 성능 문제: 이름으로 오브젝트를 찾는 방식은 씬 내 모든 오브젝트를 검색하기 때문에 성능에 부정적인 영향을 줄 수 있다. 특히 많은 오브젝트가 존재하는 큰 씬에서 자주 호출된다면 성능 저하가 심해질 수 있다.
  • 오타 문제: 문자열로 오브젝트 이름을 찾기 때문에, 이름이 바뀌거나 오타가 있는 경우 원하는 오브젝트를 찾지 못한다. 이로 인해 디버깅이 어려워질 수 있다.
  • 탐색 문제: 오브젝트가 활성화 되어있어야지만 탐색이 가능하다.

사용 권장 상황:

  • 적은 오브젝트를 다루는 씬이나 일회성 검색일 때 유용하다.

2. GameObject.Find("부모 오브젝트 이름").transform.Find("자식 오브젝트 이름").gameObject;

부모 오브젝트를 먼저 찾은 후, 그 하위 자식 오브젝트를 찾아 반환하는 방식

장점:

  • 부모-자식 관계를 명확하게 표현할 수 있다. 특정 오브젝트의 하위 자식 오브젝트를 찾을 때 유용

단점:

  • 안정성 문제: 부모 오브젝트가 존재하지 않으면 NullReferenceException 오류가 발생할 수 있다. 즉, 부모가 없거나 이름이 잘못되었을 경우 예외 처리를 해야 한다. 오타문제도 동일
  • 부모 오브젝트가 많거나 자식 오브젝트가 많을 때도 성능 문제가 발생할 수 있다.

사용 권장 상황:

  • 부모-자식 관계가 명확하고, 특정 부모 하위의 자식 오브젝트를 찾고자 할 때 적합

3. GameObject.Find("Panel").transform.GetChild(0).gameObject;

이 방법은 Panel이라는 이름을 가진 부모 오브젝트에서 첫 번째 자식(인덱스 0)을 찾는 방식.

장점:

  • 빠름: GetChild(0)은 자식 오브젝트의 순서대로 인덱스로 접근하기 때문에 이름 검색 방식보다 성능적으로 더 나은 선택이다.

단점:

  • 유지보수 문제: 자식의 순서가 바뀔 경우 코드가 의도한 대로 작동하지 않을 수 있습니다. 즉, 자식의 인덱스가 변경될 경우 예상하지 못한 버그가 발생할 수 있다.

사용 권장 상황:

  • 자식 오브젝트의 인덱스가 고정되어 있고, 그 순서가 바뀌지 않을 때 적합. 예를 들어, 자식이 정적으로 유지되는 UI 요소나 짧은 리스트라면 괜찮다

4. GameObject.FindWithTag("태그명");

태그를 이용해 특정 태그가 지정된 게임 오브젝트를 찾는 방식이다.

장점:

  • 성능: 이름으로 검색하는 것보다 효율적. Unity에서 태그를 사용한 검색은 성능적으로 더 빠르고 최적화되어 있다.
  • 유지보수 용이성: 오브젝트 이름이 아닌 태그를 사용하기 때문에, 게임 오브젝트의 이름이 바뀌더라도 태그를 유지하면 문제가 발생하지 않는다.

단점:

  • 중복 태그 문제: 태그는 오브젝트마다 하나씩만 지정할 수 있으며, 중복된 태그를 가진 여러 오브젝트가 있을 경우 의도하지 않은 오브젝트가 반환될 수 있다.

사용 권장 상황:

  • 동일한 태그를 가진 여러 오브젝트 중 하나를 빠르게 찾고자 할 때 적합. 예를 들어 적 캐릭터, NPC, 또는 특정 그룹의 오브젝트를 찾을 때 유용.

결론:

  • GameObject.Find는 직관적이지만 성능에 부담을 줄 수 있고 검색 문제가 발생할 가능성이 있어 자주 사용하지 않는 것이 좋음.
  • 부모-자식 관계가 중요한 상황에서는 transform.Find를 사용하는 것이 좋지만, 부모 오브젝트의 유효성 체크를 항상 해야 한다.
  • 자식 인덱스가 고정된 경우에는 GetChild가 좋은 선택이지만, 인덱스 변경에 대비해 코드의 유지보수를 신경 써야 한다.
  • 태그를 이용한 FindWithTag는 효율적이고 안정적이지만, 태그가 중복되지 않도록 관리가 필요하다.