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)); }
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); }
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); }