Unity

Dialogue System 2 - DialogueManager의 메서드 설명

psb08 2024. 11. 22. 08:45
728x90
반응형

여기서 DialogueManager의 메서드들을 설명하겠습니다.

 

1. Start()

private void Start()
{
    isAutoDialogue = false;
    isFinished = false;
    isTalking = true;
    textLocated.text = "스페이스 바로 대화 시작.";
    cap.SetActive(false);
}

기능: 게임 시작 시 초기화 작업을 수행합니다.


설명:
isAutoDialogue, isFinished, isTalking 변수를 초기화하여 대화 상태를 설정합니다.
textLocated.text에 대화 시작 안내 메시지를 설정합니다.
cap 오브젝트를 비활성화하여 대화가 진행 중임을 나타냅니다.


2. Awake()

private void Awake()
{
    characterManager = GetComponent<CharacterManager>();
    buttonImage = autoBtn.GetComponent<Image>();
}

기능: 객체가 활성화될 때 호출되며, 초기 설정을 수행합니다.


설명:
characterManager를 가져와 캐릭터 이미지 업데이트를 담당할 수 있도록 합니다.
autoBtn의 Image 컴포넌트를 가져와 버튼의 색상을 변경할 때 사용합니다.


3. Update()

private void Update()
{
    if (isTalking == false) return;
    if (isAutoDialogue == true) return;
    if (Input.GetKeyDown(KeyCode.Space))
    {
        if (isTyping)
        {
            StopCoroutine(typingCoroutine);
            DisplayCurrentDialogue();
        }
        else
        {
            ShowNextDialogue();
        }
    }
}

기능: 매 프레임마다 호출되며, 대화 진행을 관리합니다.


설명:
isTalking이 false이면 메서드를 종료하여 대화가 진행되지 않도록 합니다.
isAutoDialogue가 true인 경우 자동 대화 모드일 때는 입력을 받지 않도록 합니다.
스페이스 키가 눌리면, 현재 타이핑 중이라면 타이핑 코루틴을 중단하고 현재 대사를 표시합니다. 그렇지 않으면 다음 대사를 보여줍니다.


4. DisplayCurrentDialogue()

private void DisplayCurrentDialogue()
{
    if (isTalking == false) return;
    if (currentDialogueIndex < dialogues.Count)
    {
        string characterName = characterNames[currentDialogueIndex - 1];
        textLocated.text = $"{characterName} : {dialogues[currentDialogueIndex - 1]}";
        isTyping = false;
    }
    if (currentDialogueIndex == dialogues.Count)
    {
        string characterName = characterNames[currentDialogueIndex - 1];
        textLocated.text = $"{characterName} : {dialogues[currentDialogueIndex - 1]}";
        isTyping = false;
        cap.SetActive(true);
        main.backgroundColor = Color.gray;
    }
}

기능: 현재 대사를 화면에 표시합니다.


설명:
isTalking이 false이면 메서드를 종료합니다.
현재 대화 인덱스가 dialogues 리스트의 범위 내에 있을 경우, 해당 캐릭터의 이름과 대사를 표시합니다.
모든 대사가 끝났을 경우(currentDialogueIndex가 dialogues.Count와 같을 때), 마지막 대사를 표시하고 캡슐을 활성화하고 배경색을 회색으로 변경합니다.


5. ShowNextDialogue()

private void ShowNextDialogue()
{
    if (isTalking == false) return;
    if (currentDialogueIndex < dialogues.Count)
    {
        string characterName = characterNames[currentDialogueIndex];
        characterManager.UpdateCharacterImages(characterName);
        typingCoroutine = StartCoroutine(Typing(characterName, dialogues[currentDialogueIndex]));
        currentDialogueIndex++;
    }
    else
    {
        FinishedTalking();
    }
}

기능: 다음 대사를 준비하고 진행합니다.


설명:
isTalking이 false이면 메서드를 종료합니다.
현재 대화 인덱스가 dialogues 리스트의 범위 내에 있을 경우, 다음 캐릭터의 이름을 가져와 캐릭터 이미지를 업데이트하고, 대사를 타이핑하는 코루틴을 시작합니다. 인덱스를 증가시킵니다.
모든 대사가 끝났을 경우 FinishedTalking()을 호출하여 대화 종료 처리를 합니다.


6. Typing(string characterName, string dialogue)

private IEnumerator Typing(string characterName, string dialogue)
{
    string fullText = $"{characterName} : {dialogue}";
    textLocated.text = "";
    isTyping = true;

    int typingLength = fullText.GetTypingLength(); 

    for (int i = 0; i <= typingLength; i++)
    {
        textLocated.text = fullText.Typing(i);
        yield return new WaitForSeconds(0.05f);
    }

    isTyping = false;
}

