이번에 적을 글은 전편인 JobRepeatManager 에 이어서 JobSequenceManager 입니다.
(대체 얼마나 할일없으면 나 자신은 이런걸 만드는거니...코딩 덕후 같으니)
다음과 같은 이유나 상황일 때 사용하기 위해 만들었습니다.
> 순차적인 함수 호출이 필요하다
> 서로 다른 인스턴스에서의 함수 호출로 인해 순차적 호출 시점 제어가 너무 귀찮다.
> 각 함수들을 Coroutine 으로 순차적 실행을 하고 싶을 때가 있다.
그래서 만든 것이 JobSequenceManager 입니다.
using System.Collections; | |
using System.Collections.Generic; | |
using UnityEngine; | |
using System; | |
using System.Reflection; | |
namespace AT.JobManager | |
{ | |
public class JobSequenceManager : SingletonBase<JobSequenceManager> { | |
public Queue<Tuple<MethodInfo, object, object[]>> _sequenceJobs = new Queue<Tuple<MethodInfo, object, object[]>>(); | |
public void AddJob<T>(string methodName, params object[] parameter) | |
{ | |
Type type = typeof(T); | |
object instance = Activator.CreateInstance(type); | |
MethodInfo toInvoke = type.GetMethod(methodName); | |
ParameterInfo[] parameters = toInvoke.GetParameters(); | |
_sequenceJobs.Enqueue(new Tuple<MethodInfo, object, object[]>(toInvoke, instance, parameter)); | |
} | |
public void OnExecuteSequenceJob() | |
{ | |
while (_sequenceJobs.Count > 0) | |
{ | |
var job = _sequenceJobs.Dequeue(); | |
job.Item1.Invoke(job.Item2, job.Item3); | |
} | |
} | |
public void OnExecuteSequenceCoroutine() | |
{ | |
StopCoroutine(CoExecuteJobSequence()); | |
StartCoroutine(CoExecuteJobSequence()); | |
} | |
protected IEnumerator CoExecuteJobSequence() | |
{ | |
while (_sequenceJobs.Count > 0) | |
{ | |
var job = _sequenceJobs.Dequeue(); | |
job.Item1.Invoke(job.Item2, job.Item3); | |
yield return null; | |
} | |
yield return null; | |
} | |
} | |
} | |
JobSequenceManager는 다음과 같은 함수와 파라미터를 가지고 있습니다.
멤버 변수 |
설명 |
public Queue<Tuple<MethodInfo, object, object[]>> _sequenceJobs |
등록되는 Job을 담고 있는 컨테이너 입니다. |
메소드 | 설명 |
public void AddJob<T>(string methodName, params object[] parameter) | - 수행시킬 Job을 등록하는 함수입니다. - AddJob<T>에서 <T>에는 본인이 등록 시킬 클래스 타입을 넣어주세요. - methodName에는 Type T에 구현되어있는 함수 이름을 넣어주세요. - 해당 함수에 파라미터를 전달 하고 싶은게 있을 시엔 parameter에 전달하면 됩니다. |
public void OnExecuteSequenceJob() | - 등록 된 Job을 수행시킵니다. |
public void OnExecuteSequenceCoroutine() | - 등록 된 Job을 Corotuine 형태로 수행시킵니다. - 모든 Job을 순차적으로 수행시킵니다. - JobSequenceManager의 CoExecuteJobSequence( ) |
protected IEnumerator CoExecuteJobSequence() | - 등록 된 Job을 IEnumerator(Corotuine) 형태로 수행시키는 함수입니다.
|
사용 방법은 간단하게 아래 샘플로 적어두겠습니다.
using System.Collections; | |
using System.Collections.Generic; | |
using UnityEngine; | |
public class JobSequenceTest : MonoBehaviour { | |
void Start () { | |
Invoke("RegistJobA", 2.0f); | |
Invoke("ExecuteJob", 5.0f); | |
} | |
public void RegistJobA() | |
{ | |
AT.JobManager.JobSequenceManager.Instance.AddJob<JobSequenceTest>("OnExecuteFunctionA"); | |
AT.JobManager.JobSequenceManager.Instance.AddJob<JobSequenceTest>("OnExecuteFunctionB", 100, 43.123f); | |
} | |
public void ExecuteJob() | |
{ | |
AT.JobManager.JobSequenceManager.Instance.OnExecuteSequenceJob(); // use case 1 - execute at the Sametime | |
//AT.JobManager.JobSequenceManager.Instance.OnExecuteSequenceCoroutine(); // use case 2 - coroutine - ( loop ) { Job Execute(); yield return null; } | |
} | |
public void OnExecuteFunctionA() | |
{ | |
Debug.Log("Execute OnExecuteFunctionA"); | |
} | |
public void OnExecuteFunctionB(int count, float point) | |
{ | |
Debug.LogFormat("Execute OnExecuteFunctionB : {0}, {1}", count, point); | |
} | |
} |
'Unity Engine > Unity3D Engine' 카테고리의 다른 글
#04.C# Job System_02 (0) | 2018.12.23 |
---|---|
#04.C# Job System_01 (0) | 2018.12.22 |
#02.JobRepeatManager - 03 (0) | 2018.12.20 |
#02.JobRepeatManager - 02 (0) | 2018.12.20 |
#02.JobRepeatManager - 01 (0) | 2018.12.19 |