20231228_Coroutine

2023. 12. 28. 21:30IT/TIL

오늘의 TIL은 유니티에서 게임을 만들 때, 다양하게 활용할 수 있는 Coroutine의 대한 내용이다.

 

우선 Unity Documentation에서 코루틴을 살펴보면,

 

https://docs.unity3d.com/kr/2021.3/Manual/Coroutines.html

 

코루틴 - Unity 매뉴얼

코루틴을 사용하면 작업을 다수의 프레임에 분산할 수 있습니다. Unity에서 코루틴은 실행을 일시 정지하고 제어를 Unity에 반환하지만 중단한 부분에서 다음 프레임을 계속할 수 있는 메서드입니

docs.unity3d.com

 

 

대부분의 경우, 메서드를 호출하면 실행을 완료한 뒤, 호출한 메서드에 제어와 선택적 반환 값을 반환합니다.
즉, 메서드 내에서 발생한 모든 행동은 단일 프레임 업데이트 내에서 발생해야 합니다.

반면 코루틴을 사용하면 작업을 다수의 프레임에 분산할 수 있습니다. 유니티에서 코루틴은 실행을
일시 정지하고 제어를 유니티에 반환하지만 중단한 부분에서 다음 프레임을 계속할 수 있는 메서드입니다.

 

라고 정리할 수 있다.

 

다시 정리하면 코루틴이란 Update문이 아니지만,

 

Update하는 효과를 가질 수 있는 (한 번 실행했을 때, 여러 번 동작시킬 수 있는) 함수를 말하는 것으로,

 

Update문은 매 프레임마다 반복적으로 실행되지만, 코루틴은 필요한 순간에만 반복시킬 수 있다는 기능을 가진 함수이다.

 

특히, X초 이후에 어떠한 동작을 시키고 싶을 때 활용할 수 있기에 쓰임새가 무궁무진한 함수라고 할 수 있다.

 

즉, 이 코루틴을 사용하면 하나의 함수를 이용하여 여러 프레임에 분산하여 동작을 시킬 수 있다.

 

 

코루틴의 구성요소

코루틴은 2가지 중요한 요소가 있는데,

1. 코루틴은 IEnumerator라는 반환형으로 시작해야한다는 것과

2. yield return이 해당 함수 내분에 존재해야 한다는 것이다.

 

코루틴을 간단히 표현하면 아래와 같이 표현할 수 있는데,

IEnumerator CorouineFunction()
{
	yield return;
}

 

이 yield return에 사용할 수 있는 종류가 여럿이 있지만,

기본적으로 사용되는 세 가지는

1. yield return null; : 다음 프레임에 실행

2. yield return new WaitForSeconds(float); : float에 들어가는 초 만큼 기다렸다가 실행

3. yield return new WaitForSecondsRealtime(float); : float에 들어가는 초(실제 시간)만큼 기다렸다가 실행.

가 사용되며 2와 3의 차이는

2번은 유니티 상의 시간이고, 3번은 실제 시간(realtime) 상의 시간이다.

 

추가로 'yield break : 해당하는 코루틴을 멈추게 만듬'을 사용할 수 있다.

 

 

실제로 사용한 코루틴

오늘 공부했던 코루틴은 비교적 단순한 코루틴으로 전체 코드는 아래와 같은데,

더보기
using System;
using System.Collections;
using System.Collections.Generic;
using TMPro;
using UnityEngine;

public class TextTypingEffect : MonoBehaviour
{
    public TextMeshProUGUI textMeshPro;
    public float typingSpeed = 0.05f;
    public float blinkSpeed = 1f;
    public GameObject nextButton;

    private string originalText;
    private string currentText;

    private void Start()
    {
        nextButton.SetActive(false);

        originalText = textMeshPro.text;

        textMeshPro.text = "";
        currentText = "";
        StartCoroutine(TypeText());
    }