기능: 대사를 타이핑하는 효과를 주기 위한 코루틴입니다.


설명:
전체 대사 문자열을 생성하고, 텍스트를 초기화합니다.
isTyping을 true로 설정하여 현재 타이핑 중임을 표시합니다.
대사의 길이만큼 반복하면서 각 글자를 하나씩 표시하고, 각 글자 표시 후 0.05초 대기합니다.
모든 글자가 표시된 후 isTyping을 false로 설정합니다.


7.SkipDialogue()

public void SkipDialogue()
{
    if (currentDialogueIndex < dialogues.Count)
    {
        FinishedTalking();
    }
}

기능: 대화를 스킵하는 메서드입니다.


설명:
현재 대화 인덱스가 dialogues 리스트의 범위 내에 있을 경우, FinishedTalking()을 호출하여 대화 종료 처리를 합니다.


8.CheckFinishDialogue(bool finished)

public bool CheckFinishDialogue(bool finished)
{
    return isFinished;
}

기능: 대화가 끝났는지 확인하는 메서드입니다.


설명:
isFinished 변수를 반환하여 대화가 끝났는지 여부를 알려줍니다.


9. CheckTalking(bool talking)

public bool CheckTalking(bool talking)
{
    return isTalking;
}

기능: 현재 대화 중인지 확인하는 메서드입니다.


설명:
isTalking 변수를 반환하여 대화가 진행 중인지 여부를 알려줍니다.


10.ToggleAutoDialogue()

public void ToggleAutoDialogue()
{
    Color origin = Color.white;
    Color changed = Color.yellow;
    isAutoDialogue = !isAutoDialogue;

    if (isAutoDialogue)
    {
        buttonImage.color = changed;
        if (autoDialogueCoroutine == null)
        {
            autoDialogueCoroutine = StartCoroutine(AutoDialogueCoroutine());
        }
    }
    else
    {
        isAutoDialogue = false;
        buttonImage.color = origin;
        if (autoDialogueCoroutine != null)
        {
            StopCoroutine(autoDialogueCoroutine);
            autoDialogueCoroutine = null;
        }
    }
}

기능: 자동 대화 모드를 켜거나 끄는 메서드입니다.


설명:
isAutoDialogue 변수를 토글하여 자동 대화 모드를 변경합니다.
자동 대화 모드가 활성화되면 버튼의 색상을 노란색으로 변경하고, AutoDialogueCoroutine이 실행 중이 아닐 경우 코루틴을 시작합니다.
비활성화될 경우, 버튼의 색상을 원래 색(흰색)으로 되돌리고, 실행 중인 코루틴을 중단합니다.


11. AutoDialogueCoroutine()

private IEnumerator AutoDialogueCoroutine()
{
    for (int i = currentDialogueIndex; i < dialogues.Count; i++)
    {
        while (isTyping)
        {
            yield return null; 
        }
        yield return new WaitForSeconds(1f);
        ShowNextDialogue();
        yield return new WaitForSeconds(1f);
    }
    yield return new WaitForSeconds(2f);
    FinishedTalking();
}

기능: 자동 대화를 진행하는 코루틴입니다.


설명:
현재 대화 인덱스부터 시작하여 모든 대사를 순차적으로 진행합니다.
isTyping이 true인 동안에는 대화가 끝날 때까지 기다립니다.
대사 사이에 1초의 대기 시간을 두고 ShowNextDialogue()를 호출하여 다음 대사를 보여줍니다.
모든 대사가 끝난 후 2초 대기하고 FinishedTalking()을 호출하여 대화를 종료합니다.


12. FinishedTalking()

private void FinishedTalking()
{
    isFinished = true;
    isTalking = false;
    textLocated.text = "";
    cap.SetActive(true);
}

기능: 대화가 종료되었을 때의 처리를 수행합니다.


설명:
isFinished를 true로 설정하여 대화가 끝났음을 나타냅니다.
isTalking을 false로 설정하여 대화 중이 아님을 표시합니다.
textLocated.text를 비워 대화 텍스트를 지웁니다.
cap 오브젝트를 활성화하여 대화 종료 후의 UI를 업데이트합니다.


DialogueGameManager도 다음에 설명할 생각입니다. 조금만 기다려 주세요!

'Unity' 카테고리의 다른 글

Unity HingeJoint2D  (0) 2024.12.08
Dialogue System 3 - DialogueGameManager 메서드 설명  (2) 2024.11.23
Dialogue System  (0) 2024.11.21
Unity Attribute (5번째 / 5번째)  (0) 2024.10.19
Unity CustomEditor로 간단하게 큐브 생성하기  (0) 2024.10.17