반응형
아래와 같은 상속 구조의 코드가 있다고 가정해보자
public class BaseController : MonoBehaviour
{
protected virtual void Awake()
{
_rd = GetComponent<Rigidbody2D>(); // 컴포넌트 초기화
}
}
public class NPCController : BaseController
{
protected override void Awake()
{
NPCManager.Instance.RegisterNPC(this);
}
}
계속 NPCController에서 _rd가 없다는 null exception에러가 떴다.
뭐가 문제였을까?
자식 클래스는 부모의 모든 기능을 물려받는다. 그러나 부모 메서드를 재정의하면 자식 클래스에서 부모 메서드는 자동적으로 실행되지 않는다.
base.Awake() 빠트린게 문제였다.
이게 빠지면 필드가 초기화되지 않는다. 기본적으로 부모 Awake를 호출하고 자식 Awake를 호출할 수 있다고 생각할지도 모르겠지만 override된 경우 부모 Awake는 호출하지 않는다. 그러므로 Null 에러가 발생할 수 있다.
protected override void Awake()
{
base.Awake(); // 부모의 Awake() 먼저 실행
NPCManager.Instance.RegisterNPC(this);
}
부모가 MonoBehaviour니까 Unity가 알아서 부모→자식 순으로 실행해주지 않을까?
(이렇게 생각했었다..)
Unity가 자동 호출하는 건 해당 스크립트 클래스에 정의된 Awake 한개 뿐이다. 자식 클래스에서 override 했다면 Unity는 자식의 것만 호출하고 부모의 Awake는 호출되지 않는다.
결론
Awake중복 정의시 부모의 Awake는 실행하지 않으므로 base.Awake를 명시적으로 호출해야한다.
반응형
'유니티 공부 > Unity' 카테고리의 다른 글
Unity - Strategy Pattern(전략 패턴)을 사용해 씬에 따라 플레이어의 조작 방식을 달라지게 만들어보자 (0) | 2025.05.07 |
---|---|
Unity - MissingReferenceException 에러 해결 방법(+) Dontdestroyonload) (0) | 2025.05.02 |
Unity - 코루틴 중복 사용 막는법 (0) | 2025.05.01 |
Unity - 디버그 프로필에 지정된 디버그 실행 파일 .exe가 없습니다 에러 (0) | 2025.04.21 |
C# - JSON 파일 직렬화/역직렬화시 주의 사항 정리(Tuple, 프로퍼티, 한글이 깨지는 경우) (0) | 2025.04.15 |
댓글