/// <summary> /// Updates the source positional information. /// </summary> /// <param name="interactionSource">Interaction source to use to update the position.</param> /// <param name="sourceData">SourceData structure to update.</param> private void UpdateSourceState(InteractionSourceState interactionSource, SourceData sourceData) { // Update source position Vector3 sourcePosition; if (interactionSource.properties.location.TryGetPosition(out sourcePosition)) { sourceData.HasPosition = true; sourceData.SourcePosition = sourcePosition; } // Check for source presses if (interactionSource.pressed != sourceData.IsSourceDownPending) { sourceData.IsSourceDownPending = interactionSource.pressed; sourceData.SourceStateUpdateTimer = SourcePressDelay; } // Source presses are delayed to mitigate issue with hand position shifting during air tap sourceData.SourceStateChanged = false; if (sourceData.SourceStateUpdateTimer >= 0) { sourceData.SourceStateUpdateTimer -= Time.deltaTime; if (sourceData.SourceStateUpdateTimer < 0) { sourceData.IsSourceDown = sourceData.IsSourceDownPending; sourceData.SourceStateChanged = true; } } SendSourceStateEvents(sourceData); }
private void OnAirTap(InteractionSourceState state) { // Try to intersect one of the buttons Vector3 hitPos, hitNormal; Button hitButton; if (AppState.Instance.AppCursor.RayCastUI(out hitPos, out hitNormal, out hitButton) && (hitButton != null)) { if (hitButton.onClick != null) { hitButton.onClick.Invoke(); } } }