Unity의 코루틴은 비동기 처리를 위해 자주 사용된다.
StartCoroutine을 통해 실행하면 유니티에서 알아서 비동기로 해준다.
물론 코루틴은 메인 스레드에서 돌아가며, 멀티 스레딩이 아니라는 점을 유의해야한다. 자세한 내용은 #1, #2
StartCoroutine(Susume());
그런데, 실행한 코루틴을 다시 중지하려면 어떻게 해야할까?
1. StopCoroutine from inside
먼저, 코루틴 내부에서 탈출하는 방법이 있다.
코루틴 함수에서 yield break를 하게 되면 함수에서 return하는 것과 같이 바로 빠져나올 수가 있다.
IEnumerator CoroutineTest()
{
while (true)
{
yield break; // 코루틴 종료
}
}
2. StopCorutine by name
외부 함수 등에서 코루틴의 이름을 가지고 중지할 수 있다.
코루틴 함수 이름으로 중지하는 경우, 현재 실행 중인 같은 이름의 모든 코루틴 인스턴스를 중지시킨다.
주의할 점은, StartCoroutine에서도 함수 이름(string)으로 호출해야지만 사용가능하다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CoroutineTest : MonoBehaviour
{
void Start()
{
StartCoroutine("MyCoroutine");
StartCoroutine("MyCoroutine");
//StartCoroutine(MyCoroutine()); // X, 이름으로 중지 불가능
}
private IEnumerator MyCoroutine()
{
while (true)
{
Debug.Log("MyCoroutine 실행 중...");
yield return new WaitForSeconds(1f);
}
}
void Update()
{
if (Input.GetKeyDown(KeyCode.A))
{
StopCoroutine("MyCoroutine");
Debug.Log("MyCoroutine이 중지되었습니다."); // 모든 "MyCoroutine" 중지
}
}
}
3. StopCoroutine by IEnumerator
코루틴 함수의 반환값은 IEnumerator로, 변수로 관리할 수 있다.
이 IEnumerator를 StopCoroutine에 전달하면 해당 코루틴를 중지할 수 있다.
다만, coroutine으로 StartCoroutine을 여러 번 호출 했다면, StopCoroutine(coroutine)에서 모든 코루틴 인스턴스를 중지시킨다.
private IEnumerator myRoutine;
void Start()
{
myRoutine = MyCoroutine();
StartCoroutine(myRoutine);
StartCoroutine(myRoutine);
}
private IEnumerator MyCoroutine()
{
while (true)
{
Debug.Log("MyCoroutine 실행 중...");
yield return new WaitForSeconds(1f);
}
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
StopCoroutine(myRoutine);
Debug.Log("MyCoroutine이 중지되었습니다."); // 모든 myRoutine 인스턴스 중지
}
}
4. StopCoroutine by Coroutine
StartCoroutine의 반환값은 Coroutine으로, 이 역시 변수로 관리할 수 있다.
StopCoroutine에 전달하면 실행중인 특정 코루틴 인스턴스를 중지할 수 있다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CoroutineTest : MonoBehaviour
{
private Coroutine myRoutine;
private Coroutine myRoutine2;
void Start()
{
myRoutine = StartCoroutine(MyCoroutine());
myRoutine2 = StartCoroutine(MyCoroutine());
}
private IEnumerator MyCoroutine()
{
while (true)
{
Debug.Log("MyCoroutine 실행 중...");
yield return new WaitForSeconds(1f);
}
}
void Update()
{
if (Input.GetKeyDown(KeyCode.A))
{
StopCoroutine(myRoutine);
Debug.Log("MyCoroutine이 중지되었습니다."); // myRoutine만 종료
}
if (Input.GetKeyDown(KeyCode.B))
{
StopCoroutine(myRoutine2);
Debug.Log("MyCoroutine2가 중지되었습니다."); // myRoutine2만 종료
}
}
}
5. StopAllCoroutines()
실행 중인 모든 코루틴을 중지시킬 수 있다. 유니티에서 제공하는 StopAllCoroutines()을 사용하면 된다.
*만약 StartCoroutine(MyCoroutine())과 같이 인스턴스를 바로 넘긴다면, StopAllCoroutines로만 중지가 가능하다.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class CoroutineTest : MonoBehaviour
{
void Start()
{
StartCoroutine(MyCoroutine());
}
private IEnumerator MyCoroutine()
{
while (true)
{
Debug.Log("MyCoroutine 실행 중...");
yield return new WaitForSeconds(1f);
}
}
void Update()
{
if (Input.GetKeyDown(KeyCode.A))
{
StopCoroutine("MyCoroutine");
Debug.Log("MyCoroutine이 중지되었습니다.");
}
if (Input.GetKeyDown(KeyCode.B))
{
StopCoroutine(nameof(MyCoroutine));
Debug.Log("MyCoroutine이 중지되었습니다. (nameof 사용)");
}
if (Input.GetKeyDown(KeyCode.C))
{
StopAllCoroutines();
Debug.Log("모든 코루틴이 중지되었습니다.");
}
}
}

결론
코루틴을 여러 번 호출 시키는 경우라면, StartCoroutine의 반환 값을 Coroutine으로 저장하여 개별적으로 관리하는게 좋아보인다.
간단한 경우라면 method name으로 중지시키는게 편하다.
References
'게임개발 > Unity' 카테고리의 다른 글
| [Unity] 안쓰는 함수 멋지게 표현하기 (System.Obsolete) (0) | 2025.06.12 |
|---|---|
| [Unity] NetworkVariable, INetworkSerializable Synchronization Problem (0) | 2025.06.05 |
| [Unity] Button OnClick Event is triggered twice (0) | 2024.08.26 |
| [Unity] 마우스 커서 숨기기, 마우스 화면 고정(cursor visible, cursor lock) (1) | 2023.12.17 |
| 표준국어대사전 API 이용 (Unity, C#) (0) | 2022.08.19 |