본문 바로가기

프로그래밍/게임개발

대화 시스템 만들기

2018.12.29.



빈 오브젝트에 이름과 내용을 놔둘 텍스트를 만들고 누르면 넘어갈 수 있는 버튼까지 만들어준다.



버튼의 알파값을 0으로 하여 안의 내용을 잘 보이게 해준다



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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
 
public class DialogueSystem : MonoBehaviour
{
    [SerializeField]
    private string[] speaker;//text name에 들어갈내용
    [SerializeField][TextArea(3,10)]
    private string[] content;//text content (대화내용)
    [SerializeField]
    private Text speakerText;
    [SerializeField]
    private Text contentText;
    [SerializeField]
    private UIController uiController;
 
    public Queue<string> sentences;
 
    public void Awake()
    {
        sentences = new Queue<string>();
    }
 
    public void StartDialgoue()
    {
        uiController.DialogueVisible(true);
 
        sentences.Clear();
 
        foreach (string sentence in content)
        {
            sentences.Enqueue(sentence);
        }
        NextDialgoue();
    }
 
    public void NextDialgoue()
    {
        if (sentences.Count == 0)
        {
            uiController.DialogueVisible(false);
            return;
        }
 
        string sentence = sentences.Dequeue();      
        int speakNum = char.ToUpper(sentence[0]) - 48;
 
        sentence = sentence.Remove(01);
        speakerText.text = speaker[speakNum];
 
        StopAllCoroutines();
        StartCoroutine(TypeSentence(sentence));
    }
 
    IEnumerator TypeSentence(string sentence)//한글자씩 나오는 애니메이션
    {
        contentText.text = "";
        foreach (char letter in sentence.ToCharArray())
        {
            contentText.text += letter;
            yield return null;
        }
    }
 
 
}
cs


다음의 코드의 스크립트를 대화창 안에 넣어줬다.



다음과 같은 예시로 speaker 안에는 대화 하는 사람 수 만큼 배열로

내용에는 대화 내용 만큼 배열로 받아오도록 했다.

그리고 대화하는 사람과 대화내용을 일치 시키기 위해

대화내용 맨처음을 말하는 사람 배열의 index로 받아와서 일치시켜줬다.

그리고 출력할때는 앞의 숫자를 지우고 출력한다.



StartDialogue()에서는 ui를 보이게 한 후 큐를 초기화 시켜주고

대화내용을 모두 큐에 넣어준다.


그리고 NextDialogue()에서 sentence의 맨앞 숫자를 speaker index로 넘겨주고 

맨 앞숫자를 지운 뒤 큐가 비기 전까지 출력해준다.


오브젝트에 만들어줬던 버튼에 NextDialogue()를 넣어주고

화면에 새로 버튼을 임시로 만들어 StartDialogue()를 만들어 줬다.



고찰:

위의 코드는 https://www.youtube.com/watch?v=_nRzoTzeyxU&t=41s 를 참고하여 만들게 되었다. 설명을 잘해주셔서 도움이 됬다.

한글자씩 출력되는 이펙트 등이 멋있어서 가져오게 되었다.

코드중에 문자열의 맨앞부분을 지울때 char형을 int로 받아와서 아스키코드값이 나오는 것을

깜빡하고 있어 오류가 계속 났었다.