코루틴 중지하기
Coddy Unity 여정의 물리와 게임플레이 섹션에 포함된 레슨. 63개 중 25번째.
StartCoroutine은 시작한 코루틴을 참조하는 핸들인 Coroutine을 반환합니다. 이를 필드에 저장하면 StopCoroutine(handle)로 해당 코루틴이 일시 중지된 지점에서 중단할 수 있습니다. 즉, yield 뒤의 줄은 실행되지 않습니다. StopAllCoroutines()는 스크립트가 시작한 모든 코루틴을 중단합니다. Space 키를 누르면 이 알람이 켜지고 꺼집니다.
Coroutine beeping;
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
if (beeping == null)
{
beeping = StartCoroutine(Beep());
}
else
{
StopCoroutine(beeping);
beeping = null;
}
}
}
IEnumerator Beep()
{
while (true)
{
Debug.Log("Beep");
yield return new WaitForSeconds(1f);
}
}코루틴이 중단되어도 필드가 자동으로 비워지지 않으므로, 알람은 필드를 다시 null로 설정합니다. 그러면 다음에 Space 키를 눌렀을 때 실행 중인 코루틴이 없다는 것을 알 수 있습니다. 맞는 것처럼 보이지만 작동하지 않는 방법이 두 가지 있습니다. StopCoroutine(Beep())는 Beep()를 다시 호출해 아직 시작하지 않은 새 코루틴을 만든 다음 그것을 중단하므로, 알람은 계속 울립니다. 그리고 enabled = false는 스크립트의 Update()를 비활성화하지만 코루틴은 계속 실행됩니다. 코루틴은 핸들을 통해 중단되거나 StopAllCoroutines()가 호출될 때, 마지막 줄에 도달할 때, 또는 SetActive(false)로 GameObject가 비활성화되거나 파괴될 때 종료됩니다.
챌린지
쉬움Space를 누르면 Bomb의 퓨즈에 불이 붙습니다. Fuse 코루틴은 Fuse lit을 로그에 기록하고, fuseTime(3)초를 기다린 뒤 Boom을 로그에 기록하고 폭탄을 파괴합니다. 클릭하면 해체되어야 하지만, 스크립트가 꺼지고 폭탄은 여전히 폭발합니다. 해체 기능을 수정하세요.
- 퓨즈가 타는 동안 클릭하면 퓨즈를 멈추고
Defused를 로그에 기록합니다. 폭탄은 그대로 남습니다. - 그 후 Space를 눌러 퓨즈에 다시 불을 붙일 수 있으며, 이번에는 클릭하지 않으면 3초 후 폭탄이 폭발합니다.
Play를 눌러 퓨즈에 불을 붙이고, 클릭한 다음 Console을 확인하고 Check를 누르세요.
직접 해보기
using System.Collections;
using UnityEngine;
public class Bomb : MonoBehaviour
{
public float fuseTime = 3f;
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
StartCoroutine(Fuse());
}
if (Input.GetMouseButtonDown(0))
{
enabled = false;
Debug.Log("Defused");
}
}
IEnumerator Fuse()
{
Debug.Log("Fuse lit");
yield return new WaitForSeconds(fuseTime);
Debug.Log("Boom");
Destroy(gameObject);
}
}
이 레슨에는 짧은 퀴즈가 포함되어 있습니다. 레슨을 시작해 문제를 풀고 진행 상황을 기록하세요.