protected virtual void Update() { if (_endTurn) { _endTurn = false; BlockUI = true; StartCoroutine(FinishTurn()); } foreach (var livingEntity in Entities.OfType <LivingEntity>()) { if (_selectedEntity == null || livingEntity.Side == PlayerSide || BlockUI) { livingEntity.UI.EnableTargetMarker(false); livingEntity.UI.EnableBoardMarker(false); } else { var range = GridPosition.Distance(_selectedEntity.Position, livingEntity.Position); livingEntity.UI.EnableTargetMarker(_selectedEntity.CanAttack && range <= _selectedEntity.Weapon.Range); livingEntity.UI.EnableBoardMarker(_selectedEntity.CanBoard && range == 1); } } if (_selectedEntity != null && _selectedEntity.CanMove && !BlockUI) { var obstacles = new HashSet <GridPosition>(Entities .Where(entity => entity.IsObstacle(PlayerSide)) .Select(entity => entity.Position)); var entities = new HashSet <GridPosition>(Entities.Select(entity => entity.Position)); var destinations = _astar.GetDestinations(_selectedEntity.Position, obstacles, entities, _selectedEntity.MovementRange); var markers = new Queue <GameObject>(_destinationMarkers); _destinationMarkers.Clear(); foreach (var destination in destinations) { var marker = markers.Any() ? markers.Dequeue() : Instantiate(DestinationMarkerPrefab); if (marker != null) { marker.transform.position = GridPosition.ToVector3(destination); marker.transform.SetParent(transform); _destinationMarkers.Add(marker); } } while (markers.Any()) { Destroy(markers.Dequeue()); } } else { foreach (var destinationMarker in _destinationMarkers) { Destroy(destinationMarker); } } }