Пример #1
0
 private void AddActionToHistory(Action action, bool finished)
 {
     if (_history.Count > 9)
     {
         _history.Dequeue();
     }
     _history.Enqueue(new Tuple<Action, bool>(action,finished));
     HistoryView.Clear();
     HistoryView.AddRange(_history);
 }
Пример #2
0
        /// <summary>
        /// Проверяем историю, на наличие в ней действий таких же, как запрашиваемая
        /// и считаем неудачные попытки
        /// </summary>
        /// <param name="action"></param>
        /// <returns></returns>
        private bool AnaliseHistory(Action action)
        {
            if(_history.Count == 0) return true;
            var count = 0;
            var previous = true;
            foreach (var tuple in _history)
            {
                if (tuple.First.GetType() == action.GetType())
                {
                    if (!tuple.Second && !previous)
                        count++;

                    previous = tuple.Second;
                }
            }

            return count <= MaxFailedActionsInHistory;
        }
Пример #3
0
        private void ChoseAction()
        {
            var actions = _agent.GetAvailableActions();
            Action subResult = null;
            var maxUtility = 0;
            foreach (var action in actions)
            {
                if(!AnaliseHistory(action))
                {
                    Debug.LogWarning("AnaliseHistory was detect to many failed " + action.Name + " actions in histiry.Skiping it");
                    continue;       //если проверка провалена, мы даже не рассматриваем сейчас этот экшн
                }

                var utility = action.CalculateUtility();
                if (utility > maxUtility)
                {
                    subResult = action;
                    maxUtility = utility;
                }
            }
            _currentAction = subResult;
        }
Пример #4
0
        private IEnumerator HandleActions()
        {
            while (true)
            {
                if (_currentAction == null)
                {
                    ChoseAction();
                    if (_currentAction != null)
                    {
                        _currentAction.Finished += b =>
                        {
                            if (_currentAction != null)
                            {
                                ActionFinished(_currentAction);
                                AddActionToHistory(_currentAction, b);
                                Debug.Log(_currentAction.Name + " Finished:"+b);
                            }
                            _currentAction = null;
                        };

                        //контроллируем, не зарстрял ли агент в Idle
                        if (_currentAction is StandIdleAction)
                            IdleCounter++;
                        else
                            IdleCounter = 0;

                        Debug.LogError("executing " + _currentAction.Name);
                        StartCoroutine(_currentAction.Execute());
                    }
                }
                yield return new WaitForSeconds(1f);
            }
        }