보통 함수는 하나의 프레임내에서 명령이 실행되게 하는데, 여러 프레임에 걸쳐서 코드를 실행시키기 위한 함수가 코루틴(Coroutine)입니다. 쓰레드와 비슷하다고 느낄 수 있지만 비동기가 아니기 때문에 쓰레드는 아닙니다. 대체로 Update함수를 이용해서 구현할 수 있지만, 코루틴을 사용해야하는 이유는 작업을 나눠서 수행할 수 있고, 불필요한 작업들이 Update문에서 계속 실행되는 것을 방지할 수 있습니다.
형식 함수를 정의한 후 StartCoroutine(코루틴함수)로 실행을 합니다. 코루틴 함수는 IEnumerator의 반환형을 가집니다.
Sprite Object의 알파수치를 변경하는 예제입니다. IEnumerator Fade() 함수를 생성해주고, StartCoroutine을 통해 시작하도록 했습니다. yield return new WaitForSeconds(1f); 이 코드는 1초를 대기하라는 의미입니다.
yield 키워드의 종류는 다음과 같습니다. yield return null yield return new WaitForSeconds(float second) - 주어진 시간(초)동안, co-routine의 수행을 중단합니다. yield return new WaitForFixedUpdate() - 다음 고정 프레임 업데이트 함수(fixed frame rate update)가 호출될 때까지 기다립니다. yield return new WaitForEndOfFrame() - 화면에 컨텐츠를 보여주는 프레임 바로 직전에, 모든 카메라와 GUI가 렌더링을 완료하는 프레임의 마지막을 기다립니다. yield return StartCoRoutine(string) - 다른 코루틴이 끝날 때까지 기다립니다. yield return new WWW() - 웹 통신 작업이 끝날 때까지 기다립니다. yield return new AsyncOperation - 비동기 작업이 끝날때까지 기다립니다.
코루틴이 진행중에도 StopCoroutine(함수명)을 입력한다면 정지시킬 수 있습니다.
방금 사용한 StartCoroutine ("Fade"); 이렇게 스트링으로 함수명을 넣을 수도 있지만, 직접 함수를 StartCoroutine (Fade());로 코드를 작성할 수 있습니다.
그리고 함수에 매개변수를 넣어서 표현도 가능합니다.
StartCoroutine (Fade(0.1f));
IEnumerator Fade(float fAlphaPlus) { for(int i = 0; i < 10; i++) { m_fAlpha += fAlphaPlus; spriteRenderer.color = new Color(0, 0, 0, m_fAlpha ); yield return new WaitForSeconds(1f); } }
Force rigidbody에 지속적인 힘 추가, 질량 사용. Acceleration rigidbody에 지속적인 가속 추가, 질량 무시. Impulse rigidbody에 순간적으로 충격 추가, 질량 사용. VelocityChange rigidbody에 순간속도 변경, 질량 무시.