반응형
유니티에서는 코루틴(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를 상속받지 않은
일반 클래스에서도 코루틴을 돌릴 수 있을 것이다.
반응형
'Unity > 기법' 카테고리의 다른 글
| [Unity] TrailRenderer로 역동적인 효과 만들기 (0) | 2026.03.10 |
|---|---|
| [Unity] 정교한 UI 클릭을 위한 커스텀 Image 구현 (0) | 2026.02.28 |
| [Unity] 프레임 깎아먹는 if문 대체하기: 쉐이더 그래프 Keyword 노드 사용법 (0) | 2026.02.22 |
| [Unity] 쉐이더 그래프 경로 변경하기 (0) | 2026.02.21 |
| [Unity] MeshLOD로 간편하게 LOD 적용하기 (0) | 2026.02.21 |
댓글