첫 코루틴 만들기
Coddy Unity 여정의 물리와 게임플레이 섹션에 포함된 레슨. 71개 중 24번째.
Update()는 매 프레임마다 끝나야 하므로 기다릴 수 없습니다. 하지만 코루틴은 기다릴 수 있습니다. 코루틴은 일시 중지했다가 멈춘 바로 그 지점에서 나중에 계속 실행되는 메서드입니다. 코루틴은 IEnumerator를 반환하며, 이를 사용하려면 using System.Collections;가 필요합니다. 코루틴 안의 각 yield return은 일시 중지를 뜻합니다. C#에서 yield return은 값을 한 번에 하나씩 내보내는 메서드를 만듭니다. 기다리는 시간이 끝나면 Unity가 다음 값을 요청합니다. yield return null은 한 프레임을 기다리고, yield return new WaitForSeconds(3f)는 3초를 기다립니다.
StartCoroutine(Cycle())은 코루틴을 시작합니다. 이 신호등은 초록색으로 바뀌고, 3초 뒤에 노란색으로, 1초 더 지난 뒤에 빨간색으로 바뀝니다.
using System.Collections;
using UnityEngine;
public class TrafficLight : MonoBehaviour
{
Renderer lamp;
void Start()
{
lamp = GetComponent<Renderer>();
StartCoroutine(Cycle());
}
IEnumerator Cycle()
{
lamp.material.color = Color.green;
yield return new WaitForSeconds(3f);
lamp.material.color = Color.yellow;
yield return new WaitForSeconds(1f);
lamp.material.color = Color.red;
}
}StartCoroutine은 코루틴을 첫 번째 yield까지 즉시 실행한 다음, Start()는 계속 실행됩니다. Unity는 기다리는 시간이 끝날 때마다 코루틴을 재개하며, 지역 변수는 이전 상태 그대로 유지됩니다. StartCoroutine 없이 Cycle();만 호출하면 아무 일도 일어나지 않습니다. 일시 중지된 메서드를 만들고 버릴 뿐, 그 안의 코드는 한 줄도 실행되지 않습니다. 또한 yield return 3f;는 3초를 기다리는 코드가 아닙니다. Unity는 WaitForSeconds 같은 대기 객체만 인식하며, 다른 값은 모두 한 프레임으로 처리합니다.
챌린지
쉬움코루틴을 사용해 Space 키를 누르면 스파이크 함정이 튀어 오르게 하세요.
IEnumerator Spring()을 작성하세요.Click을 로그에 기록하고,yield return new WaitForSeconds(0.5f);를 실행한 다음transform.position += Vector3.up;을 실행하세요.- 같은 방식으로 2초 기다린 다음
Vector3.up을 다시 빼세요. - Space 키의
if문에서StartCoroutine(Spring());으로 코루틴을 시작하세요.
‘플레이’를 누르고 Space 키를 누르세요. 스파이크가 위로 튀어 오른 다음 내려갑니다. 그런 다음 ‘확인’을 누르세요.
직접 해보기
using System.Collections;
using UnityEngine;
public class SpikeTrap : MonoBehaviour
{
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
// 코루틴으로 함정을 작동시키기
}
}
// IEnumerator Spring(): 클릭, 0.5 s 대기, 1 unit 위로 이동, 2 s 대기, 1 unit 아래로 이동
}
물리와 게임플레이의 모든 레슨
직접 연습해 보세요: Unity 플레이그라운드