posted by REDFORCE 2018. 12. 21. 11:20

이번에 적을 글은 전편인 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을 수행시킵니다.
 - 모든 Job을 일괄 순차적으로 수행시킵니다.


 public void OnExecuteSequenceCoroutine()


 - 등록 된 Job을 Corotuine 형태로 수행시킵니다.

 - 모든 Job을 순차적으로 수행시킵니다.

 - JobSequenceManager의 CoExecuteJobSequence( )
에서 한 Job마다 수행이 끝날 때마다 yield return null 이 불려집니다.


 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