コード例 #1
0
        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));
        }
コード例 #2
0
        internal async UniTask <bool> Show(Vector3 screenPosition, CancellationToken token)
        {
            _radialMenu.Show(screenPosition);
            gameObject.SetActive(true);

            bool didConfirm;

            using (var confirmHandler = _confirmButton.GetAsyncClickEventHandler(token))
                using (var cancelHandler = _cancelButton.GetAsyncClickEventHandler(token)) {
                    var clickIndex = await UniTask.WhenAny(confirmHandler.OnClickAsync(), cancelHandler.OnClickAsync());

                    didConfirm = clickIndex == 0;
                }

            return(didConfirm);
        }
コード例 #3
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);
        }