C# 코루틴

이진호·2023년 12월 5일

C#... 그리고 Unity

목록 보기
9/15

coroutine

  • 선언
    IEnumerator / IEnumerable / IEnumerator<T> / IEnumerable<T>
void Start()
{
    StartCoroutine(blink(1));
}
 
IEnumerator blink(float duration)
{
    while (true)
   {
        Debug.Log("0.5초마다 실행된다 헤헿");
        yield return new WaitForSeconds(duration);
        Debug.Log("0.5초 또 지났다 헤헿");
        yield return new WaitForSeconds(duration);
   }
}
//unity에서 1초마다 0.5초가 지났다고 구라치는 디버그.로그가 뜨도록 작성.
  • 코루틴을 사용하는 이유
    프로그램 실행시 몇초 또는 몇분등 시간텀을 두어야 하는 상황들이 발생할 수 있는데 예를 들어 공격 또는 스킬의 쿨타임, 자동차 시동걸때등 다양한 경우가 있다.
    이 경우 프레임마다 실행되는 업데이트문에 사용한다면..?
    공격을 초당 80번 또는 160번 하게 될것이다.. 난리가 나겠지...
    또는 멀티스레드를 사용하게 된다면 스킬 하나 컨트롤 하자고 프로그램의 성능을 아작 낼 수도 없는 노릇이다.
    이럴때 사용하는것이 바로 코.루.틴인것이다.


위의 사진을 예시로 스레드는 한가지의 과정을 쭈욱 하는것이기 때문에 프로그램이 구동중에 딜레이가 필요한 상황이 발생했을 경우 해당 스레드의 모든 프로그램이 같이 멈춰야 한다..

하지만 코루틴같은 경우는 딜레이가 필요한 상황이 발생했을 경우 그 시점에 필요한 시간이 될때까지 코루틴에서 실행하고자 하는 메소드를 스톱시키고 코루틴을 사용하는 메소드를 호출했던 다음 명령어를 수행한다.
이후 코루틴에서 요구했던 시간 타임이 지난 후 돌아오는 프레임에서 다음 메소드를 수행한다.

위의 그림처럼 업데이트문에 있는 함수와 메소드들을 매 프레임마다 모두 한번식 건들어 보면서 돌지만, 코루틴은 정의해놓은 시간 또는 조건이 충족되기 전까지는 해당 메소드를 진행하지 않고 호출했던 명령어의 다음 명령어를 실행시킨다. 그렇게 열심히 프레임마다 업데이트를 돌다가 코루틴의 조건이 충족하면 다시 다음 구문들을 진행한다..
그렇다 코루틴의 정체는 중단과 재개인것이다.

IEnumerator의 진행과정

  • MoveNext : (Boolean타입)코루틴의 다음요소의 유무를 true와 false로 반환한다.
    //true : 코루틴 진행, flase : 코루틴 진행 중단.
  • Current : 코루틴 진행루틴중 현재의 위치값을 반환한다.
  • Reset : 코루틴 메소드가 종료되면, Current을 맨 처음 시작점으로 되돌린다.
<예시>
public bool MoveNext()
{ *인덱스, 구문등 다음이동할 위치값 }

public int Cunnent => 커넷의 위치 범위와 초기화

public void Reset()
{ 코루틴 전체 실행시 이동할 위치 지정 }

코루틴의 중단과 재개

yield return을 사용하여 서브루틴을 중단하며 다음 프레임워크에 따라 업데이트 이후 코루틴 메소드중 중단점 이후로 서브루틴을 재개한다.

  • 사용 함수
    - yield return numm; // null을 반환하며 서브루틴 중단.
    - yield return 반환값; // 반환값을 전달하며 서브루틴 중단.
    - yield Break(); // 서브루틴 종료.
profile
콜라 없는 내 인생은 김빠진 콜라

0개의 댓글