언더테일 스타일의 게임을 만들고 있어. 대화창 만들고 있는데, 텍스트는 CSV 파일로 읽어들이는 방식으로 했어.
플레이어가 표지판에 다가가 z키를 누르면 대화창이 열리며 첫줄 텍스트가 출력 돼. 그런데 또 버튼을 누르면 두번째 줄이 나오는 게 아니라 대화창이 닫혀버려. ㅜ ㅜ
ChatGPT한테 물어보니 두 번째 줄이 출력이 되긴 하는데 대화창이 아니라 콘솔에 출력되네. 대화창은 여전히 처음에만 열리고 바로 닫힘.
CloseText()에 문제가 있는 걸까? ChatGPT도 문제를 못 찾아서 여기 고수형님들한테 도움 요청해 :
* 참고로 ShowText()는 플레이어 게임오브젝트의 스크립트에서 호출하도록 되어 있어.
using TMPro;
using UnityEngine;
using UnityEngine.UI;
public class Interactables : MonoBehaviour
{
[SerializeField] private GameObject textPanel;
[SerializeField] private Image profileImage;
[SerializeField] private TextMeshProUGUI dialogueTMP;
[SerializeField] private ObjectData objectInfo; // ScriptableObject 데이터
private CSVLoader csvLoader; // CSV 데이터를 불러올 CSVLoader
private bool isDialogueActive = false;
private int currentLine = 0; // 현재 출력 중인 텍스트 라인
private void Start()
{
textPanel.SetActive(false); // 게임 시작 시 대화창 비활성화
csvLoader = FindObjectOfType<CSVLoader>(); // CSVLoader 찾기
}
public void ShowText()
{
if (textPanel != null && objectInfo != null && csvLoader != null)
{
if (objectInfo.textIDs == null || objectInfo.textIDs.Length == 0)
{
Debug.LogError("⚠ textIDs가 비어 있습니다! ScriptableObject의 textIDs 값을 확인하세요.");
return;
}
textPanel.SetActive(true);
profileImage.sprite = objectInfo.profileImage;
// 첫 번째 줄 표시
currentLine = 0;
dialogueTMP.text = csvLoader.GetText(objectInfo.textIDs[currentLine]);
isDialogueActive = true;
}
}
private void Update()
{
if (isDialogueActive && textPanel.activeSelf && (Input.GetKeyDown(KeyCode.Z) || Input.GetButtonDown("Submit")))
{
currentLine++;
Debug.Log($"+ Z 키 입력 감지! 현재 줄: {currentLine}, 총 줄 수: {objectInfo.textIDs.Length}");
if (currentLine < objectInfo.textIDs.Length)
{
string nextText = csvLoader.GetText(objectInfo.textIDs[currentLine]);
Debug.Log($"+ 다음 출력할 텍스트: {nextText} (TextID: {objectInfo.textIDs[currentLine]})");
// + UI에 반영되는지 확인하는 로그 추가
dialogueTMP.text = nextText;
Debug.Log($"? UI에 적용된 텍스트: {dialogueTMP.text}");
}
else
{
Debug.Log("? 마지막 줄 도달, 대화창 닫기.");
CloseText();
}
}
}
public void CloseText()
{
textPanel.SetActive(false);
isDialogueActive = false;
currentLine = 0; // 대화가 끝나면 초기화
}
}
코드가 먼가 이상한데. 말걸때도 z키나 좌클릭으로함? 그러면 showtext실행되자마자 같은프레임에 update바로들어올거임. 다만 그러면 실행되자마자 첫번째줄이아니라 두번째줄부터 보여야하는데 이상하네.
밤새 해결했어;; 플레이어 오브젝트의 스크립트 PlayerInteraction.cs에서 RaycastHit2D 발사해서 맞으면 ShowText()가 호출되도록 했는데 대화창이 이미 열려 있는 경우엔 대화창을 닫아버리게 해 놨더라고;;; Interactables.cs에 ShowText()말고 다음 줄로 넘어가는 ShowNextLine()이란 함수를 만들고 PlayerInteraction.cs에서 대화창이 열려 있으면 그걸 호출하게 했어. 이래저래 논리는 이해가 가는데 뭔가 너무 복잡한 기분이라 좀 더 간결하게 해 볼 계획이야.
showtext실행되자마자 update 바로 들어오는 문제는 GPT도 인지를 했는지 새로 수정한 코드에는 Update() 없어지고 Start()랑 ShowText(), ShowNextLine(), CloseText()만 있어. 조언 줘서 정말 고마워!