public EnemyProcesser(Enemy enemy, EnemyActionBehaviourData actionData)
        {
            _ManagerList = new List <IProcesserManager> ();

            for (int i = 0; i < actionData.EnemyActionData.Count(); i++)
            {
                var data    = actionData.EnemyActionData.ElementAt(i);
                var manager = new EnemyProcesserManager(enemy, actionData.EnemyActionData.Skip(i).Take(1).Select(_data => _data.ActionData));
                _ManagerList.Add(manager);
                if (data.LoopIndex.LoopCount != 0)
                {
                    if (data.LoopIndex.InfinitLoop)
                    {
                        var infManager = new InfiniteLoopManager(enemy, data.LoopIndex, actionData);
                        _ManagerList.Add(infManager);
                        break;
                    }
                    var repManager = new RepeatManager(enemy, data.LoopIndex, actionData);
                    _ManagerList.Add(repManager);
                    continue;
                }
            }
            _Manager = _ManagerList.GetEnumerator();
            _Manager.MoveNext();
            _OnComlete(enemy);
        }
 public InfiniteLoopManager(Enemy enemy, LoopIndex index, EnemyActionBehaviourData data)
 {
     _Enemy            = enemy;
     _CompleteObserver = new Subject <Unit> ();
     _Index            = index;
     _Data             = data;
     _Manager          = new RepeatManager(enemy, index, data);
     _OnComplete();
 }
            public RepeatManager(Enemy enemy, LoopIndex loopData, EnemyActionBehaviourData originData)
            {
                _CompleteObserver = new Subject <Unit> ();
                var container = new List <IProcesser> ();

                _SetUp(enemy, loopData, originData, container, 0);
                _Processers = container.GetEnumerator();
                _Processers.MoveNext();
                _OnComplete();
            }
            private void _PutOutError(Enemy enemy, LoopIndex index, EnemyActionBehaviourData data)
            {
                EnemyActionDataWithLoop putData = null;

                for (int i = 0; i < data.EnemyActionData.Count(); i++)
                {
                    putData = data.EnemyActionData.ElementAt(i);
                    if (putData.LoopIndex == index)
                    {
                        Debug.LogError(string.Format("無限ループに陥っていますデータを見直してください :  ObjectName → {0} : DataName → {1} : Index → {2}", enemy.name, putData.ActionData.name, i));
                        return;
                    }
                }
            }
            private void _SetUp(Enemy enemy, LoopIndex dataIndex, EnemyActionBehaviourData originData, List <IProcesser> container, int loopCount)
            {
                if (loopCount > 1000)
                {
                    _PutOutError(enemy, dataIndex, originData);
                    return;
                }
                for (int i = 0; i < dataIndex.LoopCount; i++)
                {
                    loopCount++;
                    if (loopCount > 1000)
                    {
                        _PutOutError(enemy, dataIndex, originData);
                        break;
                    }
                    var data = originData.EnemyActionData.Skip((int)dataIndex.LoopStartIndex)
                               .Take(1 + (int)(dataIndex.LoopEndIndex - dataIndex.LoopStartIndex));

                    container.Add(new EnemyActionProcesser(enemy, data.First().ActionData));

                    for (int y = 1; y < data.Count(); y++)
                    {
                        loopCount++;
                        if (loopCount > 1000)
                        {
                            _PutOutError(enemy, dataIndex, originData);
                            break;
                        }

                        var loopData = data.ElementAt(y);

                        container.Add(new EnemyActionProcesser(enemy, loopData.ActionData));
                        if (loopData.LoopIndex.LoopCount != 0)
                        {
                            _SetUp(enemy, loopData.LoopIndex, originData, container, loopCount);
                            continue;
                        }
                    }
                }
            }
 private void OnDestroy()
 {
     _Data = null;
 }