Find 함수

 

GameObject.Find("ObjectName");

씬에서 게임 오브젝트를 이름으로 검색해 반환

활성화된 게임 오브젝트만 검색 가능

게임 오브젝트의 이름이 변경될 경우, 문제가 발생할 수 있음

 

 

GameObject.FindWithTag("TagName");

씬에서 게임 오브젝트를 태그로 검색해 반환

활성화된 게임 오브젝트만 검색 가능

GameObject.Find보단 빠름

태그의 첫 번째 오브젝트만 반환

 

GameObject.FindGameObjectsWithTag("TagName");

특정 태그를 가진 모든 오브젝트를 반환

 

 

Transform.Find("ChildName");

현재 객체의 자식 중에서 특정 이름을 가진 Transform 반환

비활성화 여부 상관없음

 

 

Object.FindObjectOfType<T>();

T 타입의 첫 번째 활성화되어 있는 오브젝트 반환

클래스 타입을 검색할 때 사용

 

Object.FindObjectsOfType<T>();

T타입의 활성화되어 있는 모든 오브젝트 반환

 

 

Resources.FindObjectsOfTypeAll<T>();

T타입의 모든 오브젝트를 활성화 여부 상관없이 반환

 

 

Resources.Load<"파일경로">();

Resources폴더에서 이름으로 에셋(프리팹, 텍스쳐, 오디오 등) 검색해 반환

런타임에 동적으로 에셋 로드 가능

파일경로를 잘못 지정하면 null 반환 - 유지보수 어려움

큰 파일을 로드할 경우 성능문제가 생길 수 있고, 모든 플랫폼에 적합하지는 않아 사용에 주의해야 한다.

 

 

 

Find함수를 자제해야 하는 이유

Find 함수는 씬에 있는 모든 객체(또는 특정 기준에 따른 객체들)를 순회하며 일치하는 객체를 찾는다.

따라서 객체가 많아질수록 검색시간이 길어지며 프로그램의 성능이 떨어질 가능성이 있다.

 

문자열 기반 검색인 Find함수는 이름이 변경될 경우, 제대로 작동하지 않는다.

또, 문자열을 사용하기 때문에 디버깅이 어려워질 수 있다.

 

활성화된 객체만 대상인 Find함수는 비활성화된 객체를 찾으려 한다면 null을 반환해

NullReferenceException이 발생할 수 있다.

 

 

 

Find 함수의 대안

  1. Inspector에서 필요한 객체를 직접 참조하도록 설계
  2. GetComponent 사용 (GetComponentInChildren, GetComponentInParent) 
  3. 자주 참조하는 객체는 싱글톤 패턴 적용
  4. 객체를 직접 참조하지 않고 이벤트(Action 등)로 접근
  5. Find함수보단 FindWithTag가 더 효율적이며 안정적이다. Find함수를 쓰고 싶다면, 좀 더 나은 Find 함수 사용(자식중에 찾는 객체가 있다면 Transform.Find 사용)
  6. 정 쓰고싶다면 Update가 아닌, Start나 Awake에서의 Find함수 사용으로 Find함수를 한 번만 사용할 수 있도록 코드를 구성

 

 

'취준 > 기술면접' 카테고리의 다른 글

Unity의 Scene Load  (0) 2024.11.26
Texture와 Sprite  (0) 2024.11.22
벡터 정규화(Nomarlized)  (0) 2024.11.20
Unity에서의 Coroutine (코루틴), IEnumerator  (0) 2024.11.19
필드(Field)와 프로퍼티(Property)  (0) 2024.11.18