내일배움캠프 24일차 TIL - 오브젝트 찾기

권태하·2024년 5월 20일
post-thumbnail

GameObject.Find

유니티로 작업을 하다보니 오브젝트끼리 응집도를 낮추면서도 필요한 오브젝트끼리 서로 이어주는 작업이 굉장히 까다롭고 어려웠다.

모든 오브젝트와 스크립트를 한 번에 묶기보다는 흩어져서 설정해두고 필요할 때 GameObject.Find를 이용하니 굉장히 설정이 편해졌다.

사용법

검색을 해서 알아낸 사용법은 다음과 같다.

GameObject obj1 = GameObject.Find("Name"); 
// Object의 이름으로 대상을 찾아서 반환, 이름이 같을 경우 가장 처음 검색된 Object 반환

GameObject obj2 = GameObject.FindWithTag("Tag"); 
// 태그로 대상을 찾아서 반환, 이름이 같을 경우 가장 처음 검색된 Object 반환

GameObject obj3 = GameObject.FindObjectsWithTag("Tag"); 
// 같은 태그를 가진 Object들을 GameObject[] 형태로 반환

실사용

FindObjectsWithTag를 오늘 유용하게 사용했는데,

Scene에 3개의 나열 된 체력 오브젝트를 모두 불러와서 배열에 담고,

정렬 알고리즘으로 왼쪽부터 순서대로 배열에 넣어둔 다음,

체력이 줄어들 때 해당 배열값을 불러와서 꺼뜨렸다.

주의점

1. Active상태인 오브젝트만 찾은 후 검색을 종료한다.

그래서 만약 꺼진 오브젝트를 찾고자 한다면, Active상태인 부모 오브젝트를 먼저 찾고, 그 아래에 자식 오브젝트를 건드려 줘야한다.

    public void FindEndPanel()
    {
        endPanel = GameObject.Find("Canvas").transform.Find("EndPanel").gameObject;
    }

위 코드는 꺼져있는 EndPanel을 찾아주기 위해 Canvas부터 찾아들어간 코드이다.

2. 모든 오브젝트를 훑어보기 때문에 부하가 심하다.

해당 방법을 자주 사용하면 메모리 낭비가 될 것이기 때문에, 써야할 오브젝트를 시작 시점에 몰아두고 사용하는게 좋다고 한다.

너무 잦은 사용은 지양하자.

profile
스터디 로그

0개의 댓글