posted by REDFORCE 2018. 12. 20. 02:56

#02.JobRepeatManager - 01

#02.JobRepeatManager - 02


이번 글은 마지막으로 JobRepeatManager 에 대한 간단한 구조 설명과

사용 예제로 마무리 하겠습니다.


다소 글이 길어질 수 있습니다. 만약 액기스만 뽑아먹을래! 하는 분은 샘플예제만 보셔도 됩니다.

해서...샘플 예제를 먼저 적어두겠습니다.



----------------------------------------


2. JobRepeatManager


JobRepeatManager 는 Singleton Pattern으로 인스턴스가 생성 됩니다.


싱글톤 패턴으로 생성 되어있는 인스턴스 이므로 만약 JobRepeatManager를 사용하실 분들은 간단히 static으로 인스턴스를 넣어주세요.


JobRepeatManager에는 다음과 같은 Public 함수와 멤버변수가 있습니다.


 멤버변수 및 애트리뷰트

 설명

 public List<JobRepeatBase> JobList


 get; _jobList


 public float MinDelayTime


 get;set; => m_MinDelayTime 



 메소드 이름

 설명 


 public bool AddDelegateJob(string key, 

 JobTodo toDo, 

 float delay = 1.0f,

 int repeatCount = 0,

 object[] parameter = null,             JobEndAction endActionWhenDrop = null,

 JobToDoCondition toDoCondition = null, 

 JobAutoDropCondition autoDropCondition = null, 

 bool isImmediately = true)


 - JobRepeatBase를 생성 및 등록하는 함수

 - 일반적인 Delegate 형태의 Job을 등록할 수 있습니다.


 public AddCoroutineJob (string key, 

 IEnumerator coroutineJobTodo, 

 float delay = 1.0f, 

 int repeatCount = 0,

 object[] param = null,

 JobToDoCondition toDoCondition = null, 

 JobAutoDropCondition autoDropCondition = null,

 bool isImmediately = true)


 - JobRepeatBase를 생성 및 등록하는 함수

 - Coroutine 형태의 Job을 생성합니다.

 - Todo를 추가로 Job에 등록하고 싶으실 땐 AddFunctionChain을 호출하여 사용합니다. 

 public bool JobStart (string key)


 - 특정 등록되어진 Job을 key 값으로 찾아서 Job을 Execute 시킵니다.

 - 정상적인 실행이 성공되면 true를 리턴합니다. 실패 시 return false


 public bool RemoveJob(string key)


 - 특정 등록되어진 Job을 Key 값으로 찾아서 드랍(Drop)시킵니다. 정상적으로 드랍에 성공할 시 true를 리턴합니다.


 public int JobDropAll ( )


 - 등록되어진 모든 Job을 Drop 시킵니다.

 - 드랍시킨 Job 갯수를 리턴합니다.


 public bool ChangeJobDelay (string key, float newDelay)


 - 특정 등록되어진 Job을 Key 값으로 찾은 뒤 해당 Job의 DelayTime을 변경합니다.

 - 만약 수행중(Job Started)인 Job 이었다면 다음 수행부터 Delay가 변경됩니다.

 - 변경에 선공하면 true 를 리턴합니다.


 public bool ChangeJobRepeatCount (string key, int repeatCount)


 - 특정 등록되어진 Job을 Key 값으로 찾은 뒤 해당 Job의 RepeatCount를 변경합니다.

 - 만약 수행중(Job Started)인 Job 이었다면 다음 수행부터 RepeatCount가 변경됩니다.

 - 변경에 성공하면 true를 리턴합니다.



 public bool AddFunctionChain(string key,

 JobTodo todo = null, 

 JobTodoCondition TodoCheck = null,

 JobAutoDropCondition autodropCondition = null, bool isExecuteImmediately = true)


 - key값으로 찾은 Job에 등록되어진 Delegate를 추가로 등록하는 함수입니다.


 public bool RemoveFunctionChain(string key, JobTodo todo = null,   JobTodoCondition todoCheck = null,

 JobAutoDropCondition autodropCondition = null, bool isExecuteImmediately = true)


 -Key 값으로 찾은 Job에 등록되어진 Delegate를 삭제하는 함수입니다.

 public JobRepeatBase GetJobBase(string key)

 - Key 값으로 JobRepeatBase 정보를 찾는 함수입니다.

 private IEnumerator CoAutoDropWorkers()


 - Drop 상태가 된 Job을 삭제시키는 Coroutine 입니다.

 - JobRepeatManager 의 instance가 Start 될 때 실행 됩니다.

 - Drop 상태 체크는 

