"깊이"가 다른 게임개발자 허민영

유저에서 게임까지, 철학에서 코딩까지, 본질을 보는 게임개발

내일배움캠프

트러블 슈팅 상속으로 인한 프로시저 꼬임

허민영 2025. 2. 20. 11:13

문제 발견 : Player와 상호작용을 할 수 있는 객체들의 부모클래스 InteractObject와 그 자식 클래스 NPC를 작성하는 중 예상과 다르게 런타임에서 infoImage의 SetActive를 변경하는 시점에서 Null ref 에러 발생.

문제 분석.   1.  infoImage를 가져오는 메서드 GetComponentInChildren이 호출되는 Awake시작점에 로그작성

                     -> Awake 호출됨

                   2. GetComponentInChildren 메소드 이후 로그 작성

                     -> GetComponentInChildren 호출 안됨,  base.Awake에서 문제발생 확인.

                   3. Awake 시작점에 중단점 작성 유니티에 연결하여 런타임 점검

부모클래스 InteractObject 코드

                4. 부모클래스에서 vitual Awake에서 virtual InteractReset메서드 호출 확인

                5. Override 된 NPC의 InteractReset 호출 <문제 이해>

 

문제점. 부모클래스에서 vitual Awake에서 virtual InteractReset을 활용하여 상태를 초기화하려고 함수를 호출 했으나, vitual의 특성상 override된 자식클래스의 메서드가 먼저 실행되면서 예상과 다른 시퀀스가 발생함. 부모클래스의 코드 작성시점과 NPC의 코드 작성 시점이 차이가 생겨서 시퀀스를 놓치게 됨.

 

보안방향. virtual 메서드에서 virtual 메서드를 호출하는 방식은 override 상태를 모르기에 매우 주의해야 하며 지양되는 방식으로 숙지. 코드는 메서드를 이용하지 않고 직접 초기화하는 방식으로 수정. 만약 초기화 내용이 길어진다면 private 초기화 메서드를 만들어 vitual 메서드 -> private 메서드의 시퀀스를 만드는 것이 유효할 것으로 생각함.

 

결론. virtual 메서드에서 virtual 메서드로 이어지는 시퀀스는 주의가 필요함.