본문 바로가기
유니티 이야기

[Unity] 유니티 게임 오브젝트를 찾는 방법 - GameObject

by novices 2022. 9. 16.

이번 포스팅에서는 유니티의 게임 오브젝트를 찾아 레퍼런스를 얻는 방법을 알아보려고 합니다. 이전에 작성한 유니티 컴포넌트 찾는 방법에서 이야기했듯이 유니티 scene 안에 게임 오브젝트는 무조건 transform 컨포넌트를 가지고 있습니다. 이러한 이유로 원활하게 원하는 게임 오브젝트를 찾으려면 transform 컨포넌트를 이용해야 합니다. 매번 진행하고 있는 상황에 따라 게임 오브젝트를 찾는 방법은 다를 수 있기 때문에 대표적으로  많이 사용되는 특정 스크립트를 가지고 있는 오브젝트, 부모나 자식 게임 오브젝트, 비활성화된 게임 오브젝트 등을 찾는 방법을 알아보겠습니다.

 

 

1. 먼저 알아야 할 내용

원하는 게임 오브젝트를 원활하게 찾기 위해서는 transform을 이용하여 부모나 자식 오브젝트에 접근하는 방법을 알아야 합니다. transform을 통해 부모나 자식 transform에 쉽게 접근할 수 있고 transform을 포함한 모든 컨포넌트에서는 항상 gameobject에 접근이 가능하기 때문입니다. 아래는 transform의 부모와 자식에 접근하는 대표적인 3가지 방법입니다.

부모나 자식 transform을 찾는 방법
transform.Find("게임오브젝트의 이름"); 자식 transform중 Find 함수의 입력으로 들어가는 문자열과 일치하는 게임오브젝트이름을 가진 transform을 반환합니다. 해당이름을 가진 자식이 없다면 null을 리턴 합니다.
transform.GetChild(인덱스) transform의 자식으로 있는 transform을 인덱스 번호에 맞게 transform을 반환 합니다. GetChild(0)은 자식 트렌스폼중 첫번째 transform을 뜻합니다. 자식이 없는 경우 Transform child out of bounds 예외가 발생합니다.
transform.parent transform의 부모 transform을 뜻합니다.

 

요점

  • 게임 오브젝트에서 transform으로 바로 접근 가능합니다.
  • transform에서 gameobject로 바로 접근 가능합니다.
  • transform에서 부모나 자식 transform으로 바로 접근이 가능합니다.
  • 게임 오브젝트를 원활하게 찾기 위해서는 transform을 이용하여 gameobject로 접근합니다.

 

 

2. 게임 오브젝트 찾기

게임 오브젝트를 찾을 때 가장 많이 사용되는 방법을 4가지입니다. 직접 참조하는 첫 번째 경우를 제외한 나머지 함수는 모든 GameObject 클래스에 포함된 static 함수입니다.

게임오브젝트를 찾는 구문
Inspector 직접 참조 코드내에 [SerializeField] 나 public 으로 게임오브젝트 변수를 선언하여 Inspector를 통해 미리 참조를 얻어서 사용합니다.
GameObject.FindWithTag("태그 이름");
GameObject.FindGameObjectWithTag("태그 이름");
함수의 입력으로 들어가는 문자열을 기준으로 동일한 태그를가진 게임오브젝트를 하이어라키뷰에서 찾습니다. 검색되는 첫번째 게임오브젝트를 리턴합니다. 해당 태그를 가진 게임오브젝트가 없는경우 null을 리턴합니다.
GameObject.Find("게임오브젝트의 이름") 함수의 입력으로 들어가는 문자열을 기준으로 동일한 게임오브젝트의 이름을 가진 게임오브젝트를 하이어라키뷰에서 찾습니다. 검색되는 첫번째 게임오브젝트를 리턴합니다. 해당 태그를 가진 게임오브젝트가 없는경우 null을 리턴합니다.
GameObject.FindGameObjectsWithTag("태그 이름"); FindWithTag() 함수와 동일하게 작동하지만 반환방식이 Gameobject의 배열 리턴합니다. 하나의 태그를 가진 모든 게임오브젝트를 찾을 때 유용합니다.

 

