유니티로 개발을 하다 보면 스크립트에서 다른 object를 찾아서 써야 할 경우가 생기더라구요
예를 들어 어떤 object를 찾아서 비활성화 시킨다던지 하는 경우에 사용했어요
그러면 유니티에서 특정 object를 찾는 방법에는 무엇이 있는지 알아볼까요??
<유니티(unity) object 찾기 >
1. Scene 전체에서 찾기
Scene 전체에 있는 object들 중에서 찾는 방법입니다.
전체에서 원하는 object를 찾을 수 있다는 장점이 있지만
이는 비활성화된 object는 찾을 수 없습니다.
즉 아래 사진 처럼 비활성화 된 상태의 object들은 객체를 찾을 수 없으니 유의하세요!!!
그러면 어떠한 함수들이 활성화 된 object를 찾을 수 있게 도와줄까요??
GameObject.Find("이름")
GameObject.FindWithTag("태그")
GameObject.FindGameObjectsWithTag("태그");
총 3가지의 방법이 있습니다
크게는 두가지에요. 이름으로 찾는 방법과 태그로 찾는 방법!!
직접 한 번 해볼까요???
1.1 GameObject.Find("이름")
두 개의 object를 아래 처럼 만들고 스크립트 하나를 둘 중 하나에 넣어주세요
저는 아래 처럼 A와 Other라는 이름의 빈 오브젝트 두개를 만들었어요
이번에는 스크립트를 작성해봐야겠죠??
start 함수를 아래 처럼 바꿔줍시다
그리고 스크립트는 생성하여 A에 넣었어요
void Start(){
GameObject obj = GameObject.Find("Other");
Debug.Log(obj);
}
그리고 유니티로 돌아와서 실행하면 콘솔 창에 아래와 같이 뜨는 것을 볼 수 있습니다
찾지 못했다면 Null이 출력 되었을텐데, 잘 찾아서 잘 출력 되었네요
1.2 GameObject.FIndWithTag("태그")
이번에 해볼 방법은 태그 이름으로 찾는거에요
오브젝트들 마다 태그들을 설정해줄 수 있어요
즉 같은 부류들끼리 별도의 이름을 달아줄 수 있는거죠
예를들어 여러 몬스터들이 있고 이것을 모두 적(enemy)로 통칭하는 태그를 달아 줄 수 있어요
위에서 만든 Other 오브젝트에 태그를 달아줍시다
저는 기본으로 있는 태그인 Player 태그를 선택했어요
그러면 이제 아까 작성했던 스크립트로 돌아가서 아래와 같이 코드를 바꿔 주고 실행해 봅시다
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 태그를 가진 오브젝트가 두개가 되었습니다
그리고 실행해봅시다!! 그러면 아래와 같은 콘솔 창을 볼 수 있습니다
신기하죠??? 결과를 보아하니 가장 아래쪽에 있는 오브젝트가 먼저 들어가나 보네요
2. 비 활성화된 object 찾기
위에서 사용한 방법으로는 비 활성화된 object들을 찾을 수 없습니다
직접 비활성화 상태로 바꾼 뒤에 해보시기 바랍니다!! 1.3의 함수를 이용하면 아무것도 출력되지 않습니다.
비 활성화된 object를 찾는 방법은 상위 오브젝트를 찾아서 자식 오브젝트를 찾는 방법으로만 가능합니다.
transform.Find("")
transform.GetChild(i);
비활성화된 오브젝트를 찾을 수 있는 경우는
1. 자기 직계 자식이 비 활성화 되어 있는 경우
2. 비 활성화된 오브젝트의 부모를 찾을 수 있는 경우에만 찾을 수 있습니다
1의 경우는 이미 하위 오브젝트를 찾는 방법으로 다루었고 (아래 글 참조)
2의 경우를 해봅시다!!
우선 구성은 위와 같이 하였습니다. 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함수를 작성합니다
그리고 실행해보면 다음과 같은 결과를 볼 수 있습니다
즉 정상적으로 비활성화된 오브젝트를 찾은 것을 볼 수 있습니다
유니티에서 특정 오브젝트(객체)들을 찾는 많은 방법들을 알아보았습니다!!
꼭 한 번 씩 해보시고 아 이건 이럴때 쓰면 되겠구나 익히셨으면 좋겠습니다