/// <summary>공격 대상이 될만한 가장 가까운 타워 대상을 찾을때 리턴해준다</summary> /// <param name="_Enemy">공격자 배틀 오브젝트</param> public BattleObject FindNearEnemyObject(BattleObject _Enemy) { if (LiveBattleObjects.Count == 0) { return(null); } BattleObject target = null; List <BattleObject> list = new List <BattleObject>(); switch (_Enemy.BaseAbility.AttackTarget) { //case AttackType.GroundUnit: //case AttackType.SkyUnit: //case AttackType.EveryThing: // break; case AttackType.DefenseTower: list = LiveBattleObjects.FindAll(r => r.BaseAbility.type == UnitType.DefenseTower); break; default: //공격자가 방어타워라면 적군중 유닛 데이터만 가지고 옵니다. if (_Enemy.IsDefenseTower()) { List <BattleObject> UnitList = LiveBattleObjects.FindAll(r => r.IsUnit() && (r.IsUnitDead == false)); foreach (var item in UnitList) { //타워이므로 사정거리 내에 들어온 유닛만 공격 대상 리스트에 담는다 if (GetDistance(_Enemy, item) <= _Enemy.BaseAbility.AttackRange) { //Debug.LogError("사정거리 내에 들어온 유닛만 리스트에 담는다 " + item.GetBattleObjectName()); list.Add(item); } } } else { list.AddRange(LiveBattleObjects); } break; } if (list.Count == 0) { return(null); } #region 타겟 가능 대상 중 가장 가까운 적을 찾는다 //첫번째 배열의 배틀 오브젝트를 1차 타겟으로 잡는다 target = list[0]; //타겟과의 거리를 구해보자 float distance_CurrentTarget = GetDistance(target, _Enemy); //공격 가능 대상들과의 거리를 모두 체크하여 가장 가까운 적으로 타겟을 잡는다 foreach (var item in list) { if (target == item) { continue; } //다른 타워와의 거리를 구해서 현재 타겟의 거리보다 가깝다면 타겟 교체 float _Comparedistance = GetDistance(item, _Enemy); if (distance_CurrentTarget > _Comparedistance) { distance_CurrentTarget = _Comparedistance; target = item; } } #endregion 타겟 가능 대상 중 가장 가까운 적을 찾는다 return(target); }