유니티에서 Gameobject.Find(string name) 함수를 사용하면, 해당 name과 일치하는 오브젝트를 찾아줍니다. 무척 편리한 기능이지만, 활성화된 오브젝트만 찾아준다는 단점이 있습니다. 물론, 비활성화된 오브젝트까지 전부 검색하기엔 속도가 느려지기에 이런 기능이 적합하지만, 때로는 비활성화된 오브젝트를 포함하여 검색해야할 경우도 종종 나오게 됩니다.
이미 2007년부터 많은 외국인 개발자들이 Gameobject.Find(string name, bool active) 함수를 오버로딩해달라는 요청을 했지만, 7년이 지난 지금까지도 받아들여지지 않고 있습니다. 유니티 정책 방향과 맞지 않기 때문일텐데, 어떠한 이유 때문인지는 잘 모르겠네요. 비활성화된 오브젝트를 찾는 비용보다 타입별로 찾는 비용이 더 적게 든다고 생각한걸까요? 여하튼, 유니티에서 공시적인 API를 지원해주지 않는다면, 직접 만들어 쓰는건 당연한 이치! 이미 구글을 뒤져보면 많은 대체 방법들이 나와 있습니다.
제일 간단해보이는 방법으로는 GameObject.FindObjectWithTag("Tag name") 입니다. 구글링을 하면, 가장 먼저 나오는 방법일텐데 아쉽지만 이 함수는 유니티4 버전에 들어오면서 더 이상 inactive 오브젝트를 찾아주지 않습니다.
비활성화된 오브젝트를 찾는 방법은 결국 GameObject.FindObjectsOfTypeAll(Type type) 함수를 쓰셔야합니다. 이 함수는 비활성화된 오브젝트도 포함하여 찾아주지만, 해당 타입의 오브젝트를 모두 불러오기에 성능적인 문제가 발생할 가능성이 농후하기에 사용에 주의하셔야 합니다.
유니티 함수를 사용하지 않는 방법으로는 오브젝트는 활성화 시켜준 채, 렌더러쪽만 비활성화 시킨다던가, 오브젝트를 비활성화 시키기전에 미리 오브젝트를 변수에 담아 두거나, 처음부터 오브젝트를 참조하게 만들어주는 방식의 방법이 있습니다.
0 개의 댓글:
댓글 쓰기