Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

zyeon's 작심삼일 코딩 공부

대화·퀘스트 시스템 - (3) 대화문 출력 본문

unity

대화·퀘스트 시스템 - (3) 대화문 출력

젼뀨 2024. 9. 12. 21:37

대화 시스템을 관리하는 클래스를 싱글톤 매니저로 만들어주었다. 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()를 사용해 한글자씩 나오는 애니메이션 효과를 추가해 주었다.

대화문 출력 중에 버튼을 한 번 더 누르면 현재 텍스트 애니메이션을 중지하고 전체 대화문을 표시해준다.

 

대화가 끝나면 상태를 업데해트한다.