Ejemplo n.º 1
0
        // 수행 하자구
        public IEnumerator Perform()
        {
            yield return(null);                 // null exception 방지용

            // FSM은 꼭 있어야지...
            Assert.IsNotNull(fsmTask, "fsmTask is null");
            if (null == fsmTask)
            {
                yield break;
            }

            // 여기서 다시 넣는건 테스트 용이다... 그냥 Current 처리 해도 되는데 넣었다가 빼자..
            if (stacks.Count < 1)
            {
                DesireKey new_desire;
                // 순서 대로 해야 한다면...
                if (hasSequence && lstSequence.Count > 0)
                {
                    new_desire = lstSequence[0];
                    lstSequence.RemoveAt(0);
                }
                else
                {
                    new_desire = new DesireKey();
                }

                PushDesire(new_desire);
            }
            // 하고싶은걸 해야지
            Current = PopDesire();

            Assert.IsNotNull(Current, "current desire is null");
            if (null == Current)
            {
                this.IsDone = true;
                yield break;
            }

            // 자 작업 시작..
            Current.BeginPerform();

            // PerformTask 대기
            var jobTasks = Current.DoPerform(fsmTask).GetEnumerator();

            while (jobTasks.MoveNext())
            {
                yield return(jobTasks.Current);
            }

            // 여기 올때는 무조건 task는 End of Task 이다.
            // 작업수행후 결과에 대한 처리 해야지
            Current.EndPerform();


            // 나갈꺼란다..
            if (Current.state == DesireState.Quit)
            {
                this.IsDone = true;
            }

            // 뭔가 이유로 인해서 완료 못했나 보다... 선행 할것이 있다면 넣어주자.
            if (Current.preDesire.state != DesireState.None)
            {
                bool isTryable = false;
                // 이미 하고자 하는게 있으면 중복해서 넣으면 무한 루프에 빠질 수 있다.
                //if (!Exists(Current) && !Exists(new Desire(Current.preDesire)))
                isTryable = true;

                // 다시 넣을 수 있다.
                if (isTryable)
                {
                    // 다시 넣자..
                    Debug.Log("Push last desire : " + Current.state);
                    PushDesire(Current);
                    // 해결할 놈을 넣자...
                    Debug.Log("Push pre desire :" + Current.preDesire.state);
                    PushDesire(Current.preDesire);
                }
                else
                {
                    Debug.Log("isTryable fail" + Current.state);
                }
            }
            Current = null;
        }
Ejemplo n.º 2
0
 // 이게 충족이 안되서 못했어요...
 void SetPreDesire(DesireKey desireKey)
 {
     preDesire = desireKey;
 }
Ejemplo n.º 3
0
 // 뭐 하고 싶어요? 추가
 void PushDesire(DesireKey desireKey)
 {
     //stacks.Push(BotBuilder.BuildDesire(desireKey));
 }
Ejemplo n.º 4
0
 // constructor
 public TaskRun(DesireKey deKey)
 {
     state    = deKey.state;
     contents = deKey.contents;                  // 하던거 있으면 이것도 받아요...
 }