/// <summary> /// Select towers or position ghosts /// </summary> void OnTap(PointerActionInfo pointer) { // We only respond to mouse info var mouseInfo = pointer as MouseButtonInfo; if (mouseInfo != null && !mouseInfo.startedOverUI) { if (m_GameUI.isBuilding) { if (mouseInfo.mouseButtonId == 0) // LMB confirms { m_GameUI.TryPlaceTower(pointer); } else // RMB cancels { m_GameUI.CancelGhostPlacement(); } } else { if (mouseInfo.mouseButtonId == 0) { // select towers m_GameUI.TrySelectTower(pointer); } } } }
/// <summary> /// Called on tap, /// calls confirmation of tower placement /// </summary> protected virtual void OnTap(PointerActionInfo pointerActionInfo) { var touchInfo = pointerActionInfo as TouchInfo; if (touchInfo != null) { if (m_GameUI.state == State.Normal && !touchInfo.startedOverUI) { m_GameUI.TrySelectTower(touchInfo); } else if (m_GameUI.state == State.Building && !touchInfo.startedOverUI) { Debug.Log("OnTap"); m_GameUI.TryMoveGhost(touchInfo, false); if (m_GameUI.IsGhostAtValidPosition() && m_GameUI.IsValidPurchase()) { confirmationButtons.canvasEnabled = true; invalidButtons.canvasEnabled = false; confirmationButtons.TryMove(touchInfo.currentPosition); } else { invalidButtons.canvasEnabled = true; invalidButtons.TryMove(touchInfo.currentPosition); confirmationButtons.canvasEnabled = false; } } } }
/// <summary> /// Do flicks, on release only /// </summary> /// <param name="pointer">The release pointer event</param> protected void DoReleaseFlick(PointerActionInfo pointer) { var touchInfo = pointer as TouchInfo; if (touchInfo != null && touchInfo.flickVelocity.sqrMagnitude > Mathf.Epsilon) { // We have a flick! // Work out velocity from motion Ray prevRay = cameraRig.cachedCamera.ScreenPointToRay(pointer.currentPosition - pointer.flickVelocity); Ray currRay = cameraRig.cachedCamera.ScreenPointToRay(pointer.currentPosition); Vector3 startPoint = Vector3.zero; Vector3 endPoint = Vector3.zero; float dist; if (cameraRig.floorPlane.Raycast(prevRay, out dist)) { startPoint = prevRay.GetPoint(dist); } if (cameraRig.floorPlane.Raycast(currRay, out dist)) { endPoint = currRay.GetPoint(dist); } // Work out that movement in units per second m_FlickDirection = (startPoint - endPoint) / Time.deltaTime; } }
/// <summary> /// Called when we drag /// </summary> protected virtual void OnDrag(PointerActionInfo pointer) { if (cameraRig != null) { DoRightMouseDragPan(pointer); } }
/// <summary> /// Called on input press, for MMB panning /// </summary> protected virtual void OnPress(PointerActionInfo pointer) { if (cameraRig != null) { DoMiddleMousePan(pointer); } }
/// <summary> /// Called on input release /// </summary> protected virtual void OnRelease(PointerActionInfo pointer) { if (cameraRig != null) { DoReleaseFlick(pointer); } }
/// <summary> /// Controls the pan with a drag /// </summary> protected void DoDragPan(PointerActionInfo pointer) { var touchInfo = pointer as TouchInfo; if (touchInfo != null) { // Work out movement amount by raycasting onto floor plane from delta positions // and getting that distance Ray currRay = cameraRig.cachedCamera.ScreenPointToRay(touchInfo.currentPosition); Vector3 endPoint = Vector3.zero; float dist; if (cameraRig.floorPlane.Raycast(currRay, out dist)) { endPoint = currRay.GetPoint(dist); } // Pan Ray prevRay = cameraRig.cachedCamera.ScreenPointToRay(touchInfo.previousPosition); Vector3 startPoint = Vector3.zero; if (cameraRig.floorPlane.Raycast(prevRay, out dist)) { startPoint = prevRay.GetPoint(dist); } Vector3 panAmount = startPoint - endPoint; // If this is a touch, we divide the pan amount by the number of touches if (UnityInput.touchCount > 0) { panAmount /= UnityInput.touchCount; } PanCamera(panAmount); } }
/// <summary> /// Called on input press /// </summary> protected virtual void OnPress(PointerActionInfo pointer) { if (cameraRig != null) { DoFlickCatch(pointer); } }
/// <summary> /// Select towers or position ghosts /// </summary> void OnTap(PointerActionInfo pointer) { // We only respond to gesture info var gestureInfo = pointer as GestureInfo; if (gestureInfo != null && !gestureInfo.startedOverUI) { if (m_GameUI.isBuilding) { if (gestureInfo.gestureId == 0) // Tap confirms { m_GameUI.TryPlaceTower(pointer); } else // H??? cancels { m_GameUI.CancelGhostPlacement(); } } else { if (gestureInfo.gestureId == 0) { // select towers m_GameUI.TrySelectTower(pointer); } } } }
/// <summary> /// Select towers or position ghosts /// </summary> void OnTap(PointerActionInfo pointer) { // We only respond to mouse info var mouseInfo = pointer as MouseButtonInfo; if (mouseInfo != null && !mouseInfo.startedOverUI) { XEventBus.Instance.Post(EventId.UserClick); if (gameUIManager.isBuilding) { if (mouseInfo.mouseButtonId == 0) { //放置 gameUIManager.TryPlaceTarget(mouseInfo); } else // RMB cancels { //取消动作 gameUIManager.CancelGhostPlacement(); } } else { if (mouseInfo.mouseButtonId == 0) // LMB confirms { //尝试选择 gameUIManager.TrySelectTarget(mouseInfo); } } } }
/// <summary> /// Called when we drag /// </summary> protected virtual void OnDrag(PointerActionInfo pointer) { // Drag panning for touch input if (cameraRig != null) { DoDragPan(pointer); } }
/// <summary> /// Called on tap, /// calls confirmation of tower placement /// </summary> protected virtual void OnTap(PointerActionInfo pointerActionInfo) { var touchInfo = pointerActionInfo as TouchInfo; if (touchInfo != null) { } }
/// <summary> /// Assigns the drag pointer and sets the UI into drag mode /// </summary> /// <param name="pointer"></param> protected virtual void OnStartDrag(PointerActionInfo pointer) { var touchInfo = pointer as TouchInfo; if (touchInfo != null) { } }
/// <summary> /// Update a TouchInfo with movement /// </summary> /// <param name="touch">The Unity touch object</param> /// <param name="existingTouch">The object that's tracking Unity's touch</param> void UpdateMovingFinger(Touch touch, PointerActionInfo existingTouch) { float dragDist = touch.deltaPosition.magnitude; existingTouch.previousPosition = existingTouch.currentPosition; existingTouch.currentPosition = touch.position; existingTouch.delta = touch.deltaPosition; existingTouch.totalMovement += dragDist; }
/// <summary> /// Select towers or position ghosts /// </summary> void OnTap(PointerActionInfo pointer) { // We only respond to mouse info var mouseInfo = pointer as MouseButtonInfo; if (mouseInfo != null && !mouseInfo.startedOverUI) { } }
/// <summary> /// Called on input release, for flicks /// </summary> protected override void OnRelease(PointerActionInfo pointer) { // Override normal behaviour. We only want to do flicks if there's no ghost selected // For this reason, we intentionally do not call base var touchInfo = pointer as TouchInfo; if (touchInfo != null) { } }
/// <summary> /// Called on input press /// </summary> protected override void OnPress(PointerActionInfo pointer) { base.OnPress(pointer); var touchInfo = pointer as TouchInfo; // Press starts on a ghost? Then we can pick it up if (touchInfo != null) { } }
/// <summary> /// "Catch" flicks on press, to stop the panning momentum /// </summary> /// <param name="pointer">The press pointer event</param> protected void DoFlickCatch(PointerActionInfo pointer) { var touchInfo = pointer as TouchInfo; // Stop flicks on touch if (touchInfo != null) { m_FlickDirection = Vector2.zero; cameraRig.StopTracking(); } }
/// <summary> /// Called when we drag /// </summary> protected override void OnDrag(PointerActionInfo pointer) { // Override normal behaviour. We only want to pan if there's no ghost selected // For this reason, we intentionally do not call base var touchInfo = pointer as TouchInfo; if (touchInfo != null) { // Try to pick up the tower if it was dragged off } }
/// <summary> /// Assigns the drag pointer and sets the UI into drag mode /// </summary> /// <param name="pointer"></param> protected virtual void OnStartDrag(PointerActionInfo pointer) { var touchInfo = pointer as TouchInfo; if (touchInfo != null) { if (m_IsGhostSelected) { m_GameUI.ChangeToDragMode(); m_DragPointer = touchInfo; } } }
/// <summary> /// Called on tap, /// calls confirmation of tower placement /// </summary> protected virtual void OnTap(PointerActionInfo pointer) { XEventBus.Instance.Post(EventId.UserClick); var touchInfo = pointer as TouchInfo; if (touchInfo != null && !touchInfo.startedOverUI) { if (!gameUIManager.isBuilding) { gameUIManager.TrySelectTarget(touchInfo); } } }
protected override void OnDrag(PointerActionInfo pointer) { base.OnDrag(pointer); var touchInfo = pointer as TouchInfo; if (touchInfo != null && !touchInfo.startedOverUI) { if (gameUIManager.isBuilding) { gameUIManager.TryMoveGhost(touchInfo); } } }
protected override void OnRelease(PointerActionInfo pointer) { base.OnRelease(pointer); var touchInfo = pointer as TouchInfo; if (touchInfo != null && !touchInfo.startedOverUI) { if (gameUIManager.isBuilding) { gameUIManager.CancelGhostPlacement(); } } }
/// <summary> /// Update a TouchInfo that might be holding /// </summary> /// <param name="existingTouch"></param> void UpdateHoldingFinger(PointerActionInfo existingTouch) { if (!existingTouch.isHold && !existingTouch.isDrag && Time.realtimeSinceStartup - existingTouch.startTime >= holdTime) { existingTouch.isHold = true; if (startedHold != null) { startedHold(existingTouch); } } }
/// <summary> /// Called on input press /// </summary> protected override void OnPress(PointerActionInfo pointer) { base.OnPress(pointer); var touchInfo = pointer as TouchInfo; // Press starts on a ghost? Then we can pick it up if (touchInfo != null) { if (m_GameUI.state == State.Building) { m_IsGhostSelected = m_GameUI.IsPointerOverGhost(pointer); if (m_IsGhostSelected) { m_DragPointer = touchInfo; } } } }
/// <summary> /// Called on input release, for flicks /// </summary> protected override void OnRelease(PointerActionInfo pointer) { // Override normal behaviour. We only want to do flicks if there's no ghost selected // For this reason, we intentionally do not call base var touchInfo = pointer as TouchInfo; if (touchInfo != null) { // Show UI on release if (m_GameUI.isBuilding) { Vector2 screenPoint = cameraRig.cachedCamera.WorldToScreenPoint(m_GameUI.GetGhostPosition()); if (m_GameUI.IsGhostAtValidPosition() && m_GameUI.IsValidPurchase()) { confirmationButtons.canvasEnabled = true; invalidButtons.canvasEnabled = false; confirmationButtons.TryMove(screenPoint); } else { invalidButtons.canvasEnabled = true; confirmationButtons.canvasEnabled = false; confirmationButtons.TryMove(screenPoint); } if (m_IsGhostSelected) { m_GameUI.ReturnToBuildMode(); } } if (!m_IsGhostSelected && cameraRig != null) { // Do normal base behaviour here DoReleaseFlick(pointer); } m_IsGhostSelected = false; // Reset m_DragPointer if released if (m_DragPointer != null && m_DragPointer.touchId == touchInfo.touchId) { m_DragPointer = null; } } }
/// <summary> /// Pan with right mouse /// </summary> /// <param name="pointer">The drag pointer event</param> protected void DoRightMouseDragPan(PointerActionInfo pointer) { var mouseInfo = pointer as MouseButtonInfo; if ((mouseInfo != null) && (mouseInfo.mouseButtonId == 1)) { // Calculate zoom ratio float zoomRatio = GetPanSpeedForZoomLevel(); Vector2 panVector = mouseInfo.currentPosition - mouseInfo.startPosition; panVector = (panVector * Time.deltaTime * mouseRmbPanSpeed * zoomRatio) / screenPanThreshold; var camVector = new Vector3(panVector.x, 0, panVector.y); cameraRig.PanCamera(camVector); cameraRig.StopTracking(); } }
/// <summary> /// Pan with middle mouse /// </summary> /// <param name="pointer">Pointer with press event</param> protected void DoMiddleMousePan(PointerActionInfo pointer) { var mouseInfo = pointer as MouseButtonInfo; // Pan to mouse position on MMB if ((mouseInfo != null) && (mouseInfo.mouseButtonId == 2)) { // First get floor position of cursor Ray ray = cameraRig.cachedCamera.ScreenPointToRay(UnityInput.mousePosition); float dist; if (cameraRig.floorPlane.Raycast(ray, out dist)) { Vector3 worldPos = ray.GetPoint(dist); cameraRig.PanTo(worldPos); } cameraRig.StopTracking(); } }
/// <summary> /// Called when we drag /// </summary> protected override void OnDrag(PointerActionInfo pointer) { // Override normal behaviour. We only want to pan if there's no ghost selected // For this reason, we intentionally do not call base var touchInfo = pointer as TouchInfo; if (touchInfo != null) { // Try to pick up the tower if it was dragged off if (m_IsGhostSelected) { m_GameUI.TryMoveGhost(pointer, false); } if (m_GameUI.state == State.BuildingWithDrag) { DragGhost(touchInfo); } else { // Do normal base behaviour only if no ghost selected if (cameraRig != null) { DoDragPan(pointer); if (invalidButtons.canvasEnabled) { invalidButtons.TryMove(cameraRig.cachedCamera.WorldToScreenPoint(m_GameUI.GetGhostPosition())); } if (confirmationButtons.canvasEnabled) { confirmationButtons.TryMove(cameraRig.cachedCamera.WorldToScreenPoint(m_GameUI.GetGhostPosition())); } } } } }
void StartShooting(PointerActionInfo info) { shoulFire = true; }