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)); } }
private void FindNearestDevice() { _device = TargetFindingMethods.FindNearestTarget <Device>(transform.position, 100f, int.MaxValue); if (_device == null) { Debug.LogWarning("device not found", this); } }
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)); } }