ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [TIL] 10주차 3일 ( Coroutine )
    개발일지/스파르타 코딩클럽 부트캠프 2024. 6. 19. 20:58

     

    오늘은 코루틴에 대해서 알아보고 사용해보려고 한다.

     

    먼저 코루틴의 개념에 대해서 알아보자

    코루틴 ( Coroutine )

    코루틴은 하나의 작업을 여러개의 프레임에 분산할 때 사용한다.

     

    코루틴의 활용

    • IEnumerator 리턴 타입의 함수에서 yield return을 사용하여 코루틴을 구현할 수 있다.
    • StartCoroutine 함수를 통해서 코루틴을 시작할 수 있고, StopCoroutine 함수를 통해 코루틴을 중지할 수 있다.
    • 코루틴은 프레임 간의 지연, 비동기 작업, 시간에 다른 애니메이션 등의 작업에 주로 사용된다.
    • yield return null은 다음 프레임까지 대기를 의미하고, yield return new WaitForSeconds(n)은 n초 동안 대기를 의미한다. 중간에서 중단하려면 yield break를 사용할 수 있다.
    • 코루틴은 별도의 스레드에서 실행되지 않는다. ( 단일 스레드 ) 따라서 Unity의 메인 스레드에서 안전하게 Unity API를 호출할 수 있다.
    • 코루틴은 일반 함수와는 다르게, 실행을 일시 중단하고 나중에 다시 시작할 수 있어서, 시간 지연, 반복, 조건부 대기 등의 작업을 수행할 때 매우 유용하다.

    왜 기다리는 작업이 필요할까??

     

    1. 수 초간 진행되어야 하는 어떤 일 - for문 등에서 중간에 멈췄다 돌아오고 그런 행동이 가능

    2. 어떠한 조건 - 턴제 등에서 30초가 지날 때 까지 상대턴인 상황 등

    3. 웹 호출 - 이미지를 요청하고 바로 실행되면 null이 뜰 수 있어서 기다렸다가 호출하는 등

     

    예를 들어서 투명하게 만들고싶은 게임오브젝트가 있는데

    void Fade()
    {
        Color c = spriteRenderer.color;
        for (float alpha = 1f; alpha >= 0; alpha -= 0.1f)
        {
            c.a = alpha;
            spriteRenderer.color = c;
        }
    }
    
    void Start()
    {
    	Fade();
    }

    위와 같이 작성하면 사용자가 원하는 Fade 효과가 나타날까?

     

    그렇지않다. 순식간에 줄어들어 결국 알파가 0인 경우만 나타나게 될 것이다.

    이 경우 코루틴을 사용하여 유니티에서 비동기적인 작업을 수행할 수 있게 해준다.

    코루틴은 함수의 실행을 일시 중지하고, 이후에 다시 재개할 수 있는 기능을 제공한다.

    코루틴의 대강 흐름

    yield return을 만나면 서버로 잠시 가있는 느낌

     

    using UnityEngine;
    using System.Collections;
    
    public class CoroutineExample : MonoBehaviour
    {
        IEnumerator Start()
        {
            while (true)
            {
                Debug.Log("Hello, World!");
                yield return new WaitForSeconds(1f);
            }
        }
    }

    예를 들어 위의 코드는 1초마다 Hello, World! 를 출력하는 

Designed by Tistory.