/// <summary> /// 选择一个攻击目标 /// </summary> /// <param name="self">自己</param> /// <param name="canAttack">是否考虑必须可以攻击到</param> /// <returns></returns> public FightUnit SelectFightTarget(FightUnit self, bool canAttack) { if (self == null || self.IsDead) { EDebug.LogError("FightLogic.SelectFightTarget failed, fightunit is null or dead"); return(null); } int selIdx = -1; float dis = float.MaxValue; //先循环一遍看看有没有可以攻击的对象,如果没有,则不考虑是否无敌 int targetsCanBeAttackCnt = 0; for (int idx = 0; idx < AllFighters.Count; ++idx) { FightUnit unit = AllFighters[idx]; if (!unit.CanBeAttack(self, false, true, true)) { continue; } targetsCanBeAttackCnt++; } for (int idx = 0; idx < AllFighters.Count; ++idx) { FightUnit unit = AllFighters[idx]; if (!unit.CanBeAttack(self, 0 == targetsCanBeAttackCnt, !canAttack, false)) { continue; } //计算距离 float gridDis = PathFinder.GridDis(self.GridPos, unit.GridPos); if (gridDis < dis) { selIdx = idx; dis = gridDis; } } return((selIdx >= 0) ? AllFighters[selIdx] : null); }