private static HostileUnitSearchResult SearchForNearest <T, TS>(GameActorsManager <T, TS> unitsManager, GameUnit attacker) where TS : GameActor { HostileUnitSearchResult result = new HostileUnitSearchResult { GameUnit = null, Distance = float.MaxValue }; foreach (var currentGameObject in unitsManager.GetRegistered().Where( u => u.ActorAttributes.Team != attacker.ActorAttributes.Team && u.LifeState == GameActor.UnitLifeState.LIVING) ) { float currentDistance = Vector3.Distance( attacker.Transform.localPosition, currentGameObject.Transform.localPosition ); if (currentDistance > result.Distance) { continue; } result.Distance = currentDistance; result.GameUnit = currentGameObject; } return(result); }
public GameActor GetNearestHostileUnit(GameUnit attacker) { HostileUnitSearchResult nearestHostileUnit = SearchForNearest(_unitsManager, attacker); HostileUnitSearchResult nearestHostileBuilding = SearchForNearest(_buildingsManager, attacker); if (nearestHostileUnit.Distance <= nearestHostileBuilding.Distance) { return(nearestHostileUnit.GameUnit); } else { return(nearestHostileBuilding.GameUnit); } }