참조가 Find보다 낫다
Coddy Unity 여정의 Unity 스크립팅 기초 섹션에 포함된 레슨. 67개 중 45번째.
스크립트가 다른 객체에 접근하는 방법은 네 가지입니다. Inspector에서 설정한 필드, 이름으로 찾는 GameObject.Find, 태그 검색, 유형으로 찾는 FindAnyObjectByType입니다. 처음부터 씬에 있는 객체라면 Unity 코드에서는 세 가지 이유로 Inspector 필드를 사용합니다.
- 속도. 참조는 게임이 시작되기 전에 채워집니다. 검색할 때마다 씬의 객체들을 모두 살펴보며,
Update()에서 검색하면 매 프레임마다 그렇게 합니다. - 안전성. 문자열로 지정한 이름은 누군가 객체의 이름을 바꾸면 문제가 생깁니다. Find는
null을 반환하고, 해당 객체를 사용하는 줄에서 나중에 오류가 발생합니다. Inspector 필드가 비어 있으면 UnassignedReferenceException이 발생하며, 예외에는 필드와 스크립트의 이름이 표시됩니다. - 명확성. Inspector를 보면 스크립트가 무엇에 의존하는지 알 수 있습니다. Find 호출은 그 사실을 코드 안에 숨깁니다.
// Inspector에서 한 번 설정: 검색이 필요 없고, 이름을 바꿔도 아무 영향이 없음
[SerializeField] private Transform door;
// 매 프레임 검색하며, 문의 이름을 바꾸면 null이 됨
void Update()
{
Transform d = GameObject.Find("Door").transform;
}검색이 필요한 경우도 있습니다. 게임 실행 중에 생성되는 객체처럼 게임이 실행된 후에만 존재하는 객체나, 어떤 씬에서든 작동해야 하는 스크립트가 그런 경우입니다. 이런 경우에도 Start()에서 한 번만 검색하고 결과를 필드에 저장하세요.
직접 해보기
이 레슨에는 코드 챌린지가 없습니다.
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.