コード例 #1
0
    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);
            }
        }
    }