zyeon's 작심삼일 코딩 공부
대화·퀘스트 시스템 - (3) 대화문 출력 본문
대화 시스템을 관리하는 클래스를 싱글톤 매니저로 만들어주었다. UI Manager 클래스이다.
/* UIManager.cs */
public Text NPCName;
public Text dialogText;
public GameObject dialogPanel;
public GameObject scanObject; // 스캔된 npc 오브젝트
public DialogueData dialogue; // 대화 데이터
public int dialogIdx = 0; // 현재 대화 인덱스
public bool isDialogAction = true; // 대화 진행 중인지 확인
bool isTyping = false // 대화 출력 중인지 확인
/* 싱글톤 코드 생략... */
public void SetObject()
{
GameObject canvas = GameObject.Find("Canvas");
dialogText = canvas.transform.Find("DialogueBoxImage").Find("DialogueText").GetComponent<Text>();
NPCName = canvas.transform.Find("DialogueBoxImage").Find("NPCNameText").GetComponent<Text>();
dialogPanel = canvas.transform.Find("DialogueBoxImage").gameObject;
dialogue = canvas.GetComponent<DialogueData>();
}
변수들을 정의해주고 npc 이름과 대화문 출력하는 텍스트 컴포넌트와 대화창 패널 게임 오브젝트를 각각 설정해준다.
(해당 클래스가 싱글톤으로 만들어졌기 때문에 SetObject();는 오브젝트 셋팅해주는 클래스에서 따로 해주었다.)
public void DialogueAction(GameObject scanObj)
{
scanObject = scanObj;
NPCData npcData = scanObject.GetComponent<NPCData>();
NPCName.text = npcData.ObjName;
Dialogue(npcData.id);
dialogPanel.SetActive(isDialogAction);
}
npc와 상호작용을 시작하고 대화 창을 활성화하는 함수이다.
npc 이름과 id를 가져와서 화면에 표시해준다.
이후 Dialogue()를 통해 id에 맞는 대화를 시작한다.
void Dialogue(int id)
{
int questDialogIdx = QuestManager.Instance.GetQuestDialogIndex(id);
string dialogData = dialogue.GetDialogue(id + questDialogIdx, dialogIdx);
if (isTyping) //대화가 출력중일 때 버튼을 또 누르면
{
//대화가 시작할 때 dialogIdx++; 했으므로 dialogIdx - 1을 넣어줘야함
dialogData = dialogue.GetDialogue(id + questDialogIdx, dialogIdx - 1);
DOTween.Kill(dialogText); // 현재 텍스트 애니메이션을 중지
dialogText.text = dialogData; // 현재 대화 텍스트 즉시 표시
isTyping = false;
return;
}
if (dialogData == null) //대화 끝났을 때
{
isDialogAction = false;
dialogIdx = 0;
QuestManager.Instance.CheckQuest(id);
dialogText.text = "";
return;
}
dialogText.text = "";
isTyping = true;
// 텍스트 애니메이션, 완료 시 플래그를 false로 변경
dialogText.DOText(dialogData, dialogData.Length * 0.08f).OnComplete(() => isTyping = false);
isDialogAction = true;
dialogIdx++;
}
npc id와 quest id를 조합해 DialogueData 클래스의 GetDialogue()에서 해당 대화 내용을 가져온다.
나는 DoTween 라이브러리에 있는 DOText()를 사용해 한글자씩 나오는 애니메이션 효과를 추가해 주었다.
대화문 출력 중에 버튼을 한 번 더 누르면 현재 텍스트 애니메이션을 중지하고 전체 대화문을 표시해준다.
대화가 끝나면 상태를 업데해트한다.
'unity' 카테고리의 다른 글
대화·퀘스트 시스템 - (4) 퀘스트 (0) | 2024.09.12 |
---|---|
대화·퀘스트 시스템 - (2) 대화문 저장 (0) | 2024.09.12 |
대화·퀘스트 시스템 - (1) NPC 설정, 플레이어 레이캐스트 (4) | 2024.09.12 |
플레이어 상태, 상태 머신 (0) | 2024.09.12 |
2.5D 게임에서 캐릭터 이동 구현 (0) | 2024.08.28 |