    IEnumerator TypeText()
    {
        for (int i = 0; i <= originalText.Length; i++)
        {
            currentText = originalText.Substring(0, i);
            textMeshPro.text = currentText;

            yield return new WaitForSeconds(typingSpeed);
        }

        nextButton.SetActive(true);

        while (true)
        {
            currentText = originalText.Substring(0, originalText.Length);
            textMeshPro.text = currentText;
            yield return new WaitForSeconds(blinkSpeed);

            currentText = originalText.Substring(0, originalText.Length - 1);
            textMeshPro.text = currentText;
            yield return new WaitForSeconds(blinkSpeed);
        }
    }
}

 

게임을 플레이하는 도중에 대화창에서 캐릭터의 대사가 일정 간격(typingSpeed(0.05f))으로 나타나게 하려고

 

방법을 찾다가 코루틴을 사용할 수 있다고 알게되어 공부하여 만든 코드로,

 

이 코드를 사용하면 내가 원하는 텍스트를 0.05f의 간격으로 출력할 수 있으며,

마지막 글자를 보이지 않게 만들었다 보이게 만드는 식으로, 점멸하는 느낌이 들게 만들 수 있다.

또, 마지막 글자까지 나타난 후에 버튼을 활성화하여 대화를 진행하거나 선택지가 나타나게 만들 수 있다.

 

코드를 살펴보면,

private void Start()
{
    nextButton.SetActive(false);

    originalText = textMeshPro.text;

    textMeshPro.text = "";
    currentText = "";
    StartCoroutine(TypeText());
}

 

Start에서 대화가 끝난 후에 나타나게할 버튼(선택지)를 안보이게 만들고,

originalText를 원래 text로 저장하고, textMeshPro.text와 currentText를 "";로 만든 후에

StartCoroutine(TypeText()); 로 코루틴을 사용하여 텍스트를 출력하게 만들었다.

 

다음으로 TypeText() 함수를 살펴보면

IEnumerator TypeText()
{
    for (int i = 0; i <= originalText.Length; i++)
    {
        currentText = originalText.Substring(0, i);
        textMeshPro.text = currentText;

        yield return new WaitForSeconds(typingSpeed);
    }

    nextButton.SetActive(true);

    while (true)
    {
        currentText = originalText.Substring(0, originalText.Length);
        textMeshPro.text = currentText;
        yield return new WaitForSeconds(blinkSpeed);

        currentText = originalText.Substring(0, originalText.Length - 1);
        textMeshPro.text = currentText;
        yield return new WaitForSeconds(blinkSpeed);
    }
}

 

IEnumerator를 이용하여 코루틴 함수를 만들었다.

 

for 문을 통해서 typingSpeed마다 새롭게 currentText를 한 글자씩 추가하여 출력하게 만들었다.

 

이후에 for 문이 끝나면 nextButton을 활성화하게 만들고,

 

while 문을 통해서 마지막 글자를 표시했다가 지웠다가(마지막 - 1까지 출력하게) 만듦으로써

 

게임에서 일반적으로 사용할 수 있는 스크립트의 기능들을 만들었다.

 

 

짧다면 짧은 스크립트이지만, 내가 원했던 두 가지의 기능을 충분히 사용할 수 있는 스크립트로,

캠프 처음에 10월 말 즈음에 다른 팀원이 사용했었던 코루틴을,

그 당시에 전혀 이해하지 못했고, 이후에도 사용할 일이 없어서 개인적으로 공부하지 못했었는데,

이번에 개인과제를 할 수 있는 시간을 통해서 코루틴에 대해 이해할 수 있었고

 

간단한 코드 작성을 통해서 기본적인 코루틴의 사용법도 이해할 수 있었다.

'IT > TIL' 카테고리의 다른 글

20240102_유니티 미니맵  (0) 2024.01.02
20231229_Queue, Stack  (0) 2023.12.29
20231227_IPointer Interface  (0) 2023.12.27
20231226_달리기 경주(프로그래머스)  (0) 2023.12.26
20231224_개인정보 수집 유효기간(프로그래머스)  (0) 2023.12.24