사실 문제라기 보단 의문에 가깝다. 왜 start()로 초기화 했을 땐 문제 없던 것이 awake()로 초기화하면 문제가 생길까?에 대한 의문.
한 오브젝트에 붙어있는 다른 컴포넌트를 불러올 때 사용했는 데, 오류가 발생.
Awake()에서 오류가 발생하는 이유는 객체 자체는 이미 생성되었지만, 그 객체에 붙어 있는 컴포넌트들이 완전히 초기화되지 않은 상태에서 다른 컴포넌트를 참조하려고 시도했기 때문이라 한다.
Unity에서 Awake()는 객체가 생성된 직후에 호출되지만, 그 시점에서는 다른 컴포넌트들이 완전히 초기화되지 않았을 수 있다. 특히, Awake()가 호출될 때는 컴포넌트가 다른 객체나 스크립트와 의존 관계가 있을 때 그 참조가 null일 수 있다. 그래서 Animator나 Monster_Stats와 같은 컴포넌트를 Awake()에서 접근하면 아직 초기화되지 않아서 NullReferenceException이 발생.
반면, Start()는 Awake() 후에 호출되므로, 다른 컴포넌트들이 모두 초기화된 후에 접근할 수 있어 오류가 발생하지 않습니다.
내가 사용하는 것은 한 곳에서 사용하는 것이 아닌 다른 곳에서도 참조하기 때문에, 복잡하게 얽혀있는 컴포넌트를 awake()에서 초기화 해버리면 Null이 발생할 수 있다는 것.
비슷하지만 이를 부모가 아닌 자식 오브젝트에서 GetComponentInParent를 awake()로 초기화 하는 것은 오류가 없는 것으로 보아, 부모가 먼저 생기는 듯?
Hero.cs
void Start () {
m_stats = GetComponent<Hero_Stats>();
m_weaponCollider = GetComponentInChildren<WeaponCollider>();
m_sensorHero = GetComponentInChildren<Sensor_Hero>();
m_animator = GetComponent<Animator>();
}
awake()로 하면 오류 나는 코드
Sensor_Hero.cs
private void Awake()
{
m_animator = GetComponentInParent<Animator>();
m_hero = GetComponentInParent<Hero>();
m_stats = GetComponentInParent<Hero_Stats>();
}
이건 정상적으로 작동