예제 #1
0
        /// <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);
        }