코루틴에서 반복문 사용하기
Coddy Unity 여정의 물리와 게임플레이 섹션에 포함된 레슨. 71개 중 25번째.
내부에 yield return이 있는 루프는 반복할 때마다 다음 반복 전에 멈추므로 여러 프레임에 걸쳐 실행됩니다. WaitForSeconds를 사용하면 루프가 일정한 박자에 맞춰 무언가를 반복합니다. 이 사이렌은 3번 깜박입니다:
IEnumerator Flash()
{
for (int i = 0; i < 3; i++)
{
lamp.enabled = true;
yield return new WaitForSeconds(0.2f);
lamp.enabled = false;
yield return new WaitForSeconds(0.2f);
}
}yield return null을 사용하면 루프는 조건이 충족될 때까지 매 프레임 조금씩 작업합니다. 이것이 코루틴이 무언가를 애니메이션화하는 방식입니다. 크기가 1인 이 풍선은 크기가 2에 도달할 때까지 초당 0.5씩 커진 다음 다음을 출력합니다:
IEnumerator Inflate()
{
while (transform.localScale.x < 2f)
{
transform.localScale += Vector3.one * 0.5f * Time.deltaTime;
yield return null;
}
Debug.Log("Full");
}Time.deltaTime은 여기서 Update()에서와 똑같이 작동합니다. 코루틴은 프레임마다 한 번씩 재개되고, 루프 다음 줄은 루프가 끝난 뒤에만 실행됩니다. yield가 없으면 루프 전체가 한 프레임 안에서 실행되어 풍선이 순식간에 가득 찹니다. while (true) 루프는 매 반복마다 yield를 수행하는 한 코루틴에서 사용해도 괜찮습니다. yield가 없으면 프레임을 반환하지 않아 Unity 편집기가 멈춥니다.
챌린지
쉬움Ride를 작성해 빗장문이 한 번 왕복하도록 하세요.
Vector3 up = down + Vector3.up * height;를 설정하세요.while (transform.position != up)인 동안Vector3.MoveTowards(transform.position, up, speed * Time.deltaTime)를 사용해 이동하고yield return null;을 실행하세요.Open을 로그에 기록한 다음yield return new WaitForSeconds(1f);를 실행하세요.- 같은 방법으로
down까지 내려가도록 반복한 다음Closed를 로그에 기록하세요.
‘플레이’를 누르고 Space 키를 누르세요. 문이 올라가서 잠시 기다린 뒤 닫힙니다. 그런 다음 ‘확인’을 누르세요.
직접 해보기
using System.Collections;
using UnityEngine;
public class Portcullis : MonoBehaviour
{
public float speed = 1.5f;
public float height = 3f;
Vector3 down;
void Start()
{
down = transform.position;
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
StartCoroutine(Ride());
}
}
IEnumerator Ride()
{
// speed의 속도로 height만큼 올라가고 Open을 로그에 기록한 뒤, 1초 동안 머물렀다가 다시 내려와 Closed를 로그에 기록한다
yield return null;
}
}
물리와 게임플레이의 모든 레슨
직접 연습해 보세요: Unity 플레이그라운드