내일배움캠프 21일차 TIL <Unity 과제 트러블 슈팅 TIL> 05/07

정광훈(단기심화_9기)·2025년 5월 7일

TIL (Today I Learned)

목록 보기
32/117
post-thumbnail

트러블 슈팅

  • 배경
    Skelet Npc에게 [F]키를 누르면 대화창이 나오면서 게임 설명을 하고
    다시 [F]키를 누르면 게임을 진행할 것인지 물어보는 것이었습니다.

  • 발단
    문자열 배열에 Npc 대화를 집어넣고
    currentTextIndex를 통해 하나씩 출력되게 하고 싶었습니다.

    하지만 게임 씬에 갔다 오면 설명부분은 스킵되고
    게임을 진행할 것인지에 대한 것만 출력되었습니다.

    이 과정에서 다시 말을 걸 경우 코드가 어떻게 작동하는지
    Debug.Log()를 사용하면 천천히 따라갔습니다.

    그 과정에서 첫 문장을 출력하고 두번째 문장을 출력 후
    게임을 실행시키기 위해 [F]를 누르면 다시 첫문장이 출력되면서
    게임이 시작되는 현상을 발견했습니다.


public class DialogueManager : MonoBehaviour
{
    [SerializeField] GameObject go_dialogueBar;
    [SerializeField] GameObject go_NameBar;

    [SerializeField] TMP_Text txt_dialogue;
    [SerializeField] TMP_Text txt_name;

    TextMeshProUGUI currentScoreText;
    TextMeshProUGUI bestScoreText;

    string[] dialogueSentences = 
        { "오우오우\nFlappy Plane은 스페이스바와 마우스 클릭으로\n장애물들을 피하는 게임이야" ,
          "시작하고 싶으면 [F]를 눌러줘"};

    public int currentTextIndex = 0;
    public bool isWaitingInput = false; // 대화 중인지 확인
    public System.Action OnDialogueEnd; // 대화 종료 시 호출될 콜백 함수

    public void ShowDialogue()
    {
        txt_name.text = "ㄱ스트"; // 오타 아님
        currentTextIndex = 0;
        ShowCurrentText();
        SettingUI(true);
    }

    void Update()
    {
        if (isWaitingInput && Input.GetKeyDown(KeyCode.F))
        {
            currentTextIndex++; // 다음 인덱스로 넘어가 다음 대화를 호출
            Debug.Log('b');
            Debug.Log(currentTextIndex);
            if (currentTextIndex < dialogueSentences.Length)
            {
                Debug.Log('c');
                Debug.Log(currentTextIndex);
                ShowCurrentText();
            }
            else
            {
                SettingUI(false);
                isWaitingInput = false;

                OnDialogueEnd?.Invoke();// 대화가 모두 끝났음을 알림
            }
        }
    }

    void ShowCurrentText()
    {
        isWaitingInput = true;
        txt_dialogue.text = dialogueSentences[currentTextIndex];
        Debug.Log('a');
        Debug.Log(txt_dialogue.text);
    }

    public void SettingUI(bool OnOff)
    {
        go_dialogueBar.SetActive(OnOff);
        go_NameBar.SetActive(OnOff);
    }
}

public class SkeletController : MonoBehaviour
{
    public GameObject textCanvas; // 문구 UI 오브젝트 (Inspector에서 할당)
    public DialogueManager dm; // DialogueManager를 Inspector에서 할당

    public string sceneName; // 이동할 씬의 이름 (Inspector 창에서 설정)
    bool isInteract = false; // 상호작용 가능한지
    bool isDialogueActive = false; // 대화가 활성화되었는지

    void Start()
    {
        dm.OnDialogueEnd += AfterTalking; // DialogueManager의 대화 종료 이벤트에 콜백 함수 등록
    }

    void Update()
    {
        // 플레이어가 트리거 영역 안에 있는 동안 설정된 상호작용 키 (F)를 누르면
        if (isInteract && !isDialogueActive && Input.GetKeyDown(KeyCode.F))
        {
            Interactive();
        }

    }
    
        void Interactive() // 상호작용
    {
        isInteract = true;
        isDialogueActive = true; // 대화가 시작되었음을 표시

        GameObject player = GameObject.FindGameObjectWithTag("Player");

        if (player.CompareTag("Player")) // 트리거에 들어온 오브젝트가 "Player" 태그를 가지고 있는지 확인
        {
            dm.ShowDialogue(); // 대화 시작

            PlayerPositionManager.Instance.SetLastPositionAndScene(
                player.transform.position, SceneManager.GetActiveScene().name); // 현재 위치와 씬 이름 저장
        }
    }

    void AfterTalking()
    {
        isDialogueActive = false; // 대화가 끝났음을 표시
        dm.gameObject.SetActive(false); // 씬 로드 전에 DialogueManager 오브젝트를 비활성화

        if (isInteract && !isDialogueActive && Input.GetKeyDown(KeyCode.F))
        {
            SceneManager.LoadScene(sceneName); // 상호작용(미니게임으로 이동)
        }
    }
}

  • 절정
    문제를 해결하기 위해 다음과 같은 조치를 취했습니다
  1. class DialogueManager의 void Update() 내부에서 currentTextIndex++ 순서를 바꿔보며 테스트를 진행
  2. ShowCurrentText()밑에 배치했을 때
    결과적으로는 여전히 첫 문장이 뜨지만 씬을 나갔다 오면
    첫-두-첫 번째 문장 순으로 출력되는 것이
    첫-첫-두-첫번째 순으로 출력되어
    씬을 나갔다 올 경우
    이미 첫 번째 문장이 출력된 후기 때문에
    첫-두-첫 번째 순으로 출력이 되어버렸다.
            if (currentTextIndex < dialogueSentences.Length)
            {
                Debug.Log('c');
                Debug.Log(currentTextIndex);
                ShowCurrentText();
                currentTextIndex++; // 다음 인덱스로 넘어가 다음 대화를 호출
            }
  1. 두번째 문장이 출력 후부터는 코드로
    대화창 오브젝트를 SettingUI(false)로 만들어버려
    임시적으로 해결했다.
    public void SettingUI(bool OnOff)
    {
        go_dialogueBar.SetActive(OnOff);
        go_NameBar.SetActive(OnOff);
    }
  1. 남은 시간동안 해결할 수 있으면 깔끔하게 할 것
  • 결말
    게임 상에서는 처음으로 대화 할때만 첫 문장에서
    [F]키를 두번 눌러야되는 현상이 생겼지만
    그 이후 부터는 정상적으로 작동하는 것처럼
    보여지게 됩니다.

    남은 시간동안 해결하도록 시도할 것입니다.

profile
내배캠 Unity_9기 / 게임 서버 단기 심화_9기

0개의 댓글