패링 게임 - 6 (awake 문제)

Labin·2025년 4월 14일

패링 게임

목록 보기
8/14

해결한 문제

awake()와 start()에 관한 문제.

사실 문제라기 보단 의문에 가깝다. 왜 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>();
    }

이건 정상적으로 작동

profile
공부를 기록하는 공간

0개의 댓글