새소식

etc

[유니티(Unity)] 스크립트에서 특정 오브젝트(object) 찾는 법 완벽 정리(그림 포함)

  • -

유니티로 개발을 하다 보면 스크립트에서 다른 object를 찾아서 써야 할 경우가 생기더라구요

예를 들어 어떤 object를 찾아서 비활성화 시킨다던지 하는 경우에 사용했어요

그러면 유니티에서 특정 object를 찾는 방법에는 무엇이 있는지 알아볼까요??

 

<유니티(unity) object 찾기 >

1. Scene 전체에서 찾기

Scene 전체에 있는 object들 중에서 찾는 방법입니다.

전체에서 원하는 object를 찾을 수 있다는 장점이 있지만

이는 비활성화된 object는 찾을 수 없습니다.

즉 아래 사진 처럼 비활성화 된 상태의 object들은 객체를 찾을 수 없으니 유의하세요!!!

비활성화된 object(왼쪽)와 활성화된 object(오른쪽)

 

 

그러면 어떠한 함수들이 활성화 된 object를 찾을 수 있게 도와줄까요??

GameObject.Find("이름") 
GameObject.FindWithTag("태그") 
GameObject.FindGameObjectsWithTag("태그"); 

총 3가지의 방법이 있습니다

크게는 두가지에요. 이름으로 찾는 방법과 태그로 찾는 방법!!

직접 한 번 해볼까요???

 

1.1 GameObject.Find("이름")

두 개의 object를 아래 처럼 만들고 스크립트 하나를 둘 중 하나에 넣어주세요

저는 아래 처럼 A와 Other라는 이름의 빈 오브젝트 두개를 만들었어요

두 개의 object

 

이번에는 스크립트를 작성해봐야겠죠??

start 함수를 아래 처럼 바꿔줍시다

그리고 스크립트는 생성하여 A에 넣었어요

    void Start(){
        GameObject obj = GameObject.Find("Other");
        Debug.Log(obj);
    }

 

그리고 유니티로 돌아와서 실행하면 콘솔 창에 아래와 같이 뜨는 것을 볼 수 있습니다

찾지 못했다면 Null이 출력 되었을텐데, 잘 찾아서 잘 출력 되었네요

전체에서 찾은 Other object

 

1.2 GameObject.FIndWithTag("태그")

이번에 해볼 방법은 태그 이름으로 찾는거에요

오브젝트들 마다 태그들을 설정해줄 수 있어요

즉 같은 부류들끼리 별도의 이름을 달아줄 수 있는거죠

예를들어 여러 몬스터들이 있고 이것을 모두 적(enemy)로 통칭하는 태그를 달아 줄 수 있어요

 

위에서 만든 Other 오브젝트에 태그를 달아줍시다

저는 기본으로 있는 태그인 Player 태그를 선택했어요

Other 오브젝트에 태그 설정하기 

 

그러면 이제 아까 작성했던 스크립트로 돌아가서 아래와 같이 코드를 바꿔 주고 실행해 봅시다

    void Start(){
        GameObject obj = GameObject.FindWithTag("Player");
        Debug.Log(obj);
    }

 

그래도 여전히 잘 찾아서 출력 되는 모습을 볼 수 있습니다.
만약 똑같은 태그를 가진게 2개가 있다면 hierarchy 상에서 아래 쪽에 있는 것을 찾는 것 같습니다!!

 

1.3 FindGameObjectsWithTag()

이 FindGameObjectsWithTag 함수도 태그를 이용해서 오브젝트들을 찾을 수 있어요

근데 하나만 있으면 됐지 왜 똑같은 함수가 또 있냐구요???

다르니까 있겠죠?? ㅎㅎㅎ

이름에서 보이듯이 Object가 아닌 Objects 즉 복수입니다.

여러개를 찾을 수 있다는 뜻!!!!

1.2에서 말씀 드렸듯이 똑같은 tag를 가진 오브젝트가 2개 이상 있으면 맨 아래 오브젝트 하나만 찾을 수 있습니다

 

그런데 특정 태그를 가진 모든 오브젝트를 찾고 싶다면?????

그럴때 쓰는 것이 바로 위 함수 입니다. 바로 해보죠

void Start(){
  GameObject[] obj = GameObject.FindGameObjectsWithTag("Player");
  for(int i=0; i<obj.Length; i++){
  	Debug.Log(obj[i]);
  }
}

그리고 지금 scene에는 Other 오브젝트를 복사해서 Player 태그를 가진 오브젝트가 두개가 되었습니다

그리고 실행해봅시다!! 그러면 아래와 같은 콘솔 창을 볼 수 있습니다

FindGameObjectsWithTag 결과

신기하죠??? 결과를 보아하니 가장 아래쪽에 있는 오브젝트가 먼저 들어가나 보네요

 

 

2. 비 활성화된 object 찾기

위에서 사용한 방법으로는 비 활성화된 object들을 찾을 수 없습니다

직접 비활성화 상태로 바꾼 뒤에 해보시기 바랍니다!! 1.3의 함수를 이용하면 아무것도 출력되지 않습니다.

비 활성화된 object를 찾는 방법은 상위 오브젝트를 찾아서 자식 오브젝트를 찾는 방법으로만 가능합니다.

transform.Find("") 
transform.GetChild(i);

 

비활성화된 오브젝트를 찾을 수 있는 경우는

1. 자기 직계 자식이 비 활성화 되어 있는 경우

2. 비 활성화된 오브젝트의 부모를 찾을 수 있는 경우에만 찾을 수 있습니다

 

1의 경우는 이미 하위 오브젝트를 찾는 방법으로 다루었고 (아래 글 참조)

2의 경우를 해봅시다!!

 

scene의 계층 구성

우선 구성은 위와 같이 하였습니다. A에 스크립트를 두고 Other에 false라는 비 활성화된 오브젝트를 둡니다

 

    void Start(){
        GameObject obj = GameObject.Find("Other");
        Debug.Log(obj);
        GameObject active_false = obj.transform.Find("false").gameObject;
        Debug.Log(active_false);
    }

그리고 위와 같이 start함수를 작성합니다

 

그리고 실행해보면 다음과 같은 결과를 볼 수 있습니다

즉 정상적으로 비활성화된 오브젝트를 찾은 것을 볼 수 있습니다

 

유니티에서 특정 오브젝트(객체)들을 찾는 많은 방법들을 알아보았습니다!!

꼭 한 번 씩 해보시고 아 이건 이럴때 쓰면 되겠구나 익히셨으면 좋겠습니다

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.