Unity 개발 일지/게임 기획

[개인 프로젝트] Duntaverse 트러블 슈팅 - 대사 출력 문제

ohty20012 2025. 5. 7. 15:56

1. 배경

  • 플레이어가 NPC와 상호작용하는 키를 Spacebar로 설정해 놓았다. 하지만 NPC와 대화 중 스크립트를 넘기는 키를 클릭으로만 지정해 두어, 스크립트를 넘기는 또 다른 방법으로 Spacebar를 추가하려고 했다.

 

2. 발단

  • NPC와의 상호작용키도 Spacebar이고, 스크립트를 넘어가는 키에 Spacebar를 추가함으로써, 상호작용을 시작할때, 첫번째 스크립트가 자동으로 한 번 넘어가는 문제가 발생하였다.

 

3. 전개

  • 문제를 해결하기 위해 다음 방법을 시도하였다.
  • 스크립트는 String[]으로 받고 있기 때문에, 모든 NPC의 스크립트에 아무것도 쓰여있지 않은 String[0]을 추가해서 NPC와 상호작용을 시작하면 자동으로 한 번 넘어가게 변경

 

 

4. 위기

  • 위 방법으로 문제를 해결하긴 했지만, 방식이 아름답지 않음.
  • 이유 1 : 앞으로 추가하는 모든 NPC의 Dialogue에 공백의 스크립트를 하나 추가해야함.
  • 이유 2 : 스크립트를 넘어갈 때, Spacebar 이외의 방식을 추가하는 경우, 공백 스크립트가 한 번 출력.
  • 이유 3: 대화창이 처음 열릴 때, 매우 빠르게 빈 스크립트가 넘어가는 것이 보일 수 있음. 플레이어 입장에서 뭔가 놓쳤다는 인식을 줄 가능성 존재.

 

5. 절정

  • 문제를 해결하기 위해 다음과 같은 조치를 취함.
  • bool 변수 isDialogueStart를 상태 플래그로 추가.
  • NPC와 대화하기 전에 false로 있다가, 대화가 시작되면 스크립트를 불러오며 true로 바뀜.
  • isDialogueStart가 true일 경우 정해진 입력이 들어올 시, 스크립트가 넘어감.
  • 스크립트가 종료될 때, 플래그를 다시 false로 되돌림.
더보기
using System;
using UnityEngine;
using UnityEngine.UI;

public class DialogueManager : MonoBehaviour
{
    public static DialogueManager Instance;

    [SerializeField] private Text dialogueText;

    private string[] dialogues;
    private int currentIndex = 0;
    private Action onFinish;
    private bool isDialogueStart = false;  // 플래그 추가

    private void Awake()
    {
        Instance = this;
    }

    private void Update()
    {
        if (!UIManager.Instance.dialoguePanel.activeSelf) return;

        if (isDialogueStart)  // 첫 입력 무시 설정
        {
            isDialogueStart = false;
            return;
        }

		// 스크립트를 넘어가는 키로 KeyCode.Space를 추가
        if (Input.GetKeyDown(KeyCode.Space)|| Input.GetMouseButtonDown(0))
        {
            currentIndex++;
            if (currentIndex < dialogues.Length)
            {
                dialogueText.text = dialogues[currentIndex];
            }
            else
            {
                UIManager.Instance.ChangePanel(PanelName.Main);
                onFinish?.Invoke();
            }
        }
    }

    public void Show(string[] dialogues, Action onFinish)
    {
        this.dialogues = dialogues;
        currentIndex = 0;
        this.onFinish = onFinish;

        UIManager.Instance.ChangePanel(PanelName.Dialogue);
        dialogueText.text = dialogues[currentIndex];

        isDialogueStart = true; // 첫 입력 무시 설정
    }
}

 

6. 결말

  • 수정 작업이 정상적으로 완료 됨.
  • 더 이상 대사를 추가할 때, string[0]에 공백을 넣지 않아도 않게 변경.

보기 좋다