[Unity] StopCoroutine, 코루틴 중지시키기

2025. 6. 3. 02:07·게임개발/Unity

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("모든 코루틴이 중지되었습니다.");
        }
    }
}

StopAllCoroutines()으로 중지

결론

코루틴을 여러 번 호출 시키는 경우라면, StartCoroutine의 반환 값을 Coroutine으로 저장하여 개별적으로 관리하는게 좋아보인다.

간단한 경우라면 method name으로 중지시키는게 편하다.

 

References

더보기

https://discussions.unity.com/t/stopcoroutine-is-not-stopping-my-coroutines/134523

 

https://docs.unity3d.com/ScriptReference/MonoBehaviour.StopCoroutine.html

저작자표시 변경금지 (새창열림)

'게임개발 > 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
'게임개발/Unity' 카테고리의 다른 글
  • [Unity] 안쓰는 함수 멋지게 표현하기 (System.Obsolete)
  • [Unity] NetworkVariable, INetworkSerializable Synchronization Problem
  • [Unity] Button OnClick Event is triggered twice
  • [Unity] 마우스 커서 숨기기, 마우스 화면 고정(cursor visible, cursor lock)
깜냥c
깜냥c
게임 개발/클라이언트/AI/PS/기타 연구
  • 깜냥c
    Choice Program
    깜냥c
  • 전체
    오늘
    어제
    • 분류 전체보기 (58)
      • 언어 (11)
        • C,C++ (9)
        • C# (1)
        • Python (1)
      • PS (20)
        • 백준 문제 (19)
        • 알고리즘 (1)
      • 인공지능 (2)
      • 게임제작 (7)
      • 게임개발 (15)
        • Unity (8)
        • Unreal Engine (5)
        • Godot Engine (1)
      • 기타 (2)
  • 블로그 메뉴

    • 홈
    • 방명록
    • 블로그 소개
  • 링크

    • 김병장의 IT 블로그
    • 식품영양과 데이터사이언스
  • 공지사항

  • 인기 글

  • 태그

    입출력
    백준
    unity
    BOJ
    Godot
    C언어
    Unreal
    UE5
    배낭 문제
    C++
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
깜냥c
[Unity] StopCoroutine, 코루틴 중지시키기
상단으로

티스토리툴바