public UniTask Show(IUnit unit)
        {
            var unitCoords = _gridUnitManager.GetUnitCoords(unit);

            if (unitCoords == null)
            {
                var msg = $"Unit not in tile: {unit}";
                _logger.LogError(LoggedFeature.Units, msg);
                return(UniTask.FromException(new Exception(msg)));
            }

            // Acquire input lock.
            _lockToken = _inputLock.Lock();

            // Set selected unit and events
            _unit = unit;
            _moveUnitButton.onClick.AddListener(HandleMoveUnitButtonPressed);
            _removeUnitButton.onClick.AddListener(HandleRemoveUnitButtonPressed);
            _rotateUnitButton.onClick.AddListener(HandleRotateUnitPressed);
            _cancelButton.onClick.AddListener(HandleCancelButtonPressed);

            // Show radial menu
            var worldPosition = _gridPositionCalculator.GetTileCenterWorldPosition(unitCoords.Value);

            _menuScreenPositon = _camera.WorldToScreenPoint(worldPosition);
            return(_radialMenu.Show(_menuScreenPositon));
        }
        private void PreviewUnitMovement(IUnit unit, IntVector2 previewCoords)
        {
            // Move the unit in space, but do not actually execute a move command (since we are previewing)
            ITransformableUnit transformableUnit = _unitTransformRegistry.GetTransformableUnit(unit.UnitId);
            Vector3            worldPosition     = _gridPositionCalculator.GetTileCenterWorldPosition(previewCoords);

            transformableUnit.Transform.position =
                new Vector3(worldPosition.x, worldPosition.y, transformableUnit.Transform.position.z);
        }
Example #3
0
        public IGridCellHighlight Spawn(IntVector2 tileCoords, Color color)
        {
            var worldPosition = _gridPositionCalculator.GetTileCenterWorldPosition(tileCoords);
            var highlight     = _monoPool.Spawn(new Vector3(worldPosition.x,
                                                            worldPosition.y,
                                                            DepthConstants.CELL_HIGHLIGHT_DEPTH),
                                                color);

            _spawnedHighlights.Add(highlight);

            return(highlight);
        }
Example #4
0
        public async UniTask Show(IntVector2 tileCoords, IMapElement mapElement)
        {
            Vector3 screenPosition =
                _camera.WorldToScreenPoint(_gridPositionCalculator.GetTileCenterWorldPosition(tileCoords));

            _radialMenu.Show(screenPosition);

            var result = await _removeButton.ToButtonCancellableTask(_cancelButton);

            if (!result.isCanceled)
            {
                mapElement.Remove();
            }

            await _radialMenu.Hide();
        }
        /// <summary>
        /// Shows the batch selection UI and highlights the selected units.
        /// Returns a task that is completed once the UI has closed or the batch action is complete.
        /// </summary>
        /// <param name="units"></param>
        /// <returns></returns>
        public async UniTask ShowAndWaitForAction(IUnit[] units)
        {
            // Show the menu
            var unitCoords = _gridUnitManager.GetUnitCoords(units[0]);

            if (unitCoords == null)
            {
                var msg = $"Unit not in tile: {units[0]}";
                _logger.LogError(LoggedFeature.Units, msg);
                throw new Exception(msg);
            }

            _selectedUnits = units;
            var worldPosition = _gridPositionCalculator.GetTileCenterWorldPosition(unitCoords.Value);

            _radialMenu.Show(_camera.WorldToScreenPoint(worldPosition));

            // Add listeners
            _removeUnitButton.onClick.AddListener(HandleRemoveUnitPressed);
            _rotateUnitButton.onClick.AddListener(HandleRotateUnitPressed);
            _cancelSelectionButton.onClick.AddListener(HandleCancelSelectionPressed);

            // Highlights
            _unitSelectionHighlighter.HighlightUnits(units);

            // Mouse Up / Down streams
            var mouseUpStream = Observable.EveryUpdate()
                                .Where(_ => Input.GetMouseButtonUp(0));
            var mouseDownStream = Observable.EveryUpdate()
                                  .Where(_ => Input.GetMouseButtonDown(0))
                                  .Where(_ => _gridUnitInputManager.UnitsAtMousePosition.Length > 0)
                                  .Where(_ => units.Intersect(_gridUnitInputManager.UnitsAtMousePosition).Any())
                                  .First();

            _observer = mouseDownStream.Select(_ => mouseUpStream).Subscribe(_ => {
                HandleUnitMouseDown(units);
            });

            await UniTask.WaitUntil(() => _selectedUnits == null);
        }
        public bool PlaceUnitAtTile(IUnit unit, IntVector2 tileCoords)
        {
            // Remove previous unit position if present
            if (_unitMap.ContainsKey(unit.UnitId))
            {
                RemoveUnit(unit);
            }

            // Add unit to new position.
            _tiles[tileCoords.x, tileCoords.y].Add(unit);
            int tileIndex = (int)(System.Math.Max(0, tileCoords.y) * _grid.NumTilesX + tileCoords.x);

            _unitMap.Add(unit.UnitId, tileIndex);

            // Move unit in 3D space.
            Transform unitTransform = _unitTransformRegistry.GetTransformableUnit(unit.UnitId).Transform;
            Vector2   worldPosition = _gridPositionCalculator.GetTileCenterWorldPosition(tileCoords);

            unitTransform.position = new Vector3(worldPosition.x, worldPosition.y, DepthConstants.UNIT_DEPTH);

            // Notify listeners
            UnitPlacedAtTile.Invoke(unit, tileCoords);
            return(true);
        }