Unity Coroutine
💻 Coroutine함수
coroutine이란 unity상에 꼭 필요한 update함수가 있을 때 update함수는 초당 fps맞게 실행되는데 보통 60번정도 실행이 된다.
만약 사용자가 2초나 1초마다 반복하고 싶다면 update함수내에서 조건을 걸거나 invoke함수를 이용할 수 있다.
하지만 그 만큼의 메모리를 잡아먹기 때문에 비효율적이다.
void Fade() {
for (float f = 1f; f >= 0; f -= 0.1f) {
Color c = renderer.material.color;
c.a = f;
renderer.material.color = c;
}
이런 함수가 있다고 가정할 때 물론 c언어나 다른 언어에서는 문제가 없지만 유니티와 같이 직접 눈으로 변화를 관찰할 목적으로 만든 함수라면 0점이다.
한 프레임으로 실행이 되기 때문에 10번 반복한다고 해서 10번으로 보이지 않는다.
사용자에 눈에 맞게 변화해야 하기 때문에 코루틴이 필요한 것.
또한 다양한 동작들을 전부 update에 집어넣어 같은 프레임으로 관리하기 힘드니 다양한 서브동작들을 코루틴으로 관리한다.
코루틴은 다양하게 사용할 수 있지만 가장 많이 사용하는 방식으로 예를 들어보자
void Update() {
if (Input.GetKeyDown("f")) {
StartCoroutine("Fade");
}
}
IEnumerator Fade() {
for (float f = 1f; f >= 0; f -= 0.1f) {
Color c = renderer.material.color;
c.a = f;
renderer.material.color = c;
yield return new WaitForSeconds(.1f);
}
}
- StartCoroutine(“”);는 ““안에 함수명을 작성해야함.
Fade라는 함수는 객체의 알파값(투명도)를 점점 낮추는 함수인데 실행주기를 결정하는 것은 yield return new waitForSeconds(.1f) 이 부분이다.
코루틴 함수는 반환값이 IEnumerator형이고 반환을 yield로 시작한다.
여기서 yield return이란 코루틴에서 동작하는 제어권을 다시 유니티에게 돌려준다는 뜻인데 마지막 반환 값 만큼의 동작을 중지하고 제어권을 돌려준다.
여러가지 반환타입이 있는데
yield return null; - 한 프레임 기다림
yield return new WaitForSeconds(1f); - 1초 기다림(time scale에 영향받음)
yield return new WaitForSecondsRealtime(1f); - 실제 시간으로 1초 기다림(time scale에 영향받지 않음)
yield return new WaitForFixedUpdate(); - 다음 FixedUpdate 끝날 때까지 기다림
yield return new WaitForEndOfFrame(); - 다음 프레임의 Update와 모든 렌더링이 끝날 때까지 기다림
다양한 반환값으로 다채로운 구현이 가능해진다.
++ 코루틴은 오브젝트가 활성화가 되어있어야지 실행이된다.
재생 테스트
출처: https://wergia.tistory.com/219 [베르의 프로그래밍 노트] https://docs.unity3d.com/kr/530/Manual/Coroutines.html - 유니티 Documentation 참고
✍️ 용어 정리
- invoke함수: Invoke(“실행하고자 하는 함수”,”딜레이 시간”)으로 실행가능하다.
댓글남기기