private void HandleInputHoverAndHold(Vector2 _cursorPosition, Vector3 _clickPosition, float _distanceFromScreen, Vector2 _hoverPosition) { if (!clickHeld && !hoverTriggered && _hoverPosition == previousHoverPosScreen) { if (!hoverTriggerTimer.IsRunning) { hoverTriggerTimer.Restart(); } else if (hoverTriggerTimer.ElapsedMilliseconds > hoverTriggerTime) { hoverTriggered = true; hoverTriggerTimer.Stop(); hoverTriggeredDeadzoneRadius = positioningModule.Stabiliser.GetCurrentDeadzoneRadius(); previousScreenPos = _cursorPosition; // To prevent instant-abandonment of hover } } bool sendHoverAction = true; if (hoverTriggered) { if (_cursorPosition == previousScreenPos) { if (!clickHeld) { if (!progressTimer.IsRunning && progressTimer.Progress == 0f) { progressTimer.StartTimer(); } else if (progressTimer.IsRunning && progressTimer.Progress == 1f) { positioningModule.Stabiliser.SetCurrentDeadzoneRadius(timerDeadzoneEnlargementDistance + positioningModule.Stabiliser.defaultDeadzoneRadius); progressTimer.StopTimer(); clickHeld = true; clickingTimer.Restart(); SendInputAction(InputType.DOWN, _cursorPosition, _clickPosition, _distanceFromScreen); sendHoverAction = false; } else { float maxDeadzoneRadius = timerDeadzoneEnlargementDistance + positioningModule.Stabiliser.defaultDeadzoneRadius; float deadzoneRadius = Mathf.Lerp(hoverTriggeredDeadzoneRadius, maxDeadzoneRadius, progressTimer.Progress); positioningModule.Stabiliser.SetCurrentDeadzoneRadius(deadzoneRadius); } } else { if (!clickAlreadySent && clickingTimer.ElapsedMilliseconds > clickHoldTime) { SendInputAction(InputType.UP, _cursorPosition, _clickPosition, _distanceFromScreen); sendHoverAction = false; clickAlreadySent = true; } else if (!clickAlreadySent) { SendInputAction(InputType.HOLD, _cursorPosition, _clickPosition, _distanceFromScreen); sendHoverAction = false; } } } else { if (clickHeld && !clickAlreadySent) { // Handle unclick if move before timer's up SendInputAction(InputType.UP, _cursorPosition, _clickPosition, _distanceFromScreen); sendHoverAction = false; } progressTimer.ResetTimer(); hoverTriggered = false; hoverTriggerTimer.Stop(); clickHeld = false; clickAlreadySent = false; clickingTimer.Stop(); positioningModule.Stabiliser.StartShrinkingDeadzone(ShrinkType.MOTION_BASED, deadzoneShrinkSpeed); } } if (sendHoverAction && allowHover) { SendInputAction(InputType.HOVER, _cursorPosition, _clickPosition, _distanceFromScreen); } previousHoverPosScreen = _hoverPosition; previousScreenPos = _cursorPosition; }