코루틴이란?

2024. 9. 11. 20:31카테고리 없음

개요

코루틴에 대해서 알아보자.

 

내용 - 코루틴이란?

코루틴은 IEnumerator를 반환하는 함수이다.코루틴은 따로 작동하는게 아닌 전체 흐름에서 잠깐동안 작동을 하는거다.

 

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

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

시간의 흐름에 따른 이벤트의 시퀀스나 절차상의 애니메이션을 포함하기 위해 메서드 콜을 사용하고자 하는 상황에서 코루틴을 사용할 수 있습니다.

 

코루틴의 동기 작업은 여전히 메인 스레드에서만 실행이 됩니다. 그래서  메인 스레드에 소요되는 CPU 시간을 줄이려면 다른 스크립트 코드에서와 마찬가지로 코루틴의 작업 차단을 방지하는 것이 중요합니다.

 

내용 - 코루틴 함수 생성방법

코루틴은 Ienumerator반환 타입과 바디 어딘가에 포함된 yield 반환문으로 선언하는 메서드입니다.

예시)

IEnumerator Fade()

{

       Color c = renderer.material.color;

       for (float alpha = 1f; alpha >= 0; alpha -= 0.1f)

       {

              c.a = alpha;

              renderer.material.color = c;

              yield return null;

       }

}

 

yield return null 라인은 실행이 일시 정지되고 다음 프레임에서 다시 시작되는 지점입니다. 코루틴 실행을 설정하려면 다음과 같이 StartCoroutine함수를 사용해야 합니다.

예시)

void Update()

{

        if (Input.GetKeyDown("f"))

        {

                StartCoroutine(Fade());

        }

}

Fade 함수의 루프 카운터는 코루틴의 수명 동안 올바른 값을 유지하며 다른 변수나 파라미터는 yield 문 간에 보존됩니다.

 

내용 - 코루틴 시간지연

기본적으로 Unity는 yield 문 다음 프레임에 코루틴을 다시 시작합니다. 시간 지연을 도입하려면 다음과 같이 WaitForSeconds를 사용합니다.

예시)

IEnumerator Fade()

        {

                Color c = renderer.material.color;

                for (float alpha = 1f; alpha >= 0; alpha -= 0.1f)

                {

                        c.a = alpha;

                        renderer.material.color = c;

                        yield return new WaitForSeconds(.1f);

                }

        }

 

내용 - 코루틴 정지

StopCoroutineStopAllCoroutines 을 사용하여 코루틴을 정지할 수 있습니다. 코루틴에 연결된 게임오브젝트를 비활성화하기 위해 SetActive false로 설정하면 코루틴이 정지됩니다.

 

내용 - 코루틴 시작코드

코루틴의 모든 시작 코드(코루틴 메서드의 시작부터 첫 번째 yield문까지)는 Unity가 코루틴을 시작할 때마다 트레이스에 나타납니다. 시작 코드는 StartCoroutine 메서드가 호출될 때마다 종종 나타납니다

 

내가 사용한 코루틴 코드

public void Shuffle()
{
    Time.timeScale = 0.0f;
    shuffleImage.SetActive(true);
    audioSource.PlayOneShot(clip);
    int[] arr = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 };
    arr = arr.OrderBy(x => Random.Range(0, 15)).ToArray();
    for (int i = 0; i < 16; i++)
    {

        float x = (i % 4) * 1.4f - 2.1f;//-2.1,-0.7,+0.7,2.1
        float y = (i / 4) * 1.4f - 3.0f;//-3.0,-1.6,-0.2,1.2

        if(cardList[arr[i]]!=null)cardList[arr[i]].transform.position = new Vector3(x, y, -1f);
    }
    StartCoroutine(WaitFor(0.5f));
    
}

 

IEnumerator WaitFor(float delayTime)
{
    yield return new WaitForSecondsRealtime(delayTime);
    Time.timeScale = 1.0f;
    shuffleImage.SetActive(false);
}

코루틴 해석

1. StartCoroutine(WaitFor(0.5f)); :

- StartCoroutine가 코루틴의 시작을 알린다

- WaitFor(0.5f)라는 함수를 호출

2. IEnumerator WaitFor(float delayTime) :

- IEnumerator형반환하는 함수 생성

- WaitFor이라는 함수생성

- 실수형 매개변수 delayTime생성

3. yield

- 양보하다

4. return

- 반환하다

5. WaitForSecondsRealtime(delayTime)

- WaitForSceondsRealtime으로 하면 진짜시간이 흐르는 거야서 delayTime동안 흐른다.

- (참고)WaitForRealtime만 하면 프로그램 자체의 시간이기 때문에 시간이 0.5초만큼 안흐른다.

6. Time.timeScale :

유니티프로그램 자체의 시간이다

 

전체해석

StartCoroutine를 만나면 WaitFor이라는 함수가 실행이된다.

WaitFor내용은 = 0.5초만큼의 진짜시간을 기다린뒤에 돌아올떄까지 양보할게 그 다음에 양보한 시간 돌아오게끔 timeScale = 1.0f로 만든다.

 

 

아무리 봐도 코루틴에 대해서 모르겠으면 밑에 링크 클릭

Unity 코루틴 설명링크