게임심화 - 9. Script - 코루틴

LSDrug·2024년 7월 3일

1. 동기적, 비동기적

동기적

  • 순차적, 함수 하나의 동작이 전부 끝난 뒤 다음이 실행되는 것

비동기적

  • 함수 하나의 동작이 전부 끝나지 않더라도 실행되는 것.
  • 유니티에서는 코루틴을 사용한다.

동기적, 비동기적 실행방식

2. 코루틴

  • 유니티가 지원하는 기능
  1. 처리와 처리 사이에 대기 시간을 넣어줄 수 있다.
  2. 여러 처리를 동시에 병렬로 할 수 있도록 해준다.
  • 실제로 병렬 처리가 이루어지는 것은 아니다.
  • 빠르게 왔다 갔다 하면서 실행되서 병렬 처리 되는 것처럼 보여진다.

기본 코루틴 코드

private void Start()
{
	StartCoroutine(routine:CoroutineTest()); // 코루틴 실행
}

private IEnumerator CoroutineTest() // 리턴 함수
{
	Debug.Log($"1 : {Time.realtimeSinceStartup}");
    yield return null; // 한 프레임 휴식
    Debug.Log($"2 : {Time.realtimeSinceStartup}");
    yield return new WaitForSeconds(1f); // 1초 대기
    Debug.Log($"3 : {Time.realtimeSinceStartup}");
}

다음과 같은 코루틴 코드에서는 해당 이미지의 결과가 나온다.

각 시간의 차이가 나는 것을 알 수 있다.

  • 1->2 : 한 프레임이 경과된 시간
  • 2->3 : 1초 정도 경과된 시간 (그러나 1초가 정확하지 않다.)

이름을 이용해 실행시키는 방법

  • 오타가 있을 수 있기 때문에 잘 사용하지 않는다.
private void Start()
{
	StartCoroutine(routine:CoroutineTest()); // 코루틴 실행
    
    StratCoroutine(methodName: "CoroutineTest"); // 이름을 넘기는 방법 오타 주의
}

private IEnumerator CoroutineTest() // 리턴 함수
{
	Debug.Log($"1 : {Time.realtimeSinceStartup}");
    yield return null; // 한 프레임 휴식
    Debug.Log($"2 : {Time.realtimeSinceStartup}");
    yield return new WaitForSeconds(1f); // 1초 대기
    Debug.Log($"3 : {Time.realtimeSinceStartup}");
}

다음 결과가 나온다.

특정 코루틴 삽입, 제거, 멈춤

private void Start()
{
	StartCoroutine(routine:CoroutineTest()); // 코루틴 실행
    
    StratCoroutine(methodName: "CoroutineTest"); // 이름을 넘기는 방법 오타 주의
    
    StopCouroutine(coroutine); // 멈출 수 있다. 
}

private IEnumerator CoroutineTest() // 리턴 함수
{
	Debug.Log($"1 : {Time.realtimeSinceStartup}");
    yield return null; // 한 프레임 휴식
    Debug.Log($"2 : {Time.realtimeSinceStartup}");
    yield return new WaitForSeconds(1f); // 1초 대기
    Debug.Log($"3 : {Time.realtimeSinceStartup}");
}

첫번째 코루틴은 StopCouroutine에 의해서 멈추었고 두번째 코루틴에 대해서만 작동하게 된다.

private void Start()
{
	StartCoroutine(routine:CoroutineTest()); // 코루틴 실행
}

private IEnumerator CoroutineTest() // 리턴 함수
{
	Debug.Log($"1 : {Time.realtimeSinceStartup}");
    yield return StartCoroutine(CoroutineTest2()); // 코루틴 안에서 코루틴 다시 실행
    Debug.Log($"2 : {Time.realtimeSinceStartup}");
    yield return new WaitForSeconds(1f); // 1초 대기
    Debug.Log($"3 : {Time.realtimeSinceStartup}");
}

private IEnumerator CoroutineTest2 ()
{
	Debug.Log($"4 : {Time.realtimeSinceStartup}");
    yield return null; // 한 프레임 휴식
    Debug.Log($"5 : {Time.realtimeSinceStartup}");
    yield return new WaitForSeconds(1f); // 1초 대기
    Debug.Log($"6 : {Time.realtimeSinceStartup}");

1에서 CoroutineTest2()로 들어가서 4, 5, 6이 실행이 된 후에 다시 2, 3이 되게 된다.

코루틴을 사용할 때는 코루틴을 start하는 부분과 end뒤의 이어지는 부분에 알아보기 위해서 주석을 달아야 한다.


profile
마약같은 코딩, 마약같은 코딩러

0개의 댓글