2. TextArchitect, DialogueSystem

Kyu hyunSung·2025년 1월 25일
post-thumbnail

구현 기능

  • 대사파일(TXT)를 넣을 시, 파일을 읽어서 대사창에 출력
  • 텍스트를 화면에 표시하는 세 가지 방식을 구현:
Instant: 텍스트가 즉시 전체 표시
Typewriter: 한 글자씩 순차적으로 표시
Fade: 텍스트가 서서히 나타나는 효과 (다음 에피소드에서 구현 예정
  • 버튼을 누를시 다음 대사로 넘어가게끔 구현

과정.

대화 시스템 주요 구성요소

1. TextArchitect (텍스트 출력 시스템)

TextArchitect는 TextMeshPro를 활용하여 텍스트를 다양한 효과로 화면에 표시하는 핵심 클래스입니다.

출력 방식

public enum BuildMethod 
{ 
   instant,     // 즉시 출력
   typewriter,  // 타자기 효과
   fade         // 페이드 효과
}

주요기능

// 새 텍스트 출력
public Coroutine Build(string text) 
{
    preText = ""; 
    targetText = text;
    Stop();
    buildProcess = tmpro.StartCoroutine(Building());
    return buildProcess;
}

// 기존 텍스트에 추가
public Coroutine Append(string text) 
{
    preText = tmpro.text;
    targetText = text; 
    Stop();
    buildProcess = tmpro.StartCoroutine(Building());
    return buildProcess;
}

2. DialogueParser (대화 파싱 시스템)

텍스트 파일에서 대화 내용을 읽고 파싱하는 시스템입니다.

대화라인 포맷

[화자이름] "대화내용" [명령어]

주요 기능

public class DIALOGUE_LINE 
{
    public string speaker;    // 화자
    public string dialogue;   //대화 내용
    public string commands;   // 명령어
    
    public bool hasSpeaker => speaker != string.Empty;
    public bool hasDialogue => dialogue != string.Empty;
    public bool hasCommands => commands != string.Empty;
}

3. DialogueSystem & ConversationManager

대화의 전체적인 흐름을 제어하는 시스템입니다.

DialogueSystem
public class DialogueSystem : MonoBehaviour 
{
    public DialogueContainer dialogueContainer = new DialogueContainer();
    private ConversationManager conversationManager;
    private TextArchitect architect;
    public static DialogueSystem instance;

    public delegate void DialogueSystemEvent();
    public event DialogueSystemEvent onUserPrompt_Next;
}
ConversationManager
public class ConversationManager 
{
    private DialogueSystem dialogueSystem => DialogueSystem.instance;
    private Coroutine process = null;
    private TextArchitect architect = null;
    private bool userPrompt = false;

    public bool isRunning => process != null;
}

4. PlayerInputManager (입력 처리 시스템)

public class PlayerInputManager : MonoBehaviour 
{
    void Update() 
    {
        if(Input.GetKeyDown(KeyCode.Space) || Input.GetKeyDown(KeyCode.Return)) 
        {
            PromptAdvance();
        }
    }

    public void PromptAdvance() 
    {
        DialogueSystem.instance.OnUserPrompt_Next();
    }
}

5. FileManager (파일 관리 시스템)

public static class FileManagers 
{
    public static List<string> ReadTextFile(string filePath, bool includeBlankLines = true)
    {
        if (filePath.StartsWith('/'))
            filePath = FilePaths.root + filePath;
            
        List<string> lines = new List<string>();
        // 파일 읽기 로직...
        return lines;
    }
}

시스템 작동 흐름

  1. FileManager가 대화 파일을 로드
  2. DialogueParser가 각 라인을 파싱
  3. ConversationManager가 파싱된 내용을 순차적으로 진행
  4. TextArchitect를 통해 텍스트 출력
  5. PlayerInputManager가 사용자 입력을 처리 후,다음 대화로 진행

참고 영상

Make a Visual Novel in Unity 2023 - Episode 02 The Text Architect
Make a Visual Novel in Unity 2023 - Episode 02 (pt2) Text Architect Fading
Make a Visual Novel in Unity 2023 - Episode 03 (pt1) Reading Text Files
Make a Visual Novel in Unity 2023 - Episode 03 (pt2) Dialogue Parsing
Make a Visual Novel in Unity 2023 - Episode 03 (pt3) Starting Conversations

profile
디지털 치매 예방

0개의 댓글