유니티 게임 개발/3D Portfolio

[유니티] 3D Portfolio #7 CSV를 활용한 대화창, 튜토리얼 제작(기초작업)

노랑꼬리 2023. 9. 2. 21:33

목표

엑셀로 제작한 CSV 파일을 사용한 대화 데이터 관리

대화창 제작

튜토리얼 제작

(작업기간 2023.08.30 ~ 09.02 (4일 소요))

 

1. 엑셀로 제작한 CSV 파일 파싱

CSV 리더를 사용하여 제작

CSVReader.cs
0.00MB

※ Assets / Resources 폴더안에 넣고 사용해야한다.

ㄴ QuestNum 헤더를 기준으로 퀘스트 구분

ㄴ CSV 활용이 미숙해 기록을 나중에 봐도 헷갈릴 수 있으니 코드 첨부

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
69
70
71
72
73
74
75
76
77
78
79
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
 
public class TutorialText : MonoBehaviour
{
    public GameObject dialogObject;
    public TextMeshProUGUI logName;
    public TextMeshProUGUI logConversation;
 
 
    public bool logSetActive = true; // 대화창 활성화
    public int i = 0; // 현재 연결 중인 CSV 파일의 데이터 행 번호 (0: 헤더)
    public int questNum = 1; // 퀘스트 번호
    List<Dictionary<stringobject>> data;
 
    private void Start()
    {
        data = CSVReader.Read("튜토리얼 대화");
        dialogObject.SetActive(false);
        FindDialog();
    }
 
    private void Update()
    {
        if(logSetActive)                                // 대화 활성화
        {
            dialogObject.SetActive(true);
            if (Input.GetKeyDown(KeyCode.Return))       // 엔터를 눌러 진행
            {
                Debug.Log("엔터 입력");
                Debug.Log("QuestNum : " + questNum);
                Dialog(questNum.ToString());
            }
        }
    }
 
    public void FindDialog() // 현재 퀘스트에 맞는 데이터 찾기
    {
        for (i = 0; i < data.Count; i++)
        {
            if (data[i]["QuestNum"].ToString() == questNum.ToString())
            {
                Dialog(questNum.ToString());
                break;
            }
        }
    }
 
    void Dialog(string _QuestNum)
    {
        Debug.Log(_QuestNum);
        Debug.Log("i : " + i);
        Debug.Log("data.count" + data.Count);
        if (data.Count <= i)        // 데이터 최대 범위 이내 일 경우 (현재 i 가 data.Count를 넘으면 범위 벗어남)
        {
            dialogObject.SetActive(false);
            logSetActive = false;
        }
        else if (data[i]["QuestNum"].ToString() == _QuestNum)          // 현재 진행 퀘스트
        {
            logName.text = data[i]["Name"].ToString();
            logConversation.text = data[i]["Content"].ToString();
            i++;
        }
        else                                       // 현재 진행 퀘스트가 아닐 경우 닫고 탐색
        {
            dialogObject.SetActive(false);
            logSetActive = false;
            FindDialog();
        }
    }
 
    
    
}
 
cs
 
 
 

 

2. 대화창 제작

https://assetstore.unity.com/packages/2d/gui/fantasy-wooden-gui-free-103811

 

Fantasy Wooden GUI : Free | 2D GUI | Unity Asset Store

Elevate your workflow with the Fantasy Wooden GUI : Free asset from Black Hammer. Find this & more GUI on the Unity Asset Store.

assetstore.unity.com

- 해당 에셋의 이미지를 사용하여 제작

- UI 세부에 대화 상대 이름과 대화 내용을 분할하여 제작

TutorialText.cs 에서 불러온 데이터를 넣어 출력한다.

 

- 엔터 입력 시 다음 대화 내용 출력되게 한다.

- 현재 대화 내용이 끝나면 logSetActive를 false로 변경하면서 같은 대화가 반복되지 않고 끝나도록 한다.

ㄴ questNum 이 변경되면 true로 변경해 대화 내용을 출력 할 수 있도록 한다.

 

 

3. 튜토리얼 제작

- 캐릭터의 기본 움직임에 관한 튜토리얼 제작

- 캐릭터가 지정된 Spot에 도달할 경우 다음 위치 지정

ㄴ spot 위치가 저장된 오브젝트를 참조하여 이동

ㄴ 이동 시 바로 다음 퀘스트 대화 출력 (대화 중인 내용이 남아있더라도 전환시킴)

ㄴ Spot 에는 미니맵에만 보이는 마커를 만들어 줄어들고 커지는 로직을 반복시켜 블링크 효과를 주어 플레이어가 쉽게 알 수 있도록 함

 

4. 결과물

※ 튜토리얼을 모두 만들고 업로드 하려했으나 CSV를 처음 사용해봐서 배우는데 시간이 걸려 전반부 업로드

※ 스팟 방향으로 캐릭터 화면에서 이펙트 처리 추가할 예정