IEnumerator UpdateTargetPosition()
 {
     while (true)
     {
         if (_canUpdateTargetPositionAndPath)
         {
             if (TargetIsExist())
             {
                 bool isPathPossible;
                 _targetPositionPair = TargetFindingMethods.GetNearestTargetPositionToSeeker(_performer.transform.position, _taskData.Target, out isPathPossible);
                 if (!isPathPossible)
                 {
                     CompleteTask();
                     yield break;
                 }
             }
             else
             {
                 CompleteTask();
                 yield break;
             }
         }
         yield return(new WaitForSeconds(_performer.TargetFindingInterval));
     }
 }
    IEnumerator UpdateTarget()
    {
        while (true)
        {
            if (_canUpdateTargetAndPath)
            {
                Transform prevTarget = _target;
                _target = TargetFindingMethods.FindNearestTarget(_performer.transform.position, _performer.VisionDistance, _performer.EnemyLayerMask, out _targetPositionPair);

                if (TargetIsExist()) //если есть цель
                {
                    PauseParallelTask();
                    _performer.State = UnitState.HasTargetInDefaultTask;

                    if (_target != prevTarget) //если цель изменилась, то очищаем переменную пути. На тот случай, если путь не успел обновиться и юниты не бежали по старому пути
                    {
                        _path = null;
                    }
                }
                else //если цели нет
                {
                    _performer.UnitAnimation.State = UnitAnimation.States.Idle;

                    if (_performer.State != UnitState.CommandPerforming)
                    {
                        _performer.State = UnitState.Free;
                    }

                    StartParallelTask();
                }
            }
            yield return(new WaitForSeconds(_performer.TargetFindingInterval));
        }
    }
예제 #3
0
 private void FindNearestDevice()
 {
     _device = TargetFindingMethods.FindNearestTarget <Device>(transform.position, 100f, int.MaxValue);
     if (_device == null)
     {
         Debug.LogWarning("device not found", this);
     }
 }
예제 #4
0
 IEnumerator UpdateTarget()
 {
     while (true)
     {
         if (_canSearchTarget)
         {
             _target = TargetFindingMethods.FindNearestTarget(transform.position, _attackDistance, EnemyLayerMask);
         }
         yield return(new WaitForSeconds(_searchTargetInterval));
     }
 }
    public override void StartTask()
    {
        if (_performer == null)
        {
            Debug.LogError("Performer is not added");
        }
        if (_taskData == null)
        {
            Debug.LogError("TaskData is not added");
        }
        if (!TargetIsExist())
        {
            CompleteTask();
            return;
        }

        if (!IsActive)
        {
            if (!_performer.gameObject.IsDied())
            {
                //—брос всех вычисл¤емых параметров
                ClearTemporaryVariables();

                enabled  = true;
                IsActive = true;

                if (_taskData.Target.IsUnit()) //если цель - подвижный объект, то запускаем корутину дл¤ отслеживани¤ его позиции
                {
                    StartCoroutine(func_UpdateTargetPosition);
                }
                else //иначе ищем позицию только 1  раз
                {
                    bool isPathPossible;
                    _targetPositionPair = TargetFindingMethods.GetNearestTargetPositionToSeeker(_performer.transform.position, _taskData.Target, out isPathPossible);
                    if (!isPathPossible)
                    {
                        CompleteTask();
                        return;
                    }
                }

                StartCoroutine(func_UpdatePath);
            }
        }
    }
    IEnumerator SendToAttack()
    {
        while (true)
        {
            Transform commandCenter = null;
            foreach (Transform obj in _player.ObjectList)
            {
                if (obj.IsBuilding() && obj.name == "CommandCenter")
                {
                    commandCenter = obj;
                    break;
                }
            }

            if (commandCenter != null)
            {
                Transform target = TargetFindingMethods.FindNearestTargetForCompPlayerAI(commandCenter.transform.position, 1000, _player.EnemyMask);
                if (target != null)
                {
                    List <Transform>     receivers = new List <Transform>();
                    List <CommandButton> buttons   = new List <CommandButton>();
                    int attackerCount = 0;

                    //поиск кнопок определенного типа в объектах игрока
                    foreach (Transform obj in _player.ObjectList)
                    {
                        if (obj.IsUnit())
                        {
                            ObjectInfo objInfo = obj.GetComponent <ObjectInfo>();
                            if (objInfo != null && objInfo.ObjectAI != null)
                            {
                                var battleUnitAI = objInfo.ObjectAI as BattleUnitAI;
                                if (battleUnitAI != null && battleUnitAI.State == UnitState.Free)
                                {
                                    List <Type> buttonTypeList = CommandButtonTypeGetter.GetCommandButtonTypes(objInfo.CommandButtonInfoArray);

                                    if (buttonTypeList.Count == 0)
                                    {
                                        continue;
                                    }

                                    bool hasButtons = false;
                                    foreach (Type buttonType in buttonTypeList)
                                    {
                                        CommandButton cb = FindButtonOfType(_player.AvailableCommandButtons, buttonType, typeof(AttackTarget_Button));
                                        if (cb != null)
                                        {
                                            buttons.Add(cb);
                                            hasButtons = true;
                                            break;
                                        }
                                    }

                                    //если у объекта есть нужная кнопка, то добавляем его в список получателей команды
                                    if (hasButtons)
                                    {
                                        receivers.Add(obj);
                                        attackerCount++;
                                        if (attackerCount == MaxAttackersPerWave)
                                        {
                                            break;
                                        }
                                    }
                                }
                            }
                        }
                    }

                    //выполнения действия для каждой кнопки в списке
                    foreach (CommandButton cb in buttons)
                    {
                        (cb as AttackTarget_Button).SetTarget(target);
                        cb.OnCompPlayerClick(receivers);
                    }
                }
            }

            yield return(new WaitForSeconds(AttackWaveInterval));
        }
    }