본문 바로가기
Unity/기법

[Unity] 오브젝트가 꺼져도 멈추지 않는 코루틴 (CoroutineManager)

by 김기승 2026. 3. 2.
반응형

유니티에서는 코루틴(Coroutine)을 실행한 GameObject비활성화되면 코루틴도 함께 멈춰버리는 문제가 있다.
오브젝트의 활성 상태와 상관없이 끝까지 실행되어야 하는 로직에서는, 이 방식이 꽤나 걸림돌이 된다.

따라서, 어디서든 접근 가능하고, 오브젝트 상태에 영향을 받지 않는 스크립트를 작성해보았다.


using UnityEngine;
using System.Collections;

public class CoroutineManager : MonoBehaviour
{
    // Instance
    private static CoroutineManager _instance;
    public static CoroutineManager Instance
    {
        get
        {
            if (_instance == null)
            {
                GameObject go = new GameObject("CoroutineManager");
                _instance = go.AddComponent<CoroutineManager>();
                go.hideFlags = HideFlags.HideAndDontSave;
                DontDestroyOnLoad(go);
            }
            return _instance;
        }
    }

    //_____________________________________________________ Coroutine
    public static Coroutine StartRoutine(IEnumerator enumerator)
    {
        return Instance.StartCoroutine(enumerator);
    }
    public static void StopRoutine(Coroutine coroutine)
    {
        if (coroutine != null)
            Instance.StopCoroutine(coroutine);
    }
}

Instance의 get 접근자 안에서 오브젝트를 생성하도록 하여,
실제로 코루틴이 필요한 시점에만 관리자 객체를 생성한다.

DontDestroyOnLoad로 지정되기에 씬이 바뀌어도 유지된다.

또한, Hierarchy에 굳이 표시되지 않아도 되므로 HideFlags를 사용해 숨겼다.


곧 비활성화될 오브젝트뿐 아니라, MonoBehaviour를 상속받지 않은

일반 클래스에서도 코루틴을 돌릴 수 있을 것이다.

반응형

댓글