코루틴 중지하기
Coddy Unity 여정의 물리와 게임플레이 섹션에 포함된 레슨. 71개 중 26번째.
StartCoroutine는 자신이 시작한 코루틴을 가리키는 핸들인 Coroutine을 반환합니다. 이를 필드에 저장하면 StopCoroutine(handle)가 코루틴이 일시 중지된 지점에서 중단합니다. 따라서 yield 뒤의 줄은 실행되지 않습니다. StopAllCoroutines()는 스크립트가 시작한 모든 코루틴을 중단합니다. 스페이스 키를 누르면 이 알람이 켜지고 꺼집니다.
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로 설정하고, 다음에 스페이스 키를 눌렀을 때 실행 중인 것이 없다는 것을 알 수 있습니다. 그럴듯해 보이지만 작동하지 않는 방법이 두 가지 있습니다. StopCoroutine(Beep())는 Beep()를 다시 호출해 아직 시작되지 않은 새 코루틴을 만들고 그 코루틴을 중단하므로, 알람은 계속 울립니다. 또한 enabled = false는 스크립트의 Update()를 끄지만 코루틴은 계속 실행됩니다. 코루틴은 핸들을 통해 중단되거나 StopAllCoroutines()로 중단될 때, 마지막 줄에 도달할 때, 또는 SetActive(false)로 GameObject가 비활성화되거나 파괴될 때 종료됩니다.
챌린지
쉬움스크립트를 끄지 않고 클릭 한 번으로 폭탄을 해체하세요.
Coroutine fuse;필드를 추가하세요. 스페이스바를 누르면fuse = StartCoroutine(Fuse());를 설정하세요.- 클릭하면
enabled = false;를 다음과 같이 바꾸세요.fuse != null일 때StopCoroutine(fuse);를 호출하고,fuse = null로 설정한 다음Defused를 로그에 출력하세요.
‘플레이’를 누르고 스페이스바를 누른 다음 클릭하세요. Console에 Defused가 표시되고 폭탄은 그대로 남아 있습니다. 그런 다음 ‘확인’을 누르세요.
직접 해보기
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);
}
}
물리와 게임플레이의 모든 레슨
직접 연습해 보세요: Unity 플레이그라운드