[TIL] Unity - 디버깅 팁

MINO·2024년 8월 7일
post-thumbnail

2024-08-07


문제

  1. Event 를 등록한 뒤, Invoke 를 통해 호출하는 타이밍에 Event 가 null 인 경우.
DirectorController.cs

private void OnEnable()
{
	// OnCutSceneEvent 에 PlayCutScene 메서드 등록
    GameManager.Instance.TaxManager.OnCutSceneEvent += PlayCutScene;
}

private void OnDisable()
{
	// 씬 이동 시, OnDisable 호출
    GameManager.Instance.TaxManager.OnCutSceneEvent -= PlayCutScene;
}
TaxManager.cs

public void CheckTaxPayment()
{
    if(ClockSystem.Dday - lastPayment <= TaxDue) // 세금 냄
    {
        Debug.Log("세금을 낸 것으로 확인");
    }
    else
    {
        // 컷씬 재생
        Debug.Log("세금 안냈음");
        OnCutSceneEvent?.Invoke();
    }
}

시도

Edit - Project Settings - Script Execution Order 를 통해
스크립트 실행 순서를 바꿔주거나
싱글톤 구조를 바꿔주는 시도도 해봤지만, 모두 실패했다.

GameManager.Instance.TaxManager.OnCutSceneEvent 에는
PlayCutScene 메서드가 잘 등록됐지만

TaxManager - CheckTaxPayment 메서드의 OnCutSceneEvent 에 연결된 메서드는 null 이었다.


디버그 방법 (1)

Unity와 비쥬얼 스튜디오를 연결해준다.
필요한 부분에 종단점을 찍고, 에디터에서 플레이하며
해당 종단점이 찍힌 코드가 실행될 때까지 진행한다.

F11 (한 단계씩 코드 실행) 을 통해, 해당 코드가 실행되기 전과 후에
변수에 어떤 값이 들어갔는지, 적절한 값이 들어갔는지 확인해본다.


디버그 방법 (2)

  1. 평상 시, Inspector 창의 모습이다.

  1. 해당 버튼을 클릭해 Debug 모드로 열어준다.

  1. 해당 오브젝트의 인스턴스 ID , 스크립트나 컴포넌트의 인스턴스 ID 를 통해
    실행 도중 인스턴스가 파괴되고 새로 생성되는지 등을 파악할 수 있다.

해결 방법

싱글톤, DontDestroyOnLoad 특성을 가진 GameManager 안에
TaxManager 를 넣어뒀는데,

Director 오브젝트는 Village Scene 에서만 존재하여 문제가 발생하는 것 같았다.

코드와 이론 상으로는 적절한 순서와 방법이었다고 생각하였지만,
기존 방법 그대로는 해결하지 못하였다.

GameManager 오브젝트 안에 Director 오브젝트를 넣어 씬이 이동할 때도 함께 이동하도록 하여서 해결할 수 있었다.


TIL 마무리

정확한 원인과 해결 방법은 아니지만,
문제 파악과 해결을 위한 시도를 통해 여러 디버그 방법을 시도해보고
코드 사이의 관계나 생명 주기 함수의 실행 순서도 다시 한번 생각해보게 되었다.

profile
안녕하세요 게임 개발하는 MINO 입니다.

0개의 댓글