using System.Collections;
using UnityEngine;
public class CoroutineManager : MonoBehaviour
{
public static CoroutineManager instance = null;
public static CoroutineManager Instance
{
get
{
if (instance == null)
instance = new GameObject("CoroutineManager").AddComponent<CoroutineManager>();
return instance;
}
}
//MonoBehaviour가 없는 스크립트의 IEnumerator 실행시키기 위한 메소드
public void RunCoroutine(IEnumerator method)
{
if (method != null)
StartCoroutine(method);
}
//여러 IEnumerator를 순차 시작하는 메소드. 코드를 간결하게 하기 위한 메소드
public void StartSyncCoroutines(IEnumerator[] methodArr)
{
StartCoroutine(OperateSync(methodArr));
}
IEnumerator OperateSync(IEnumerator[] methodArr)
{
for (int i = 0; i < methodArr.Length; i++)
{
if (methodArr[i] == null) continue;
yield return StartCoroutine(methodArr[i]);
}
}
}
활용 예시
using System.Collections;
using UnityEngine;
using Debug = UnityEngine.Debug;
public class TestScripts : MonoBehaviour
{
CoroutineManager manager;
void Start()
{
manager = CoroutineManager.Instance;
//모노비헤비어를 상속받지 않는 클래스의 열거자 실행
TestNoMono test = new TestNoMono();
manager.RunCoroutine(test.Test());
//코루틴 동기 실행
IEnumerator[] enumerators = new IEnumerator[] { Test1(), Test2(), Test3() };
manager.StartSyncCoroutines(enumerators);
}
IEnumerator Test1()
{
yield return new WaitForSeconds(1f);
Debug.Log("Test1");
}
IEnumerator Test2()
{
yield return new WaitForSeconds(3f);
Debug.Log("Test2");
}
IEnumerator Test3()
{
yield return new WaitForSeconds(5f);
Debug.Log("Test3");
}
}
public class TestNoMono
{
public IEnumerator Test()
{
Debug.Log("Test");
yield return null;
}
}
'유니티(Unity)' 카테고리의 다른 글
3D 애니메이션 문제 및 해결법 (0) | 2024.08.04 |
---|---|
Webgl 로컬에서 실행시키기(Express) (0) | 2024.05.12 |
vscode와 유니티에서 async 스레드 테스트 (0) | 2024.05.01 |
자바스크립트 Dll 사용하기 (0) | 2024.04.30 |
Unity 텍스처 압축 시 주의 할 점. (0) | 2024.04.14 |