
발단
문자열 배열에 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); // 상호작용(미니게임으로 이동)
}
}
}
void Update() 내부에서 currentTextIndex++ 순서를 바꿔보며 테스트를 진행ShowCurrentText()밑에 배치했을 때 if (currentTextIndex < dialogueSentences.Length)
{
Debug.Log('c');
Debug.Log(currentTextIndex);
ShowCurrentText();
currentTextIndex++; // 다음 인덱스로 넘어가 다음 대화를 호출
}
SettingUI(false)로 만들어버려 public void SettingUI(bool OnOff)
{
go_dialogueBar.SetActive(OnOff);
go_NameBar.SetActive(OnOff);
}
결말
게임 상에서는 처음으로 대화 할때만 첫 문장에서
[F]키를 두번 눌러야되는 현상이 생겼지만
그 이후 부터는 정상적으로 작동하는 것처럼
보여지게 됩니다.
남은 시간동안 해결하도록 시도할 것입니다.