private WaitForSeconds dropManagingDelay 마다 수행됩니다.

 

 private IEnumerator CoJobHandle(string key)


 - JobRepeatManager에 등록되어진 Job들을 동작시키는 Corotuine 입니다.

 - JobRepeatBase에 담겨져있는 Job.state 값에 따라 Job을 동작시킵니다.



-------------------------------



'Unity Engine > Unity3D Engine' 카테고리의 다른 글

#04.C# Job System_01  (0) 2018.12.22
#03.JobSequenceManager  (0) 2018.12.21
#02.JobRepeatManager - 02  (0) 2018.12.20
#02.JobRepeatManager - 01  (0) 2018.12.19
#01.A에서 B로 일정 시간동안 움직이기  (0) 2018.12.18
posted by REDFORCE 2018. 12. 20. 02:25

#02.JobRepeatManager - 01


-----------------------------
01번 글에 이어서 적어갑니다.

여기서는 먼저 JobRepeatManager에서 Base 오브젝트 역할을 담당하는 JobRepeatBase에 대해서 설명하겠습니다.


1. class JobRepeatBase

JobRepeatBase는 Monobehaviour를 상속한 GameObject 로써 JobRepeatManager에서 생성 및 관리 되어지는 클래스 입니다.


JobRepeatBase 는 다음과 같은 멤버변수를 갖고 있습니다.

 형태 및 이름

 설명

 public string key


 - Job이 생성 될 때 등록되어질 이름(Key) 값 입니다.

 - GameObject로 생성 될 때의 name과 동일합니다.


 public float repeatDelay


 - 반복 형태의  Job일 경우 Delay Time(Second)입니다. 


 public int repeatCount


 - 반복 형태의 Job 일 경우 반복할 횟수 입니다.

 - 이 값이 0 이면 무한 반복합니다.


 public int executeCount


 - 현재 까지 수행한 반복 횟수 값 입니다.

 - executeCount 가 repeatCount 보다 커지면 자동으로 Job이 드랍됩니다. (repeatCount 가 0 이면 무한 반복합니다)


 public IEnumerator jobCoroutine


 - Job을 수행함에 있어 Delegate 형태뿐만 아니라 Coroutine으로 돌리고 싶은 경우 이용할 수 있는 IEneumerator 입니다.

 - JobTodo 보다 우선시되어 수행됩니다.

 

 - 아직 연구중인 Coroutine 구조 입니다.
  (사용하지 않기를 추천)

 

 

 public JobTodo


 - 원형)
 public delegate void JobTodo ( params object[] param)


 - 수행할 내용이 들어갈 수 있는 Todo delegate입니다.

 - Job을 반복적으로 수행할 때의 수행시킬 내용을 여기에 넣으면 됩니다.


 public JobEndAction


 - 원형)

 public delegate void JobEndAction( params object[] param)


 - 모든 반복횟수를 마무리 한 후 Job이 Drop되기 직전 호출되는 JobEndAction Delegate 입니다.

 - Drop 되기전 한 번 호출됩니다.

 - null 일 경우 아무것도 하지 않습니다.


 public JobTodoCondition


 - 원형)

 public delegate bool JobTodoCondition( params object[] param)


 - 반복 수행함에 있어 JobTodo를 실행하기 전 수행(Execute)할 것인지 말 것인지 조건을 넣기 위한 Delegate 입니다.

 - JobTodoCondition에서 return true 일 경우 JobTodo를 수행합니다. return false 이면 JobTodo를 호출하지 않습니다.

 - null 일 경우 무시됩니다.


 public JobAutoDropCondition

 - 원형)
 public delegate bool JobAutoDropCondition( params object[] param)


 -  Job이 반복 수행되어지다가 자동으로 중단되기 위한 조건을 넣을 수 있는 Delegate 입니다.

 - JobAutoDropCondition에서 return true 일 경우 Job이 드랍(Drop) 됩니다. return false 일 경우 무시합니다.

 - null 일 경우 무시됩니다.


 public JOB_STATE


 - 현재 Job의 상태를 표현하는 값 입니다.

 -  public enum JOB_STATE 

  > NONE : 초기화 용

  > JOB_EMPTY : Job이 없음

  > JOB_STANDBY : Job이 수행 대기중

  > JOB_WORKING : Job이 Todo를 수행중

  > JOB_WAITING : Job이 TodoCondition 으로 인해 대기중

  > JOB_DROP : Job이 Drop되어질 예정


 public IEnumerator worker


 -  worker는 실제 Job으로 등록된 일을 수행하는 Corotuine 개체 입니다.

 - 자동으로 JobRepeatManager를 통해 관리되어 지므로 건들지 않는게 좋습니다.

 public object[] parameter


 - Todo, EndAction, TodoCondition, AutoDropCondition Delegate의 param에 전달되어지는 Parameter 입니다.



