UI button interaction for vision os - WEKIT-ECS/MIRAGE-XR GitHub Wiki
In scene Start, the GameObject MixedRealityPlayspace needs to have an XROrigin, the ARRaycastManager (from AR Foundation), ARPlaneManager (from AR Foundation), and InputActionManager (from XR Interaction). The InputActionManager should only have the XRI PolySpatial Input Actions (from XR Interaction Samples from the VisionOS sample). The input action is included in the project.

Two Tracked Pose Driver game objects should be included on the main camera: the first one from the Input System package, the second one is system-level (coming from XR legacy input helpers package, probably not needed). They both set up XR device position/rotation/state information for the Input System.

The XRI_simple_rig prefab from the XR Interaction samples needs to be added to the Root game object, removing the Scene Camera. Since XR origin and AR session are already initiated somewhere else, they can be removed / deactivated. This leaves only the XRInteractionManager component here - and the child game objects setting up input mappings.

Primary Interaction Group and Secondary Interaction Group Variant can have the XRInteractionManager directly assigned:

Poke and NearFarInteractors should allow for UI interaction:


PolySpatial and XRInteraction samples both provide InputMaps (in Assets/Samples/PolySpatial/InputMaps and in Assets/Samples/XRInteractionToolkit/3.0.5/VisionOS/Input). Select the XRIPolySpatialInputActions and assign them via button click as project-wide input actions.
The XRIPolySpatialInputActions input actions should look like this:

and

And PolySpatialXRHMD should be added to the Settings panel:

Eye Gaze Interaction Profile needs to be added to the OpenXR settings:

The Apple visionOS settings remain unchanged:

Mind it that the setting Upper Limb Visibility currently is not set by the play-to-device mode for unbounded volume cameras, but only is enforced when building (PolySpatial 1.3.9).
unchanged:


If there is a shader errors flagged in line 146, replace this line with
#if defined(SHADOWS_SHADOWMASK) && (UNITY_ALLOWED_MRT_COUNT > 4)
in the the Unity shader graph core package. File name: PBRDeferredPass.hlsl
For builds, PolySpatial 1.3.9 requires to reduce the dependency for the collections package to 1.2.3, which also makes the gltf package fall down to an earlier version that is not yet dependent on a higher collections package.
OLD:
You may also need the XRTouchSpaceInteractor script with the same input action reference.

Buttons can use the simple script VisionOSButtonInteraction to invoke a unity event. The script looks like this:
using System;
using UnityEngine;
using UnityEngine.Events;
using PolySpatial.Samples;
namespace MirageXR
{
public class VisionOSButtonInteraction : SpatialUI
{
public UnityEvent onClick;
public override void Press(Vector3 position)
{
Debug.Log("Button pressed");
onClick?.Invoke();
}
}
}
The script can be assigned like this in one of the spatial view scripts, this is from the MainScreenSpatialView script:
#if UNITY_VISIONOS
void Start()
{
_buttonSidebarCollapse.gameObject.AddComponent<VisionOSButtonInteraction>();
_buttonSidebarExpand.gameObject.AddComponent<VisionOSButtonInteraction>();
_buttonSettings.gameObject.AddComponent<VisionOSButtonInteraction>();
_buttonSorting.gameObject.AddComponent<VisionOSButtonInteraction>();
_buttonAddNewActivity.gameObject.AddComponent<VisionOSButtonInteraction>();
}
public void SetActionOnButtonSidebarCollapseClick(UnityAction action) => _buttonSidebarCollapse.gameObject.GetComponent<VisionOSButtonInteraction>().onClick.AddListener(action);
public void SetActionOnButtonSidebarExpandClick(UnityAction action) => _buttonSidebarExpand.gameObject.GetComponent<VisionOSButtonInteraction>().onClick.AddListener(action);
public void SetActionOnButtonSortingClick(UnityAction action) => _buttonSorting.gameObject.GetComponent<VisionOSButtonInteraction>().onClick.AddListener(action);
public void SetActionOnButtonAddNewActivityClick(UnityAction action) => _buttonAddNewActivity.gameObject.GetComponent<VisionOSButtonInteraction>().onClick.AddListener(action);
public void SetActionOnInputFieldSearchValueChanged(UnityAction<string> action) => _searchField.SafeSetListener(action);
#else
public void SetActionOnButtonSidebarCollapseClick(UnityAction action) => _buttonSidebarCollapse.SafeSetListener(action);
public void SetActionOnButtonSidebarExpandClick(UnityAction action) => _buttonSidebarExpand.SafeSetListener(action);
public void SetActionOnButtonSortingClick(UnityAction action) => _buttonSorting.SafeSetListener(action);
public void SetActionOnButtonAddNewActivityClick(UnityAction action) => _buttonAddNewActivity.SafeSetListener(action);
public void SetActionOnInputFieldSearchValueChanged(UnityAction<string> action) => _searchField.SafeSetListener(action);
#endif
Most (all?) data providers can be removed as we phase it out.
MRTK config data providers:

Check branch herman1412/visionos-build-test for working button interaction