Unity에서 GetComponent<Animator>()가 Null을 반환하는 문제 해결

갱밍·2023년 7월 15일

Unity 개발을 처음 시작할 때 종종 예상치 못한 문제에 부딪히는 경우가 많죠! 이번 포스트에서는 그 중 하나인, GetComponent()가 null을 반환하는 문제를 다루고자 합니다.

🔍 문제 상황

Animator 컴포넌트가 분명 게임 오브젝트에 추가되어 있음에도 불구하고, GetComponent() 호출 시 null이 반환되는 상황이에요.
이는 컴포넌트를 가져오는 동작이 예상대로 이루어지지 않아서 발생하는 문제입니다.

🤔 원인 분석

이 문제는 주로 두 가지 상황에서 발생해요:

  1. 게임 오브젝트에 Animator 컴포넌트가 실제로 없는 경우
  2. 코드의 실행 순서나 생명주기 때문에 Animator 컴포넌트가 아직 준비되지 않은 상태에서 GetComponent()를 호출하는 경우

저는 2번에 해당했습니다.

✅ 해결 방법

  1. 스크립트 체크
    => 해당 게임 오브젝트에 스크립트가 확실히 연결되어 있는지 확인해보세요. 물론 몇 번씩 확인해보셨겠지만 의외로 여기서 오류가 나는 일도 많습니다.
  2. GetComponent() 호출 위치를 변경
    => 초기화 위치 변경
    현재 Start() 메서드에서 GetComponent()를 호출하고 있다면 Awake() 메서드로 바꿔보세요.

🎓 Awake() vs Start()

아까 위에서 말한 것처럼 GetComponent<>()가 null을 반환하는 경우는 컴포넌트가 아직 준비되지 않았기 때문입니다.

그럼 GetComponent를 쓰기 전에 컴포넌트를 준비시켜줘야겠죠?!
여기서 Awake와 Start의 차이가 나옵니다.

Awake()

  • 게임 오브젝트가 생성될 때 호출되는 첫 번째 메서드
  • 스크립트의 모든 초기화 작업을 수행하는 데 적합한 위치
  • 게임 오브젝트가 비활성화 상태여도 호출된다

Start()

  • Awake() 다음에 호출되는 메서드
  • 게임 시작 전에 필요한 초기화 작업을 수행
  • 하지만 게임 오브젝트가 활성화 상태일 때만 호출된다

Awake()는 모든 스크립트의 Start() 메서드가 실행되기 전에 호출되므로, Awake() 메서드 내에서 GetComponent()를 호출하면 문제를 해결할 수 있어요.

profile
공부 기록 중입니다

0개의 댓글