유니티 탐색

이인혁·2024년 8월 23일
0

유니티

목록 보기
10/20

GameObject 탐색

유니티에서 스크립트를 작성하다 보면 다른 오브젝트의 정보들이 필요할 때가 많습니다. 그 때 그 오브젝트를 불러올 수 있는 함수들이 유니티 안에 존재합니다. 그 중 GameObject를 그대로 가져오는 함수인 Find계열 함수에 대해 알아보겠습니다.

Find계열 함수는

  • 이름(name)
  • 태그(tag)
  • 타입(type)
    이 3개 각각을 이용해서 찾는 방법이 있습니다. 참고로 Find계열 함수는 Hierachy창에 있는 오브젝트들만 찾을 수 있습니다.

이름(name)

먼저 이름으로 찾는 방법입니다.

GameObject obj = GameObject.Find("object");

이름으로 찾는 방법은 문자열을 비교하기 때문에 상당히 비효율적인 방법입니다. 만약 Hierachy창에 오브젝트가 100개가 있다면, 최악의 상황인 100번의 문자열 비교가 들어갑니다. 그리고 만약 이름이 같은 오브젝트가 있다면, 그 중 무슨 오브젝트를 찾아서 올지 알 수 없습니다. 따라서 그다지 추천드리지 않는 방법입니다.

태그(tag)

태그로 찾는 방법입니다.

GameObject[] objs = GameObject.FindGameObjectsWithTag("object");
GameObject obj = GameObject.FindGameObjectWithTag("object");	

태그로 찾는 방법은 이름으로 찾는 방법보다는 효율적인 방법입니다. 태그에 적힌 문자열을 해쉬함수로 바꿔서 접근하기 때문입니다. 하지만 같은 태그가 여러 개인 경우가 많아서 오브젝트 배열로 받기도 합니다. 특정 오브젝트를 찾을 때 태그가 겹치는 오브젝트들이 많다면, 추천드리지 않습니다.

타입(type)

타입으로 찾는 방법입니다.

GameObject obj = GameObject.FindAnyObjectByType<TypeName>();

특정 오브젝트를 불러올 때 Find계열 함수중에선 가장 효율적인 함수입니다. 같은 TypeName을 가진 오브젝트도 적지 않을 수 있습니다. 하지만 태그와 다르게 TypeName은 잘 겹치지 않기 때문에, 타입으로 찾는 경우가 많습니다.

Find계열 함수의 계산은 결코 가볍지 않습니다. 따라서 반복적이거나 다른 스크립트에서도 똑같은 오브젝트를 불러와야 한다면, GameManager 스크립트를 하나 만들어서 오브젝트를 저장하고 불러오는 것을 추천드립니다.

Component 탐색

GameObject를 탐색하는 이유는 결국 그 오브젝트의 Component를 불러오기 위함입니다. 그렇다면 오브젝트를 찾고 계속 사용하는 것보다는 그 오브젝트의 Component만 불러오는 것이 효율적일 겁니다. 또한 해당 오브젝트의 스크립트에서도 오브젝트의 Component를 불러오고 싶을 때가 많습니다. 유니티에는 그럴 때 사용할 수 있는 Component탐색 함수가 구현되어 있습니다.

  1. GetComponent

  2. GetComponents

  3. GetComponentInChildren

  4. GetComponentsInChildren

GetComponent

Rigidbody2D rigid = gameObject.GetComponent<Rigidbody2D>();

컴포넌트 타입이름으로 손쉽게 불러올 수 있습니다. 특정 컴포넌트 1개가 필요할 때 사용하는 함수입니다.

GetComponents

Rigidbody2D[] rigid = gameObject.GetComponents<Rigidbody2D>();

같은 컴포넌트가 여러 개를 가지고 있을 때, 사용하는 함수입니다. 찾는 타입의 모든 컴포넌트들을 배열 안에 저장합니다.

GetComponentInChildren

Rigidbody2D rigid = gameObject.GetComponentInChildren<Rigidbody2D>();

해당 오브젝트의 자식오브젝트에서 Component를 불러오는 방법입니다. 자식들이 아무리 많아도 저 함수가 잘 작동하려면 같은 타입의 컴포넌트는 1개여야 합니다.

GetComponentsInChildren

Rigidbody2D[] rigid = gameObject.GetComponentsInChildren<Rigidbody2D>();

자식오브젝트들에 찾는 컴포넌트가 2개 이상이면, 사용하는 함수입니다. 모든 자식들의 컴포넌트를 가져와 배열에 저장합니다.

마치며

컴포넌트를 가져오기 위해서는 반드시 컴포넌트를 가지고 있는 오브젝트가 있어야 합니다. 만약 다른 오브젝트의 컴포넌트를 가져와야 한다면 그 오브젝트를 찾고 컴포넌트를 찾아야 합니다.

Boss obj = FindAnyObjectByType<Boss>();
Rigidbody2D rigid = obj.GetComponent<Rigidbody2D>();
profile
게임개발공부블로그

0개의 댓글