일시중지 - 재개가 가능한 함수
Iterator Method로 구현이 되어 있음
작업을 여러 프레임으로 쪼개야 하는데, 코루틴이라는 기능이 없다면 프레임의 흐름이나 시간의 흐름을 계산하면서 구현해야 하기 때문에 코드 자체가 복잡해짐
MonoBehaviour.StartCoroutine()으로 코루틴을 시작할 수 있음
코루틴은 부착된 게임오브젝트가 비활성화 될 때 자동으로 중단됨
가비지 생성
IEnumerator는 Reset()이 불가능하기 때문에 반복적으로 사용하려면 아래와 같이 사용
IEnumerator _testCoroutine;
private void Start()
{
_testCoroutine = TestCoroutine();
}
private void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
// 2번째부터는 동작을 안함
StartCoroutine(_testCoroutine);
}
}
IEnumerator TestCoroutine()
{
while (true)
{
Debug.Log("시작");
yield return new WaitForSeconds(0.3f);
Debug.Log("끝");
StopCoroutine(_testCoroutine);
yield return null;
}
}
반복해서 계속 사용하기 위해서 while문 사용
하지만 위와 같은 방식은 가독성이 떨어짐
위와 같은 문제 때문에 Unitask를 사용할 수 있음
Unitask 설명과 사용법 예시 잘 정리해놓은 블로그
Update가 아닌 곳에서 반복적으로 코드가 실행되어야 할 필요가 있을 때
Update문은 프레임마다 계속 반복적으로 실행되지만, 코루틴은 필요한 순간에만 반복하고 필요하지 않을 때에는 전혀 사용하지 않음으로써 자원관리를 효과적으로 할 수 있음
당장 실행되는것이 아니라 일정 시간동안 멈춰있다가 그 뒤에 동작하게 하거나, 특정 조건을 부여해서 코드가 실행되도록 할 수도 있음
만약 Update문에 반복문을 작성하게 되면 해당 반복이 끝날 때까지 반복문 아래에 있는 코드들은 전혀 실행이 되지 않지만, 코루틴에서 반복문을 사용하면 Update와는 별도로 동작하기 때문에 모든 스크립트를 정상적으로 동작시킬 수 있음
코루틴은 IEnumerator라는 반환형으로 시작해야함
yield return이 반드시 함수 내부에 존재해야함
아래와 같이 함수를 선언해주고, StartCoroutine함수로 호출해주면 됨
IEnumerator 함수이름()
{
yield return // +조건
// 함수 내용
}
yield return null; : 다음 프레임에 실행됨
yield return new WaitForSeconds(float); : 매개변수로 입력한 숫자에 해당하는 초만큼 기다렸다가 실행됨
(유니티에서의 시간을 기준으로 체크하기 때문에 TimeScale에 영향을 받음)
yield return new WaitForSecondsRealtime(float); : 매개변수로 입력한 숫자에 해당하는 초만큼 기다렸다가 실행됨
(현실의 시간을 기준으로 체크하기 때문에 TimeScale에 영향을 받지 않음)
yield break; : yield break문을 만나면 코루틴이 바로 끝남
이 외에도 yield return + new WaitForFixedUpdate / WaitForEndOfFrame 등 여러가지 사용법이 존재함
초보 개발자가 기억이 나지 않을 때 꺼내어 보기 위해 기록하는 공간입니다. 틀린 점이 있다면 댓글로 알려주시면 정말 감사하겠습니다.