유니티는 컴포넌트 단위의 개발 방식을 사용하는 게임 엔진으로 유니티의 게임 월드를 존재하는 요소들은 Scene 안에 게임 오브젝트로 존재하고 이러한 게임 오브젝트는 컴포넌트로 필요한 기능을 추가하여 하나의 완성된 기능을 수행합니다. 예로 씬에서 빈 오브젝트를 만들어보면 기본적인 컨포넌트인 transform 컨포넌트가 포함되어있습니다. 이를 다시 이야기하면 "Scene 안에 존재하는 모든 오브젝트들은 최소 위치나 회전 크기 값을 가지고 있어야 된다."라고 해석이 가능할 것 같은데요. 유니티 사용에서 꼭 필요한 컨포넌트 찾는 검색 방법인 GetComponent 사용 방법을 알아보겠습니다.
1. 먼저 알아야 할 내용
기본적인 전제 정보를 알고 나면 컴포넌트를 찾는 문법은 어렵지 않습니다. 그렇기에 문법보다 제가 알고 있는 개념적인 이야기를 정리해서 순서대로 정리해보았습니다.
1-1. 게임 오브젝트에 대하여
유니티 프로젝트 Scene 안에 요소를 이루는 최소 단위인 게임 오브젝트는 컴포넌트를 추가하여 기능을 얻습니다. 서론에서 이야기했듯이 빈 게임 오브젝트를 만들면 기본적으로 transform 컨포넌트를 포함하여 기본적으로 위치나 크기, 회전에 대한 기능을 사용할 수 있습니다.
1-2. 컴포넌트에 대하여
1항에서 알아본 내용을 다시 역으로 이야기하면 컴포넌트는 무조건 게임 오브젝트에 붙어 있어야 하고 컴포넌트를 찾으려면 컴포넌트가 붙어있는 게임 오브젝트를 알아야 한다는 결론을 얻을 수 있습니다. 여기까지가 GetComponent 함수를 사용하기 위한 전제 정보입니다. 추가로 프로젝트에서 코딩 시 사용하는 MonoBehaviour를 상속한 C# 스크립트는 하나의 컨포넌트로써의 역할을 합니다.
1-3. gameobjet와 transform
유니티 게임 코딩에서 자주 접근하게 되는 gameobject나 transform는 각각 데이터 형태를 나타내는 키워드 GameObject과 Transform의 인스턴스화 된 오브젝트를 뜻합니다. 다시 이야기해서 컨포넌트인 C# 스크립트에서 gameobject는 해당 스크립트가 붙어있는 게임 오브젝트를 뜻하고 transform은 해당 스크립트가 붙어있는 게임 오브젝트의 transform을 뜻합니다. 아래는 확인 코드와 유니티 에디터에서 실행 결과입니다.
using UnityEngine;
public class NewBehaviourScript : MonoBehaviour
{
Transform[] transforms;
void Start()
{
transforms = new Transform[4];
transforms[0] = gameObject.GetComponent<Transform>();
transforms[1] = transform;
transforms[2] = gameObject.transform;
transforms[3] = this.gameObject.transform;
for(int i =0; i < transforms.Length -1; i++)
if(transforms[i] == transforms[i+1])
Debug.Log(i + "번째와" + (i+1) + "번째의 트렌스폼 컨포넌트는 같은 컨포넌트 입니다.");
}
}
요점
- Scene안에 최소 단위는 게임 오브젝트입니다.
- 게임 오브젝트는 컴포넌트를 추가하여 기능을 얻습니다.
- 컨포넌트를 찾으려면 해당 컴포넌트가 이어져있는 게임 오브젝트를 먼저 알아야 합니다.
- 스크립트 내에서 gameobjet와 transform를 통해 게임 오브젝트나 트렌스폼에 바로 접근할 수 있습니다.
2. GetComponent 사용법
GetComponent는 GameObject 클래스에 있는 함수로서 실행 시 연결돼있는 게임 오브젝트에 제너릭으로 입력된 데이터 형태를 컴포넌트에서 찾아 가장 첫 번째 컴포넌트를 반환합니다. 해당되는 데이터 형태가 없을 경우에는 null을 반환합니다. 아래는 BoxCollider 컨포넌트의 레퍼런스를 찾아오는 GetComponent의 사용 예시입니다.
using UnityEngine;
public class NewBehaviourScript : MonoBehaviour
{
BoxCollider boxCollider;
void Start()
{
boxCollider = GetComponent<BoxCollider>();
}
}
2-1. 다른 게임 오브젝트의 컴포넌트를 찾는 방법
당연한 이야기지만 다른 게임 오브젝트가 어디에 있든 컴포넌트를 가져오기 위해서는 해당 컴포넌트가 이어져있는 게임 오브젝트를 찾아야 합니다. 그래서 정답은 레퍼런스가 필요한 컴포넌트가 이어져 있는 게임 오브젝트를 찾으면 해결됩니다. 아래는 게임 오브젝트를 찾는 함수 모음입니다.
게임 오브젝트의 레퍼런스를 얻는 방법 | |
FindObjectOfType<T>(); | 해당 문법은 제너릭으로 지정된 타입의 컨포넌트 중 하이어라키뷰에서 가장먼저 검색되는 컨포넌트를 리턴하는데 해당 레퍼런스를 얻어 역으로 gameobject로 접근하는 방법 입니다. 씬내에서 특별하게 1개의 스크립트가 붙어있는 경우 고려해 볼만 합니다. |
GameObject.Find("Hand") | 해당 함수의 입력 문자열과 이름이 일치하는 게임오브젝트 중 하이어라키뷰에서 가장먼저 검색되는 게임오브젝트를 리턴합니다. 비활성화된 게임오브젝트는 리턴이 되지않습니다. |
GameObject.FindWithTag("Respawn"); | 모든 사항은 위와 동일하며 태그를 기준으로 게임오브젝트를 찾아 리턴합니다. |
인스펙터 뷰를 통한 직접 참조 | 필요한 게임오브젝트를 public 이나 serialize를 통해 인스펙터뷰에서 미리 참조를 얻어 해당 게임오브젝트에서 컨포넌트의 레퍼런스를 획득하는 방법 입니다. 가장 비용이 적게 든다고 생각합니다. |
위에서 표기한 내용 외에도 자세한 방법이 궁금하시면 게임 오브젝트를 찾는 방법을 참고하시길 바랍니다.
2-2. GetComponent의 확장
아래는 컴포넌트를 부모나 자식 게임 오브젝트 기준으로 가져오거나 복수의 컴포넌트를 배열로 가져오는 문법 표입니다. 함수 명령의 이름이 너무 잘되어있어서 별도의 설명 없이 표로 추가하였습니다.
컨포넌트를 찾는 다양한 방법 | |
GetComponents<T>(); | 연결된 게임오브젝트에 부착되어있는 컨포넌트들을 배열로 반환합니다. |
GetComponentInChildren<T>(); | 자식 게임오브젝트에 부착되어있는 컨포넌트를 반환합니다. |
GetComponentsInChildren<T>(); | 자식 게임오브젝트에 이어져있는 컨포넌트들을 배열로 반환합니다. |
GetComponentInParent<T>(); | 부모 게임오브젝트에 부착되어있는 컨포넌트를 반환합니다. |
GetComponentsInParent<T>(); | 부모 게임오브젝트에 부착되어있는 컨포넌트들을 배열로 반환합니다. |
컨포넌트를 찾는 방법 요점
- GameObject의 포함된 GetComponent함수를 이용해 컴포넌트의 레퍼런스를 얻을 수 있습니다.
- GetComponent함수는 제너릭으로 표시한 데이터 형태의 컴포넌트를 찾아 반환합니다.
- GetComponent함수는 제너릭으로 표시한 데이터 형태가 존재하지 않으면 null을 반환합니다.
- 다른 게임 오브젝트의 컴포넌트를 찾으려면 해당되는 게임 오브젝트부터 찾아야 합니다.
3. GetComponent 성능 관련
위에 나열한 게임 오브젝트나 컴포넌트를 찾는 방법에 사용되는 명령들은 시스템적으로 비용이 많이 소모되어 Start 함수를 통하거나 인스펙터 뷰를 통해 미리 참조하여 사용하는 게 일반적입니다. 특히 Update 같은 반복 함수에 검색 구문을 사용하는 것은 권장되지 않습니다. 때에 따라 참조해야 하는 대상 컨포넌트가 변경하는 등 필요한 경우 단발성으로 사용하는 것은 크게 문제 되지 않는 것 같습니다.
'유니티 이야기' 카테고리의 다른 글
[Unity] 유니티 코루틴 사용법 - Coroutine 사용 이유 (0) | 2022.09.18 |
---|---|
[Unity] 유니티 게임 오브젝트를 찾는 방법 - GameObject (1) | 2022.09.16 |
[Unity] 스크립터블 오브젝트 사용 방법 - Scriptable Object (0) | 2022.09.14 |
[Unity] 프로그래밍에 쉽게 입문하는 방법 (0) | 2022.09.05 |
[Unity] 구글 시트에서 데이터 읽어오기 (0) | 2022.09.04 |
댓글