위와 같이 조금 많은 멤버변수들과 Delegate들이 있는데 부담갖지마시고 사용 방법은 간단합니다~

JobRepeatBase가 어떻게 이용되어 지는지는 03번 글에서 이어서 적도록 하겠습니다.


'Unity Engine > Unity3D Engine' 카테고리의 다른 글

#04.C# Job System_01  (0) 2018.12.22
#03.JobSequenceManager  (0) 2018.12.21
#02.JobRepeatManager - 03  (0) 2018.12.20
#02.JobRepeatManager - 01  (0) 2018.12.19
#01.A에서 B로 일정 시간동안 움직이기  (0) 2018.12.18
posted by REDFORCE 2018. 12. 19. 01:45

#02.JobRepeatManager - 01


이번 글에 작성할 내용은 개인적으로 유니티를 사용하면서 이런 스크립트가 있으면 편할 것 같은데? 라는 생각에 만들어 본 스크립트이다.


그 이름은 Job Repeat Manager !!!!!!!!!!!


개인적으로 만들어놓고 그래서 요놈이 효율적일까? 괜찮은가? 안전한가? 

라는 질문을 수 차례했으나 답은...나도 모르겠당...ㅎㅎ


그래도 올려두면 누군가는 쓰지 않을까? 라는 생각에 피드백도 받아볼 겸 적는다.

-------------------------------


JobRepeatManager는 글쓴이가 심심해서 만들어 본 유틸리티 성향의(?) 스크립트 입니다.

처음에 만들게 된 이유는 다음의 예로 들어보겠습니다.


목적 : 어떤 함수의 내용을 반복적으로 수행하게 하고 싶다
 예) public void MyFunction() { ... } 을 50 번만 2.0초 간격으로 수행하고 싶다.


  + 그러나 public bool isExecute;  라는 변수가 true 일때만 하고 싶다.

  + 만약 public bool isDrop; 이라는 변수가 true 면은 중간에 멈추고 싶다.

  + Invoke나 Coroutine을 쓸 수는 없는 상황이다.

  + 수행되고 있는 펑션의 상태를 Visual로 보고싶다.


위와 같은 상황에서...이걸 어떻게 해결 해야할까...라는 고민중에

결국 다음과 같은 조건을 충족하도록 만들어본 유틸리티 코드입니다.


 조 건 

  1. Update() 를 쓰고 싶지는 않다.
  2. 어떤 내용(To do)을 n번 실행하게 하고 싶다.
  3. 수행되는 내용을 GameObject 로 관리하고 싶다.
  4. 람다(Lambda) 또는 Delegate를 이용한 Event 형태의 Job을 만들어서 관리하고 싶다.


결과적으로 만든 JobRepeatManager 는 아래의 2가지 클래스 파일로 구성 되어 있습니다.


본문에서는 Gist 코드만 남기고 설명은 다음글로 넘기겠습니다.


1) JobRepeatBase.cs



2) JobRepeatManager.cs




'Unity Engine > Unity3D Engine' 카테고리의 다른 글

#04.C# Job System_01  (0) 2018.12.22
#03.JobSequenceManager  (0) 2018.12.21
#02.JobRepeatManager - 03  (0) 2018.12.20
#02.JobRepeatManager - 02  (0) 2018.12.20
#01.A에서 B로 일정 시간동안 움직이기  (0) 2018.12.18