요점

  • gameobject를 찾는 방법은 GameObject클래스의 스태틱 함수를 이용합니다.
  • gameobject를 검색하는 함수는 태그 이름과 게임 오브젝트의 이름을 기준으로 합니다.
  • 특정 tag를 가지는 게임 오브젝트는 한 번에 배열로 검색할 수 있습니다.

 

 

3. 다양한 방법으로 게임 오브젝트 찾기 예시

3항에서는 부모나 자식 게임 오브젝트를 찾는 방법, 특정 스크립트를 컴포넌트로 가지고 있는 게임 오브젝트를 찾는 방법, 비 활성된 게임 오브젝트를 찾는 방법을 알아보겠습니다. 

 

3-1. 부모 게임 오브젝트 찾기

transform.parent로 부모에 접근해서 gameobject를 가져옵니다.

void Example()
{
    GameObject parentGO = transform.parent.gameObject;
}

 

3-2. 자식 게임 오브젝트 찾기

필요한 자식 게임 오브젝트를 이름으로 검색하거나 순번이 인지 되는 경우 GetChild(인덱스)로 자식 transform에 접근하여 gameobject를 찾습니다.

void Example()
{
    GameObject childGO1 = transform.GetChild(0).gameObject;
    // OR
    GameObject childGO2 = transform.Find("자식 게임오브젝트 이름").gameObject;
}

 

3-3. 특정 스크립트(컨포넌트) 게임 오브젝트 찾기

scene 안에 하나만 존재하는 게임 오브젝트의 경우 스크립트(컨포넌트)를 먼저 가져와 gameobject를 찾습니다.

void Example()
{
    GameObject playerGO =  FindObjectOfType<Player>().gameObject;
}

 

3-4. 비활성화된 게임 오브젝트 찾기

3-3항 예시에 사용되는 Player 게임 오브젝트의 하위에 "Weapon"이라는 이름을 가진 게임 오브젝트가 비활성화되어있다고 전제하겠습니다. 이런 경우 GameObject의 스태틱 함수(Find / FindWithTag / FindWithTag)로는 비활성화되어있는 게임 오브젝트를 검색할 수 없어 아래와 같은 방법을 사용합니다.

void Example()
{
    GameObject weaponGO = FindObjectOfType<Player>().transform.GetChild(0).gameObject;  
}

 

3-5. 태그로 게임 오브젝트 찾기

아래는 하나의 게임 오브젝트 / 여러 게임 오브젝트를 찾는 방법입니다.

void Example()
{
    GameObject playerGO = GameObject.FindGameObjectWithTag("Player");

    GameObject[] weapons = GameObject.FindGameObjectsWithTag("Weapon");
}

 

3-6. 게임 오브젝트 활성화 여부 확인

3-4항의 비활성화된 weapon 게임 오브젝트를 찾아 비활성화된 게임 오브젝트를 활성화를 토글 하는 예시입니다. gameobject의 activeSelf로 게임 오브젝트의 활성화 여부를 확인할 수 있습니다.

void Example()
{
    GameObject weaponGO = FindObjectOfType<Player>().transform.GetChild(0).gameObject;
    
    if(!weaponGO.activeSelf) weaponGO.SetActive(true);
}

 

유니티 게임 씬에서 컴포넌트를 찾는 방법에 이어서 게임 오브젝트를 찾는 여러 가지 방법에 대해 알아보았습니다. 이 포스팅에서 가장 중요한 이야기는 예시의 문법보다 transform을 포함한 모든 컨포넌트는 바로 자신의 gameobject에 접근할 수 있다는 사실입니다.

 

 

댓글