Posted in: Unity, 메서드 & 팁 정리

(유니티) 코루틴 Coroutine

코루틴 Coroutine

코루틴은 유니티가 지원하는 기능입니다. 함수의 작업 과정 사이에 대기시간을 삽입할 수 있습니다.

코루틴 사용 법

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Coroutine : MonoBehaviour
{
    void Start()
    {
        HelloUnity();
    }
    
    void HelloUnity()
    {
        Debug.Log("Hello ");
        Debug.Log("Unity");
    }
}

위 스크립트를 게임 오브젝트에 컴포넌트하고 실행시키면 Hello Unity를 순차적으로 읽어냅니다.

이제 코루틴을 사용해서 Hello 를 읽어내고 3초후에 Unity 를 읽어내게 해보겠습니다.

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Coroutine : MonoBehaviour
{
    void Start()
    {
        // StartCoroutine 함수로 실행
        StartCoroutine(HelloUnity());
    }
    
    // 데이터 타입을 IEnumerator
    IEnumerator HelloUnity()
    {
        Debug.Log("Hello ");
        yield return new WaitForSeconds(3.0f);
        Debug.Log("Unity");
    }
}

코루틴을 사용할 함수는 IEnumerator 라는 타입을 사용합니다.

HelloUnity 함수를 보면 yield return new WaitForSeconds 라는 코드가 있는데 저기에 원하는 시간을 적을 수 있습니다. yield return null을 적으면 대기시간은 1프레임이 됩니다.

그리고 StartCoroutine 함수로 원하는 함수를 실행할 수 있습니다.

애초에 코루틴 문법이 유니티 문법이기 때문에 평소 저희가 이해하는 컴퓨터 언어 문법이 아닙니다. 너무 깊게 고민할 필요는 없습니다. 어떻게 사용할건지만 알면 됩니다.

게임을 실행해보면 Hello 가 읽인 후 3초 후에 Unity 가 읽힙니다.

코루틴은 비동기 방식이다, 무한루프를 효과적으로 제어할 수 있다

비동기 방식이란 함수 호출과 그 결과가 동시에 일어나지 않는다는 뜻입니다.

이 말이 무슨 말이냐면 보통 컴퓨터 언어는 코드상에서 순서대로 함수를 호출하고 호출한 함수가 결과를 내면 다음 코드를 읽습니다.

비동기 방식은 함수를 호출 하더라도 그 함수의 결과를 기다리지 않고 계속해서 다음 코드를 읽습니다.

비동기 방식의 이점이 있는데 동시에 여러 함수를 돌릴 수 있다는 것입니다.

public class HelloCoroutine : MonoBehaviour
{
    
    void Start()
    {
        StartCoroutine("HelloUnity");
        StartCoroutine("HiCSharp");
        Debug.Log("End");
    }

    private void Update()
    {
        if(Input.GetMouseButtonDown(0))
        {
            StopCoroutine("HelloUnity");
        }
    }

    IEnumerator HelloUnity()
    {
        while(true)
        {
            yield return new WaitForSeconds(3f);
            Debug.Log("Hello Unity");
        }
    }

    IEnumerator HiCSharp()
    {
        yield return new WaitForSeconds(5f);
        Debug.Log("Hi CSharp");
    }
}

HelloUnity 함수는 3초마다 Hello Unity 를 읽고 HiCSharp 함수는 5초 후에 Hi CSharp을 읽어내게 만들었습니다.

코루틴은 비동기 방식이기 때문에 HelloUnity 함수가 호출된 후 3초후에 HiCSharp 함수가 호출되는 것이 아니라 (거의)동시에 호출됩니다. 호출되는 시간을 보면 알 수가 있죠.

코루틴을 호출할 때는 StartCoroutine 함수를 통해 함수를 바로 적을 수도 있고 따옴표(“”)를 통해 스트링 형식으로도 불러올 수 있습니다.

약간의 차이가 있는데 함수를 바로 적으면 속도가 약간 더 빠르고 스트링 형식으로 적으면 StopCoroutine 함수를 통해 코루틴을 정지시킬 수 있습니다.

HelloUnity 함수를 보면 무한루프(while(true))로 코드를 작성했는데 코루틴은 무한루프를 효과적으로 제어할 수 있습니다.

끝도 없이 계속 반복문이 도는 게 아니라 yield return new WaitForSeconds 를 통해 대기시간을 설정하기 때문에 컴퓨터에 큰 무리가 안가는 겁니다.

그리고 특정 키를 통해(Update 함수의 StopCoroutine 함수) 무한루프를 종료하게 하면 되겠죠.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 항목은 *(으)로 표시합니다