{"id":1121,"date":"2026-04-09T15:10:21","date_gmt":"2026-04-09T13:10:21","guid":{"rendered":"https:\/\/www.youbiquo.eu\/geckode\/?page_id=1121"},"modified":"2026-04-09T15:13:39","modified_gmt":"2026-04-09T13:13:39","slug":"interaction-package-guides","status":"publish","type":"page","link":"https:\/\/www.youbiquo.eu\/geckode\/en\/interaction-package-guides\/","title":{"rendered":"Interaction Package Guides"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"1121\" class=\"elementor elementor-1121\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-59a1b7c e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"59a1b7c\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-4552b6e elementor-widget elementor-widget-heading\" data-id=\"4552b6e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Interaction Package Guide<\/h2>\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-af25e4d e-flex e-con-boxed wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-parent\" data-id=\"af25e4d\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t<div class=\"elementor-element elementor-element-03d1ffe e-con-full e-flex wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-child\" data-id=\"03d1ffe\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-2d8b463 elementor-widget__width-initial elementor-toc--minimized-on-tablet elementor-widget elementor-widget-table-of-contents\" data-id=\"2d8b463\" data-element_type=\"widget\" data-e-type=\"widget\" data-settings=\"{&quot;headings_by_tags&quot;:[&quot;h3&quot;,&quot;h4&quot;,&quot;h5&quot;,&quot;h6&quot;],&quot;exclude_headings_by_selector&quot;:&quot;footer&quot;,&quot;marker_view&quot;:&quot;bullets&quot;,&quot;icon&quot;:{&quot;value&quot;:&quot;far fa-dot-circle&quot;,&quot;library&quot;:&quot;fa-regular&quot;,&quot;rendered_tag&quot;:&quot;&lt;svg class=\\&quot;e-font-icon-svg e-far-dot-circle\\&quot; viewBox=\\&quot;0 0 512 512\\&quot; xmlns=\\&quot;http:\\\/\\\/www.w3.org\\\/2000\\\/svg\\&quot;&gt;&lt;path d=\\&quot;M256 56c110.532 0 200 89.451 200 200 0 110.532-89.451 200-200 200-110.532 0-200-89.451-200-200 0-110.532 89.451-200 200-200m0-48C119.033 8 8 119.033 8 256s111.033 248 248 248 248-111.033 248-248S392.967 8 256 8zm0 168c-44.183 0-80 35.817-80 80s35.817 80 80 80 80-35.817 80-80-35.817-80-80-80z\\&quot;&gt;&lt;\\\/path&gt;&lt;\\\/svg&gt;&quot;},&quot;no_headings_message&quot;:&quot;Non sono state trovate intestazioni in questa pagina.&quot;,&quot;minimize_box&quot;:&quot;yes&quot;,&quot;minimized_on&quot;:&quot;tablet&quot;,&quot;hierarchical_view&quot;:&quot;yes&quot;,&quot;min_height&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;min_height_tablet&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]},&quot;min_height_mobile&quot;:{&quot;unit&quot;:&quot;px&quot;,&quot;size&quot;:&quot;&quot;,&quot;sizes&quot;:[]}}\" data-widget_type=\"table-of-contents.default\">\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-toc__header\">\n\t\t\t\t\t\t<h2 class=\"elementor-toc__header-title\">\n\t\t\t\tInteraction Package Guide \u2014 LeonardoXR SDK\t\t\t<\/h2>\n\t\t\t\t\t\t\t\t\t\t<div class=\"elementor-toc__toggle-button elementor-toc__toggle-button--expand\" role=\"button\" tabindex=\"0\" aria-controls=\"elementor-toc__2d8b463\" aria-expanded=\"true\" aria-label=\"Open table of contents\"><svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-chevron-down\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M207.029 381.476L12.686 187.132c-9.373-9.373-9.373-24.569 0-33.941l22.667-22.667c9.357-9.357 24.522-9.375 33.901-.04L224 284.505l154.745-154.021c9.379-9.335 24.544-9.317 33.901.04l22.667 22.667c9.373 9.373 9.373 24.569 0 33.941L240.971 381.476c-9.373 9.372-24.569 9.372-33.942 0z\"><\/path><\/svg><\/div>\n\t\t\t\t<div class=\"elementor-toc__toggle-button elementor-toc__toggle-button--collapse\" role=\"button\" tabindex=\"0\" aria-controls=\"elementor-toc__2d8b463\" aria-expanded=\"true\" aria-label=\"Close table of contents\"><svg aria-hidden=\"true\" class=\"e-font-icon-svg e-fas-chevron-up\" viewBox=\"0 0 448 512\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M240.971 130.524l194.343 194.343c9.373 9.373 9.373 24.569 0 33.941l-22.667 22.667c-9.357 9.357-24.522 9.375-33.901.04L224 227.495 69.255 381.516c-9.379 9.335-24.544 9.317-33.901-.04l-22.667-22.667c-9.373-9.373-9.373-24.569 0-33.941L207.03 130.525c9.372-9.373 24.568-9.373 33.941-.001z\"><\/path><\/svg><\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<div id=\"elementor-toc__2d8b463\" class=\"elementor-toc__body\">\n\t\t\t<div class=\"elementor-toc__spinner-container\">\n\t\t\t\t<svg class=\"elementor-toc__spinner eicon-animation-spin e-font-icon-svg e-eicon-loading\" aria-hidden=\"true\" viewBox=\"0 0 1000 1000\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M500 975V858C696 858 858 696 858 500S696 142 500 142 142 304 142 500H25C25 237 238 25 500 25S975 237 975 500 763 975 500 975Z\"><\/path><\/svg>\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-110d8e7 e-con-full e-flex wpr-particle-no wpr-jarallax-no wpr-parallax-no wpr-sticky-section-no wpr-column-slider-no wpr-equal-height-no e-con e-child\" data-id=\"110d8e7\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-5538572 elementor-widget elementor-widget-text-editor\" data-id=\"5538572\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<h1 id=\"interaction-package-guides\" class=\"code-line code-active-line\" dir=\"auto\" data-line=\"0\">Interaction Package Guides<\/h1><ul><li class=\"code-line\" dir=\"auto\" data-line=\"2\"><em>Version 1.0.2<\/em><\/li><li class=\"code-line\" dir=\"auto\" data-line=\"2\"><em>Device: Youbiquo Leonardo XR<\/em><\/li><li class=\"code-line\" dir=\"auto\" data-line=\"2\"><em> Base SDK: Snapdragon Spaces 1.0.4<\/em><\/li><\/ul><p class=\"code-line\" dir=\"auto\" data-line=\"4\">This guide describes how to configure the interaction layer for LeonardoXR applications using standard Unity packages:<\/p><ul class=\"code-line\" dir=\"auto\" data-line=\"6\"><li class=\"code-line\" dir=\"auto\" data-line=\"6\"><strong>XR Interaction Toolkit (XRIT) 3.3.0<\/strong>\u00a0\u2014 high-level interaction system for controllers, ray interactors and direct interactors.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"7\"><strong>XR Hands 1.7.2<\/strong>\u00a0\u2014 access to hand joint data and gesture recognition.<\/li><\/ul><h2 id=\"dependencies-and-versions\" class=\"code-line\" dir=\"auto\" data-line=\"9\">Dependencies and Versions<\/h2><table class=\"code-line\" dir=\"auto\" data-line=\"11\"><thead class=\"code-line\" dir=\"auto\" data-line=\"11\"><tr class=\"code-line\" dir=\"auto\" data-line=\"11\"><th>Package<\/th><th>Version<\/th><th>Source<\/th><\/tr><\/thead><tbody class=\"code-line\" dir=\"auto\" data-line=\"13\"><tr class=\"code-line\" dir=\"auto\" data-line=\"13\"><td>XR Interaction Toolkit<\/td><td>3.3.0<\/td><td>Unity Registry<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"14\"><td>XR Hands<\/td><td>1.7.2<\/td><td>Unity Registry<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"15\"><td>AR Foundation<\/td><td>6.2.1<\/td><td>Unity Registry<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"16\"><td>Snapdragon Spaces SDK<\/td><td>1.0.4<\/td><td>Tarball (Qualcomm)<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"17\"><td>LeonardoXR SDK<\/td><td>1.0.2<\/td><td>Tarball (Youbiquo)<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"18\"><td>UniTask<\/td><td>2.5.10<\/td><td>Unity Registry<\/td><\/tr><\/tbody><\/table><blockquote class=\"code-line\" dir=\"auto\" data-line=\"20\"><p class=\"code-line\" dir=\"auto\" data-line=\"20\"><strong>NOTE<\/strong>\u00a0All dependencies must be installed as described in the Getting Started guide before proceeding with interaction configuration.<\/p><\/blockquote><hr class=\"code-line\" dir=\"auto\" data-line=\"22\" \/><h2 id=\"1-xr-interaction-toolkit-configuration\" class=\"code-line\" dir=\"auto\" data-line=\"24\">1. XR Interaction Toolkit Configuration<\/h2><h3 id=\"installation\" class=\"code-line\" dir=\"auto\" data-line=\"26\">Installation<\/h3><p class=\"code-line\" dir=\"auto\" data-line=\"28\">Install via\u00a0<strong>Window &gt; Package Manager &gt; Unity Registry &gt; XR Interaction Toolkit &gt; Install<\/strong>\u00a0(version 3.3.0). If prompted &#8220;Enable the new input system?&#8221;, click\u00a0<strong>Yes<\/strong>. If prompted &#8220;XR Interaction Layer Mask Update Required&#8221;, click\u00a0<strong>I Made a Backup, Go Ahead!<\/strong>\u00a0(for new projects) or\u00a0<strong>No Thanks<\/strong>\u00a0if no previous XRIT version was present.<\/p><h3 id=\"import-starter-assets\" class=\"code-line\" dir=\"auto\" data-line=\"30\">Import Starter Assets<\/h3><ol class=\"code-line\" dir=\"auto\" data-line=\"32\"><li class=\"code-line\" dir=\"auto\" data-line=\"32\">Open\u00a0<strong>Window &gt; Package Manager<\/strong>, select\u00a0<strong>In Project<\/strong>\u00a0then\u00a0<strong>XR Interaction Toolkit<\/strong>.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"33\">Under\u00a0<strong>Samples<\/strong>, click\u00a0<strong>Import<\/strong>\u00a0on\u00a0<strong>Starter Assets<\/strong>.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"34\">Also click\u00a0<strong>Import<\/strong>\u00a0on\u00a0<strong>Hand Interaction Demo<\/strong>\u00a0(required for hand tracking samples).<\/li><\/ol><p class=\"code-line\" dir=\"auto\" data-line=\"36\">The Starter Assets include:<\/p><ul class=\"code-line\" dir=\"auto\" data-line=\"37\"><li class=\"code-line\" dir=\"auto\" data-line=\"37\">Pre-configured Input Action Asset for XR controllers and hands.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"38\">Reference prefabs for XR Origin with Ray Interactor and Direct Interactor.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"39\">Base materials and shaders for interaction visual feedback.<\/li><\/ul><h3 id=\"configure-input-actions\" class=\"code-line\" dir=\"auto\" data-line=\"41\">Configure Input Actions<\/h3><p class=\"code-line\" dir=\"auto\" data-line=\"43\">After import, an\u00a0<code>XRI Default Input Actions<\/code>\u00a0asset is added to\u00a0<code>Assets\/Samples\/XR Interaction Toolkit\/[version]\/Starter Assets\/<\/code>. This asset is pre-configured for standard controller profiles (including the Companion Controller via Microsoft MMRC Profile) and for hands.<\/p><p class=\"code-line\" dir=\"auto\" data-line=\"45\">To associate the asset with the system: go to\u00a0<strong>Edit &gt; Project Settings &gt; XR Plug-in Management &gt; Input System<\/strong>\u00a0and ensure\u00a0<strong>Active Input Handling<\/strong>\u00a0is set to\u00a0<code>Both<\/code>\u00a0or\u00a0<code>Input System Package (New)<\/code>.<\/p><hr class=\"code-line\" dir=\"auto\" data-line=\"47\" \/><h2 id=\"2-scene-configuration--xr-origin\" class=\"code-line\" dir=\"auto\" data-line=\"49\">2. Scene Configuration \u2014 XR Origin<\/h2><h3 id=\"base-scene-hierarchy\" class=\"code-line\" dir=\"auto\" data-line=\"51\">Base Scene Hierarchy<\/h3><pre><code class=\"code-line\" dir=\"auto\" data-line=\"53\">AR Session\nXR Origin (Action-based)\n  \u2514\u2500\u2500 Camera Offset\n        \u251c\u2500\u2500 Main Camera (tagged \"MainCamera\")\n        \u251c\u2500\u2500 LeftHand Controller\n        \u2502     \u251c\u2500\u2500 XR Ray Interactor (left)\n        \u2502     \u2514\u2500\u2500 XR Direct Interactor (left)\n        \u2514\u2500\u2500 RightHand Controller\n              \u251c\u2500\u2500 XR Ray Interactor (right)\n              \u2514\u2500\u2500 XR Direct Interactor (right)\n<\/code><\/pre><p class=\"code-line\" dir=\"auto\" data-line=\"66\">Create the base structure by selecting\u00a0<strong>GameObject &gt; XR &gt; XR Origin (Action-based)<\/strong>.<\/p><blockquote class=\"code-line\" dir=\"auto\" data-line=\"68\"><p class=\"code-line\" dir=\"auto\" data-line=\"68\"><strong>NOTE<\/strong>\u00a0Disable\u00a0<strong>AR Camera Background<\/strong>\u00a0\u2014 not supported on LeonardoXR and automatically disabled at runtime. Also disable\u00a0<strong>AR Camera Manager<\/strong>\u00a0if not retrieving RGB frames from the camera.<\/p><\/blockquote><h3 id=\"input-action-manager\" class=\"code-line\" dir=\"auto\" data-line=\"70\">Input Action Manager<\/h3><p class=\"code-line\" dir=\"auto\" data-line=\"72\">Add the\u00a0<strong>Input Action Manager<\/strong>\u00a0component to the XR Origin (or a persistent GameObject). In the\u00a0<strong>Action Assets<\/strong>\u00a0field, assign:<\/p><ul class=\"code-line\" dir=\"auto\" data-line=\"74\"><li class=\"code-line\" dir=\"auto\" data-line=\"74\"><code>XR Input Actions<\/code>\u00a0(from\u00a0<code>Samples\/LeonardoXR SDK\/[version]\/Core Samples\/Shared Assets<\/code>).<\/li><\/ul><hr class=\"code-line\" dir=\"auto\" data-line=\"76\" \/><h2 id=\"3-xr-hands-configuration\" class=\"code-line\" dir=\"auto\" data-line=\"78\">3. XR Hands Configuration<\/h2><h3 id=\"installation-1\" class=\"code-line\" dir=\"auto\" data-line=\"80\">Installation<\/h3><p class=\"code-line\" dir=\"auto\" data-line=\"82\">Install via\u00a0<strong>Window &gt; Package Manager &gt; Unity Registry &gt; XR Hands &gt; Install<\/strong>\u00a0(version 1.7.2).<\/p><h3 id=\"import-hand-samples\" class=\"code-line\" dir=\"auto\" data-line=\"84\">Import Hand Samples<\/h3><p class=\"code-line\" dir=\"auto\" data-line=\"86\">Open\u00a0<strong>Window &gt; Package Manager &gt; In Project &gt; XR Hands &gt; Samples<\/strong>\u00a0and import:<\/p><ul class=\"code-line\" dir=\"auto\" data-line=\"87\"><li class=\"code-line\" dir=\"auto\" data-line=\"87\"><strong>Gestures<\/strong>\u00a0\u2014 gesture recognition system.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"88\"><strong>Hand Visualizer<\/strong>\u00a0\u2014 hand mesh visualisation.<\/li><\/ul><h3 id=\"enable-hand-tracking-subsystem\" class=\"code-line\" dir=\"auto\" data-line=\"90\">Enable Hand Tracking Subsystem<\/h3><ol class=\"code-line\" dir=\"auto\" data-line=\"92\"><li class=\"code-line\" dir=\"auto\" data-line=\"92\">Go to\u00a0<strong>Edit &gt; Project Settings &gt; XR Plug-in Management &gt; OpenXR<\/strong>\u00a0(Android tab).<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"93\">Under\u00a0<strong>All Features<\/strong>, enable\u00a0<strong>Hand Tracking Subsystem<\/strong>.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"94\">Also enable\u00a0<strong>Hand Tracking<\/strong>\u00a0in the Snapdragon Spaces feature group.<\/li><\/ol><blockquote class=\"code-line\" dir=\"auto\" data-line=\"96\"><p class=\"code-line\" dir=\"auto\" data-line=\"96\"><strong>NOTE<\/strong>\u00a0The Hand Tracking Subsystem must be enabled in\u00a0<strong>All Features<\/strong>\u00a0\u2014 not just in the Snapdragon Spaces section \u2014 to work correctly on LeonardoXR.<\/p><\/blockquote><h3 id=\"hand-data-access-via-xr-hands-api\" class=\"code-line\" dir=\"auto\" data-line=\"98\">Hand Data Access via XR Hands API<\/h3><pre><code class=\"code-line language-csharp\" dir=\"auto\" data-line=\"100\"><span class=\"hljs-keyword\"><span style=\"color: #003366;\">using<\/span><\/span><span style=\"color: #003366;\"> UnityEngine.XR.Hands;\n\nXRHandSubsystem handSubsystem = XRHandSubsystemUtility.GetSubsystem();\n<span class=\"hljs-keyword\">if<\/span> (handSubsystem != <span class=\"hljs-literal\">null<\/span>)\n{\n    XRHand leftHand = handSubsystem.leftHand;\n    <span class=\"hljs-keyword\">if<\/span> (leftHand.isTracked)\n    {\n        <span class=\"hljs-keyword\">if<\/span> (leftHand.GetJoint(XRHandJointID.IndexTip).TryGetPose(<span class=\"hljs-keyword\">out<\/span> Pose indexTipPose))\n        {\n            <span class=\"hljs-comment\">\/\/ indexTipPose.position = position of left index fingertip<\/span>\n        }\n    }\n}\n<\/span><\/code><\/pre><h3 id=\"gesture-recognition\" class=\"code-line\" dir=\"auto\" data-line=\"117\">Gesture Recognition<\/h3><pre><span style=\"color: #003366;\"><code class=\"code-line language-csharp\" dir=\"auto\" data-line=\"119\">[<span class=\"hljs-meta\">SerializeField<\/span>] XRHandGestures gestures;\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">OnEnable<\/span>()<\/span>\n{\n    gestures.gesturePerformed += OnGesturePerformed;\n}\n\n<span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">OnGesturePerformed<\/span>(<span class=\"hljs-params\">XRHandGesture gesture, Handedness handedness<\/span>)<\/span>\n{\n    Debug.Log(<span class=\"hljs-string\">$\"Gesture: <span class=\"hljs-subst\">{gesture.gestureName}<\/span> performed with <span class=\"hljs-subst\">{handedness}<\/span>\"<\/span>);\n}\n<\/code><\/span><\/pre><hr class=\"code-line\" dir=\"auto\" data-line=\"133\" \/><h2 id=\"4-configuring-interactables\" class=\"code-line\" dir=\"auto\" data-line=\"135\">4. Configuring Interactables<\/h2><h3 id=\"adding-an-interactable-to-an-object\" class=\"code-line\" dir=\"auto\" data-line=\"137\">Adding an Interactable to an Object<\/h3><ol class=\"code-line\" dir=\"auto\" data-line=\"139\"><li class=\"code-line\" dir=\"auto\" data-line=\"139\">Add a\u00a0<strong>Collider<\/strong>\u00a0to the object (e.g. Box Collider).<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"140\">Add\u00a0<strong>XR Grab Interactable<\/strong>\u00a0for grabbable objects, or\u00a0<strong>XR Simple Interactable<\/strong>\u00a0for objects that receive events without being moved.<\/li><\/ol><pre><span style=\"color: #003366;\"><code class=\"code-line language-csharp\" dir=\"auto\" data-line=\"142\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">MyButton<\/span> : <span class=\"hljs-title\">MonoBehaviour<\/span>\n{\n    [<span class=\"hljs-meta\">SerializeField<\/span>] XRSimpleInteractable interactable;\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">OnEnable<\/span>()<\/span>\n    {\n        interactable.selectEntered.AddListener(OnSelected);\n    }\n\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">OnSelected<\/span>(<span class=\"hljs-params\">SelectEnterEventArgs args<\/span>)<\/span>\n    {\n        Debug.Log(<span class=\"hljs-string\">\"Selected by: \"<\/span> + args.interactorObject);\n    }\n}\n<\/code><\/span><\/pre><h3 id=\"interaction-layer-mask\" class=\"code-line\" dir=\"auto\" data-line=\"159\">Interaction Layer Mask<\/h3><p class=\"code-line\" dir=\"auto\" data-line=\"161\">XRIT 3.x uses\u00a0<strong>Interaction Layer Masks<\/strong>\u00a0to filter which interactors can interact with which interactables:<\/p><pre><span style=\"color: #003366;\"><code class=\"code-line language-csharp\" dir=\"auto\" data-line=\"163\">interactable.interactionLayers = InteractionLayerMask.GetMask(<span class=\"hljs-string\">\"Default\"<\/span>, <span class=\"hljs-string\">\"UI\"<\/span>);\n<\/code><\/span><\/pre><hr class=\"code-line\" dir=\"auto\" data-line=\"167\" \/><h2 id=\"5-ui-canvas-and-interaction\" class=\"code-line\" dir=\"auto\" data-line=\"169\">5. UI Canvas and Interaction<\/h2><h3 id=\"world-space-canvas\" class=\"code-line\" dir=\"auto\" data-line=\"171\">World Space Canvas<\/h3><ol class=\"code-line\" dir=\"auto\" data-line=\"173\"><li class=\"code-line\" dir=\"auto\" data-line=\"173\">Create a\u00a0<strong>Canvas<\/strong>\u00a0and set\u00a0<strong>Render Mode<\/strong>\u00a0to\u00a0<strong>World Space<\/strong>.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"174\">Add the\u00a0<strong>Tracked Device Graphic Raycaster<\/strong>\u00a0component to the Canvas (replaces the standard Graphic Raycaster).<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"175\">Add\u00a0<strong>XR UI Input Module<\/strong>\u00a0to the EventSystem GameObject in the scene (replaces the default Input System UI Input Module).<\/li><\/ol><h3 id=\"recommended-canvas-settings\" class=\"code-line\" dir=\"auto\" data-line=\"177\">Recommended Canvas Settings<\/h3><table class=\"code-line\" dir=\"auto\" data-line=\"179\"><thead class=\"code-line\" dir=\"auto\" data-line=\"179\"><tr class=\"code-line\" dir=\"auto\" data-line=\"179\"><th>Parameter<\/th><th>Recommended Value<\/th><\/tr><\/thead><tbody class=\"code-line\" dir=\"auto\" data-line=\"181\"><tr class=\"code-line\" dir=\"auto\" data-line=\"181\"><td>Render Mode<\/td><td>World Space<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"182\"><td>Dynamic Pixels Per Unit<\/td><td>1<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"183\"><td>Reference Pixels Per Unit<\/td><td>100<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"184\"><td>Scale<\/td><td>0.001 (for a ~1m canvas = 1000 pixel units)<\/td><\/tr><\/tbody><\/table><hr class=\"code-line\" dir=\"auto\" data-line=\"186\" \/><h2 id=\"6-combining-controller-and-hand-tracking\" class=\"code-line\" dir=\"auto\" data-line=\"188\">6. Combining Controller and Hand Tracking<\/h2><p class=\"code-line\" dir=\"auto\" data-line=\"190\">On LeonardoXR it is not possible to simultaneously use headset Controllers and full Hand Tracking (with raycast from both hands) due to conflicts between OpenXR profiles.<\/p><h3 id=\"option-a--controller-only-companion-controller\" class=\"code-line\" dir=\"auto\" data-line=\"192\">Option A \u2014 Controller Only (Companion Controller)<\/h3><ul class=\"code-line\" dir=\"auto\" data-line=\"194\"><li class=\"code-line\" dir=\"auto\" data-line=\"194\">Add\u00a0<strong>Microsoft MMRC Profile<\/strong>\u00a0to enabled profiles.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"195\">Do not add Hand Interaction Profile.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"196\">The Companion Controller handles pointing; hands can be used as colliders but not as raycast interactors.<\/li><\/ul><h3 id=\"option-b--hands-only-dual-hand-mode\" class=\"code-line\" dir=\"auto\" data-line=\"198\">Option B \u2014 Hands Only (Dual Hand Mode)<\/h3><ul class=\"code-line\" dir=\"auto\" data-line=\"200\"><li class=\"code-line\" dir=\"auto\" data-line=\"200\">Add\u00a0<strong>Hand Interaction Profile<\/strong>\u00a0to enabled profiles.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"201\">Do not add Microsoft MMRC Profile.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"202\">Remove the Device Pointer Prefab from the Controller.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"203\">Both hands tracked as full interactors; no phone input.<\/li><\/ul><h3 id=\"option-c--controller--one-hand\" class=\"code-line\" dir=\"auto\" data-line=\"205\">Option C \u2014 Controller + One Hand<\/h3><ul class=\"code-line\" dir=\"auto\" data-line=\"207\"><li class=\"code-line\" dir=\"auto\" data-line=\"207\">Add\u00a0<strong>Microsoft MMRC Profile<\/strong>\u00a0to enabled profiles.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"208\">Keep only the Right Hand Controller active in the XR Origin.<\/li><li class=\"code-line\" dir=\"auto\" data-line=\"209\">The left hand can still function as a collider and poke interaction trigger, but not as a ray interactor.<\/li><\/ul><hr class=\"code-line\" dir=\"auto\" data-line=\"211\" \/><h2 id=\"7-unitask--asynchronous-operations\" class=\"code-line\" dir=\"auto\" data-line=\"213\">7. UniTask \u2014 Asynchronous Operations<\/h2><p class=\"code-line\" dir=\"auto\" data-line=\"215\">UniTask 2.5.10 is included as a dependency for high-performance async operations (asset loading, waiting for subsystems, etc.) without GC allocations.<\/p><pre><span style=\"color: #003366;\"><code class=\"code-line language-csharp\" dir=\"auto\" data-line=\"217\"><span class=\"hljs-keyword\">using<\/span> Cysharp.Threading.Tasks;\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">HandSubsystemWaiter<\/span> : <span class=\"hljs-title\">MonoBehaviour<\/span>\n{\n    <span class=\"hljs-function\"><span class=\"hljs-keyword\">async<\/span> UniTaskVoid <span class=\"hljs-title\">Start<\/span>()<\/span>\n    {\n        <span class=\"hljs-comment\">\/\/ Wait until the XR Hands subsystem is ready<\/span>\n        <span class=\"hljs-keyword\">await<\/span> UniTask.WaitUntil(() =&gt;\n            XRHandSubsystemUtility.GetSubsystem()?.running ?? <span class=\"hljs-literal\">false<\/span>);\n        Debug.Log(<span class=\"hljs-string\">\"XR Hands subsystem ready.\"<\/span>);\n    }\n}\n<\/code><\/span><\/pre><p class=\"code-line\" dir=\"auto\" data-line=\"232\">UniTask is used internally by the LeonardoXR SDK for asynchronous operations. It is recommended to use it in application code as well for consistency with the SDK lifecycle.<\/p><h2 id=\"openxr-interaction-profile-reference\" class=\"code-line\" dir=\"auto\" data-line=\"234\">OpenXR Interaction Profile Reference<\/h2><table class=\"code-line\" dir=\"auto\" data-line=\"236\"><thead class=\"code-line\" dir=\"auto\" data-line=\"236\"><tr class=\"code-line\" dir=\"auto\" data-line=\"236\"><th>Profile<\/th><th>Use<\/th><\/tr><\/thead><tbody class=\"code-line\" dir=\"auto\" data-line=\"238\"><tr class=\"code-line\" dir=\"auto\" data-line=\"238\"><td>Microsoft Mixed Reality Motion Controller Profile<\/td><td>Physical controllers interaction profile<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"239\"><td>Hand Interaction Profile<\/td><td>Hand tracking with poke\/pinch interactor<\/td><\/tr><tr class=\"code-line\" dir=\"auto\" data-line=\"240\"><td>LeonardoXR Hand Interaction Profile<\/td><td>Hand tracking with poke\/pinch interactor<\/td><\/tr><\/tbody><\/table>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Interaction Package Guide Interaction Package Guide \u2014 LeonardoXR SDK Interaction Package Guides Version 1.0.2 Device: Youbiquo Leonardo XR Base SDK: Snapdragon Spaces 1.0.4 This guide describes how to configure the interaction layer for LeonardoXR applications using standard Unity packages: XR Interaction Toolkit (XRIT) 3.3.0\u00a0\u2014 high-level interaction system for controllers, ray interactors and direct interactors. XR Hands 1.7.2\u00a0\u2014 access to hand joint data and gesture recognition. Dependencies and Versions Package Version Source XR Interaction Toolkit 3.3.0 Unity Registry XR Hands 1.7.2 Unity Registry AR Foundation 6.2.1 Unity Registry Snapdragon Spaces SDK 1.0.4 Tarball (Qualcomm) LeonardoXR SDK 1.0.2 Tarball (Youbiquo) UniTask 2.5.10 Unity Registry NOTE\u00a0All dependencies must be installed as described in the Getting Started guide before proceeding with interaction configuration. 1. XR Interaction Toolkit Configuration Installation Install via\u00a0Window &gt; Package Manager &gt; Unity Registry &gt; XR Interaction Toolkit &gt; Install\u00a0(version 3.3.0). If prompted &#8220;Enable the new input system?&#8221;, click\u00a0Yes. If prompted &#8220;XR Interaction Layer Mask Update Required&#8221;, click\u00a0I Made a Backup, Go Ahead!\u00a0(for new projects) or\u00a0No Thanks\u00a0if no previous XRIT version was present. Import Starter Assets Open\u00a0Window &gt; Package Manager, select\u00a0In Project\u00a0then\u00a0XR Interaction Toolkit. Under\u00a0Samples, click\u00a0Import\u00a0on\u00a0Starter Assets. Also click\u00a0Import\u00a0on\u00a0Hand Interaction Demo\u00a0(required for hand tracking samples). The Starter Assets include: Pre-configured Input Action Asset for XR controllers and hands. Reference prefabs for XR Origin with Ray Interactor and Direct Interactor. Base materials and shaders for interaction visual feedback. Configure Input Actions After import, an\u00a0XRI Default Input Actions\u00a0asset is added to\u00a0Assets\/Samples\/XR Interaction Toolkit\/[version]\/Starter Assets\/. This asset is pre-configured for standard controller profiles (including the Companion Controller via Microsoft MMRC Profile) and for hands. To associate the asset with the system: go to\u00a0Edit &gt; Project Settings &gt; XR Plug-in Management &gt; Input System\u00a0and ensure\u00a0Active Input Handling\u00a0is set to\u00a0Both\u00a0or\u00a0Input System Package (New). 2. Scene Configuration \u2014 XR Origin Base Scene Hierarchy AR Session XR Origin (Action-based) \u2514\u2500\u2500 Camera Offset \u251c\u2500\u2500 Main Camera (tagged &#8220;MainCamera&#8221;) \u251c\u2500\u2500 LeftHand Controller \u2502 \u251c\u2500\u2500 XR Ray Interactor (left) \u2502 \u2514\u2500\u2500 XR Direct Interactor (left) \u2514\u2500\u2500 RightHand Controller \u251c\u2500\u2500 XR Ray Interactor (right) \u2514\u2500\u2500 XR Direct Interactor (right) Create the base structure by selecting\u00a0GameObject &gt; XR &gt; XR Origin (Action-based). NOTE\u00a0Disable\u00a0AR Camera Background\u00a0\u2014 not supported on LeonardoXR and automatically disabled at runtime. Also disable\u00a0AR Camera Manager\u00a0if not retrieving RGB frames from the camera. Input Action Manager Add the\u00a0Input Action Manager\u00a0component to the XR Origin (or a persistent GameObject). In the\u00a0Action Assets\u00a0field, assign: XR Input Actions\u00a0(from\u00a0Samples\/LeonardoXR SDK\/[version]\/Core Samples\/Shared Assets). 3. XR Hands Configuration Installation Install via\u00a0Window &gt; Package Manager &gt; Unity Registry &gt; XR Hands &gt; Install\u00a0(version 1.7.2). Import Hand Samples Open\u00a0Window &gt; Package Manager &gt; In Project &gt; XR Hands &gt; Samples\u00a0and import: Gestures\u00a0\u2014 gesture recognition system. Hand Visualizer\u00a0\u2014 hand mesh visualisation. Enable Hand Tracking Subsystem Go to\u00a0Edit &gt; Project Settings &gt; XR Plug-in Management &gt; OpenXR\u00a0(Android tab). Under\u00a0All Features, enable\u00a0Hand Tracking Subsystem. Also enable\u00a0Hand Tracking\u00a0in the Snapdragon Spaces feature group. NOTE\u00a0The Hand Tracking Subsystem must be enabled in\u00a0All Features\u00a0\u2014 not just in the Snapdragon Spaces section \u2014 to work correctly on LeonardoXR. Hand Data Access via XR Hands API using UnityEngine.XR.Hands; XRHandSubsystem handSubsystem = XRHandSubsystemUtility.GetSubsystem(); if (handSubsystem != null) { XRHand leftHand = handSubsystem.leftHand; if (leftHand.isTracked) { if (leftHand.GetJoint(XRHandJointID.IndexTip).TryGetPose(out Pose indexTipPose)) { \/\/ indexTipPose.position = position of left index fingertip } } } Gesture Recognition [SerializeField] XRHandGestures gestures; void OnEnable() { gestures.gesturePerformed += OnGesturePerformed; } void OnGesturePerformed(XRHandGesture gesture, Handedness handedness) { Debug.Log($&#8221;Gesture: {gesture.gestureName} performed with {handedness}&#8221;); } 4. Configuring Interactables Adding an Interactable to an Object Add a\u00a0Collider\u00a0to the object (e.g. Box Collider). Add\u00a0XR Grab Interactable\u00a0for grabbable objects, or\u00a0XR Simple Interactable\u00a0for objects that receive events without being moved. public class MyButton : MonoBehaviour { [SerializeField] XRSimpleInteractable interactable; void OnEnable() { interactable.selectEntered.AddListener(OnSelected); } void OnSelected(SelectEnterEventArgs args) { Debug.Log(&#8220;Selected by: &#8221; + args.interactorObject); } } Interaction Layer Mask XRIT 3.x uses\u00a0Interaction Layer Masks\u00a0to filter which interactors can interact with which interactables: interactable.interactionLayers = InteractionLayerMask.GetMask(&#8220;Default&#8221;, &#8220;UI&#8221;); 5. UI Canvas and Interaction World Space Canvas Create a\u00a0Canvas\u00a0and set\u00a0Render Mode\u00a0to\u00a0World Space. Add the\u00a0Tracked Device Graphic Raycaster\u00a0component to the Canvas (replaces the standard Graphic Raycaster). Add\u00a0XR UI Input Module\u00a0to the EventSystem GameObject in the scene (replaces the default Input System UI Input Module). Recommended Canvas Settings Parameter Recommended Value Render Mode World Space Dynamic Pixels Per Unit 1 Reference Pixels Per Unit 100 Scale 0.001 (for a ~1m canvas = 1000 pixel units) 6. Combining Controller and Hand Tracking On LeonardoXR it is not possible to simultaneously use headset Controllers and full Hand Tracking (with raycast from both hands) due to conflicts between OpenXR profiles. Option A \u2014 Controller Only (Companion Controller) Add\u00a0Microsoft MMRC Profile\u00a0to enabled profiles. Do not add Hand Interaction Profile. The Companion Controller handles pointing; hands can be used as colliders but not as raycast interactors. Option B \u2014 Hands Only (Dual Hand Mode) Add\u00a0Hand Interaction Profile\u00a0to enabled profiles. Do not add Microsoft MMRC Profile. Remove the Device Pointer Prefab from the Controller. Both hands tracked as full interactors; no phone input. Option C \u2014 Controller + One Hand Add\u00a0Microsoft MMRC Profile\u00a0to enabled profiles. Keep only the Right Hand Controller active in the XR Origin. The left hand can still function as a collider and poke interaction trigger, but not as a ray interactor. 7. UniTask \u2014 Asynchronous Operations UniTask 2.5.10 is included as a dependency for high-performance async operations (asset loading, waiting for subsystems, etc.) without GC allocations. using Cysharp.Threading.Tasks; public class HandSubsystemWaiter : MonoBehaviour { async UniTaskVoid Start() { \/\/ Wait until the XR Hands subsystem is ready await UniTask.WaitUntil(() =&gt; XRHandSubsystemUtility.GetSubsystem()?.running ?? false); Debug.Log(&#8220;XR Hands subsystem ready.&#8221;); } } UniTask is used internally by the LeonardoXR SDK for asynchronous operations. It is recommended to use it in application code as well for consistency with the SDK lifecycle. OpenXR Interaction Profile Reference Profile Use Microsoft Mixed Reality Motion Controller Profile Physical controllers interaction profile Hand Interaction Profile Hand tracking with poke\/pinch interactor LeonardoXR Hand Interaction Profile Hand tracking with poke\/pinch interactor<\/p>\n","protected":false},"author":11,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-1121","page","type-page","status-publish","hentry"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.2 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Interaction Package Guides - Geckode!<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.youbiquo.eu\/geckode\/en\/interaction-package-guides\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Interaction Package Guides - Geckode!\" \/>\n<meta property=\"og:description\" content=\"Interaction Package Guide Interaction Package Guide \u2014 LeonardoXR SDK Interaction Package Guides Version 1.0.2 Device: Youbiquo Leonardo XR Base SDK: Snapdragon Spaces 1.0.4 This guide describes how to configure the interaction layer for LeonardoXR applications using standard Unity packages: XR Interaction Toolkit (XRIT) 3.3.0\u00a0\u2014 high-level interaction system for controllers, ray interactors and direct interactors. XR Hands 1.7.2\u00a0\u2014 access to hand joint data and gesture recognition. Dependencies and Versions Package Version Source XR Interaction Toolkit 3.3.0 Unity Registry XR Hands 1.7.2 Unity Registry AR Foundation 6.2.1 Unity Registry Snapdragon Spaces SDK 1.0.4 Tarball (Qualcomm) LeonardoXR SDK 1.0.2 Tarball (Youbiquo) UniTask 2.5.10 Unity Registry NOTE\u00a0All dependencies must be installed as described in the Getting Started guide before proceeding with interaction configuration. 1. XR Interaction Toolkit Configuration Installation Install via\u00a0Window &gt; Package Manager &gt; Unity Registry &gt; XR Interaction Toolkit &gt; Install\u00a0(version 3.3.0). If prompted &#8220;Enable the new input system?&#8221;, click\u00a0Yes. If prompted &#8220;XR Interaction Layer Mask Update Required&#8221;, click\u00a0I Made a Backup, Go Ahead!\u00a0(for new projects) or\u00a0No Thanks\u00a0if no previous XRIT version was present. Import Starter Assets Open\u00a0Window &gt; Package Manager, select\u00a0In Project\u00a0then\u00a0XR Interaction Toolkit. Under\u00a0Samples, click\u00a0Import\u00a0on\u00a0Starter Assets. Also click\u00a0Import\u00a0on\u00a0Hand Interaction Demo\u00a0(required for hand tracking samples). The Starter Assets include: Pre-configured Input Action Asset for XR controllers and hands. Reference prefabs for XR Origin with Ray Interactor and Direct Interactor. Base materials and shaders for interaction visual feedback. Configure Input Actions After import, an\u00a0XRI Default Input Actions\u00a0asset is added to\u00a0Assets\/Samples\/XR Interaction Toolkit\/[version]\/Starter Assets\/. This asset is pre-configured for standard controller profiles (including the Companion Controller via Microsoft MMRC Profile) and for hands. To associate the asset with the system: go to\u00a0Edit &gt; Project Settings &gt; XR Plug-in Management &gt; Input System\u00a0and ensure\u00a0Active Input Handling\u00a0is set to\u00a0Both\u00a0or\u00a0Input System Package (New). 2. Scene Configuration \u2014 XR Origin Base Scene Hierarchy AR Session XR Origin (Action-based) \u2514\u2500\u2500 Camera Offset \u251c\u2500\u2500 Main Camera (tagged &quot;MainCamera&quot;) \u251c\u2500\u2500 LeftHand Controller \u2502 \u251c\u2500\u2500 XR Ray Interactor (left) \u2502 \u2514\u2500\u2500 XR Direct Interactor (left) \u2514\u2500\u2500 RightHand Controller \u251c\u2500\u2500 XR Ray Interactor (right) \u2514\u2500\u2500 XR Direct Interactor (right) Create the base structure by selecting\u00a0GameObject &gt; XR &gt; XR Origin (Action-based). NOTE\u00a0Disable\u00a0AR Camera Background\u00a0\u2014 not supported on LeonardoXR and automatically disabled at runtime. Also disable\u00a0AR Camera Manager\u00a0if not retrieving RGB frames from the camera. Input Action Manager Add the\u00a0Input Action Manager\u00a0component to the XR Origin (or a persistent GameObject). In the\u00a0Action Assets\u00a0field, assign: XR Input Actions\u00a0(from\u00a0Samples\/LeonardoXR SDK\/[version]\/Core Samples\/Shared Assets). 3. XR Hands Configuration Installation Install via\u00a0Window &gt; Package Manager &gt; Unity Registry &gt; XR Hands &gt; Install\u00a0(version 1.7.2). Import Hand Samples Open\u00a0Window &gt; Package Manager &gt; In Project &gt; XR Hands &gt; Samples\u00a0and import: Gestures\u00a0\u2014 gesture recognition system. Hand Visualizer\u00a0\u2014 hand mesh visualisation. Enable Hand Tracking Subsystem Go to\u00a0Edit &gt; Project Settings &gt; XR Plug-in Management &gt; OpenXR\u00a0(Android tab). Under\u00a0All Features, enable\u00a0Hand Tracking Subsystem. Also enable\u00a0Hand Tracking\u00a0in the Snapdragon Spaces feature group. NOTE\u00a0The Hand Tracking Subsystem must be enabled in\u00a0All Features\u00a0\u2014 not just in the Snapdragon Spaces section \u2014 to work correctly on LeonardoXR. Hand Data Access via XR Hands API using UnityEngine.XR.Hands; XRHandSubsystem handSubsystem = XRHandSubsystemUtility.GetSubsystem(); if (handSubsystem != null) { XRHand leftHand = handSubsystem.leftHand; if (leftHand.isTracked) { if (leftHand.GetJoint(XRHandJointID.IndexTip).TryGetPose(out Pose indexTipPose)) { \/\/ indexTipPose.position = position of left index fingertip } } } Gesture Recognition [SerializeField] XRHandGestures gestures; void OnEnable() { gestures.gesturePerformed += OnGesturePerformed; } void OnGesturePerformed(XRHandGesture gesture, Handedness handedness) { Debug.Log($&quot;Gesture: {gesture.gestureName} performed with {handedness}&quot;); } 4. Configuring Interactables Adding an Interactable to an Object Add a\u00a0Collider\u00a0to the object (e.g. Box Collider). Add\u00a0XR Grab Interactable\u00a0for grabbable objects, or\u00a0XR Simple Interactable\u00a0for objects that receive events without being moved. public class MyButton : MonoBehaviour { [SerializeField] XRSimpleInteractable interactable; void OnEnable() { interactable.selectEntered.AddListener(OnSelected); } void OnSelected(SelectEnterEventArgs args) { Debug.Log(&quot;Selected by: &quot; + args.interactorObject); } } Interaction Layer Mask XRIT 3.x uses\u00a0Interaction Layer Masks\u00a0to filter which interactors can interact with which interactables: interactable.interactionLayers = InteractionLayerMask.GetMask(&quot;Default&quot;, &quot;UI&quot;); 5. UI Canvas and Interaction World Space Canvas Create a\u00a0Canvas\u00a0and set\u00a0Render Mode\u00a0to\u00a0World Space. Add the\u00a0Tracked Device Graphic Raycaster\u00a0component to the Canvas (replaces the standard Graphic Raycaster). Add\u00a0XR UI Input Module\u00a0to the EventSystem GameObject in the scene (replaces the default Input System UI Input Module). Recommended Canvas Settings Parameter Recommended Value Render Mode World Space Dynamic Pixels Per Unit 1 Reference Pixels Per Unit 100 Scale 0.001 (for a ~1m canvas = 1000 pixel units) 6. Combining Controller and Hand Tracking On LeonardoXR it is not possible to simultaneously use headset Controllers and full Hand Tracking (with raycast from both hands) due to conflicts between OpenXR profiles. Option A \u2014 Controller Only (Companion Controller) Add\u00a0Microsoft MMRC Profile\u00a0to enabled profiles. Do not add Hand Interaction Profile. The Companion Controller handles pointing; hands can be used as colliders but not as raycast interactors. Option B \u2014 Hands Only (Dual Hand Mode) Add\u00a0Hand Interaction Profile\u00a0to enabled profiles. Do not add Microsoft MMRC Profile. Remove the Device Pointer Prefab from the Controller. Both hands tracked as full interactors; no phone input. Option C \u2014 Controller + One Hand Add\u00a0Microsoft MMRC Profile\u00a0to enabled profiles. Keep only the Right Hand Controller active in the XR Origin. The left hand can still function as a collider and poke interaction trigger, but not as a ray interactor. 7. UniTask \u2014 Asynchronous Operations UniTask 2.5.10 is included as a dependency for high-performance async operations (asset loading, waiting for subsystems, etc.) without GC allocations. using Cysharp.Threading.Tasks; public class HandSubsystemWaiter : MonoBehaviour { async UniTaskVoid Start() { \/\/ Wait until the XR Hands subsystem is ready await UniTask.WaitUntil(() =&gt; XRHandSubsystemUtility.GetSubsystem()?.running ?? false); Debug.Log(&quot;XR Hands subsystem ready.&quot;); } } UniTask is used internally by the LeonardoXR SDK for asynchronous operations. It is recommended to use it in application code as well for consistency with the SDK lifecycle. OpenXR Interaction Profile Reference Profile Use Microsoft Mixed Reality Motion Controller Profile Physical controllers interaction profile Hand Interaction Profile Hand tracking with poke\/pinch interactor LeonardoXR Hand Interaction Profile Hand tracking with poke\/pinch interactor\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.youbiquo.eu\/geckode\/en\/interaction-package-guides\/\" \/>\n<meta property=\"og:site_name\" content=\"Geckode!\" \/>\n<meta property=\"article:modified_time\" content=\"2026-04-09T13:13:39+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.youbiquo.eu\/geckode\/en\/interaction-package-guides\/\",\"url\":\"https:\/\/www.youbiquo.eu\/geckode\/en\/interaction-package-guides\/\",\"name\":\"Interaction Package Guides - Geckode!\",\"isPartOf\":{\"@id\":\"https:\/\/www.youbiquo.eu\/geckode\/#website\"},\"datePublished\":\"2026-04-09T13:10:21+00:00\",\"dateModified\":\"2026-04-09T13:13:39+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.youbiquo.eu\/geckode\/en\/interaction-package-guides\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.youbiquo.eu\/geckode\/en\/interaction-package-guides\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.youbiquo.eu\/geckode\/en\/interaction-package-guides\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.youbiquo.eu\/geckode\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Interaction Package Guides\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.youbiquo.eu\/geckode\/#website\",\"url\":\"https:\/\/www.youbiquo.eu\/geckode\/\",\"name\":\"Geckode!\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/www.youbiquo.eu\/geckode\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.youbiquo.eu\/geckode\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.youbiquo.eu\/geckode\/#organization\",\"name\":\"Geckode!\",\"url\":\"https:\/\/www.youbiquo.eu\/geckode\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.youbiquo.eu\/geckode\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.youbiquo.eu\/geckode\/wp-content\/uploads\/sites\/7\/2026\/02\/Gemini_Generated_Image_ns1dvvns1dvvns1d-e1774014413830.png\",\"contentUrl\":\"https:\/\/www.youbiquo.eu\/geckode\/wp-content\/uploads\/sites\/7\/2026\/02\/Gemini_Generated_Image_ns1dvvns1dvvns1d-e1774014413830.png\",\"width\":778,\"height\":778,\"caption\":\"Geckode!\"},\"image\":{\"@id\":\"https:\/\/www.youbiquo.eu\/geckode\/#\/schema\/logo\/image\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Interaction Package Guides - Geckode!","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.youbiquo.eu\/geckode\/en\/interaction-package-guides\/","og_locale":"en_US","og_type":"article","og_title":"Interaction Package Guides - Geckode!","og_description":"Interaction Package Guide Interaction Package Guide \u2014 LeonardoXR SDK Interaction Package Guides Version 1.0.2 Device: Youbiquo Leonardo XR Base SDK: Snapdragon Spaces 1.0.4 This guide describes how to configure the interaction layer for LeonardoXR applications using standard Unity packages: XR Interaction Toolkit (XRIT) 3.3.0\u00a0\u2014 high-level interaction system for controllers, ray interactors and direct interactors. XR Hands 1.7.2\u00a0\u2014 access to hand joint data and gesture recognition. Dependencies and Versions Package Version Source XR Interaction Toolkit 3.3.0 Unity Registry XR Hands 1.7.2 Unity Registry AR Foundation 6.2.1 Unity Registry Snapdragon Spaces SDK 1.0.4 Tarball (Qualcomm) LeonardoXR SDK 1.0.2 Tarball (Youbiquo) UniTask 2.5.10 Unity Registry NOTE\u00a0All dependencies must be installed as described in the Getting Started guide before proceeding with interaction configuration. 1. XR Interaction Toolkit Configuration Installation Install via\u00a0Window &gt; Package Manager &gt; Unity Registry &gt; XR Interaction Toolkit &gt; Install\u00a0(version 3.3.0). If prompted &#8220;Enable the new input system?&#8221;, click\u00a0Yes. If prompted &#8220;XR Interaction Layer Mask Update Required&#8221;, click\u00a0I Made a Backup, Go Ahead!\u00a0(for new projects) or\u00a0No Thanks\u00a0if no previous XRIT version was present. Import Starter Assets Open\u00a0Window &gt; Package Manager, select\u00a0In Project\u00a0then\u00a0XR Interaction Toolkit. Under\u00a0Samples, click\u00a0Import\u00a0on\u00a0Starter Assets. Also click\u00a0Import\u00a0on\u00a0Hand Interaction Demo\u00a0(required for hand tracking samples). The Starter Assets include: Pre-configured Input Action Asset for XR controllers and hands. Reference prefabs for XR Origin with Ray Interactor and Direct Interactor. Base materials and shaders for interaction visual feedback. Configure Input Actions After import, an\u00a0XRI Default Input Actions\u00a0asset is added to\u00a0Assets\/Samples\/XR Interaction Toolkit\/[version]\/Starter Assets\/. This asset is pre-configured for standard controller profiles (including the Companion Controller via Microsoft MMRC Profile) and for hands. To associate the asset with the system: go to\u00a0Edit &gt; Project Settings &gt; XR Plug-in Management &gt; Input System\u00a0and ensure\u00a0Active Input Handling\u00a0is set to\u00a0Both\u00a0or\u00a0Input System Package (New). 2. Scene Configuration \u2014 XR Origin Base Scene Hierarchy AR Session XR Origin (Action-based) \u2514\u2500\u2500 Camera Offset \u251c\u2500\u2500 Main Camera (tagged \"MainCamera\") \u251c\u2500\u2500 LeftHand Controller \u2502 \u251c\u2500\u2500 XR Ray Interactor (left) \u2502 \u2514\u2500\u2500 XR Direct Interactor (left) \u2514\u2500\u2500 RightHand Controller \u251c\u2500\u2500 XR Ray Interactor (right) \u2514\u2500\u2500 XR Direct Interactor (right) Create the base structure by selecting\u00a0GameObject &gt; XR &gt; XR Origin (Action-based). NOTE\u00a0Disable\u00a0AR Camera Background\u00a0\u2014 not supported on LeonardoXR and automatically disabled at runtime. Also disable\u00a0AR Camera Manager\u00a0if not retrieving RGB frames from the camera. Input Action Manager Add the\u00a0Input Action Manager\u00a0component to the XR Origin (or a persistent GameObject). In the\u00a0Action Assets\u00a0field, assign: XR Input Actions\u00a0(from\u00a0Samples\/LeonardoXR SDK\/[version]\/Core Samples\/Shared Assets). 3. XR Hands Configuration Installation Install via\u00a0Window &gt; Package Manager &gt; Unity Registry &gt; XR Hands &gt; Install\u00a0(version 1.7.2). Import Hand Samples Open\u00a0Window &gt; Package Manager &gt; In Project &gt; XR Hands &gt; Samples\u00a0and import: Gestures\u00a0\u2014 gesture recognition system. Hand Visualizer\u00a0\u2014 hand mesh visualisation. Enable Hand Tracking Subsystem Go to\u00a0Edit &gt; Project Settings &gt; XR Plug-in Management &gt; OpenXR\u00a0(Android tab). Under\u00a0All Features, enable\u00a0Hand Tracking Subsystem. Also enable\u00a0Hand Tracking\u00a0in the Snapdragon Spaces feature group. NOTE\u00a0The Hand Tracking Subsystem must be enabled in\u00a0All Features\u00a0\u2014 not just in the Snapdragon Spaces section \u2014 to work correctly on LeonardoXR. Hand Data Access via XR Hands API using UnityEngine.XR.Hands; XRHandSubsystem handSubsystem = XRHandSubsystemUtility.GetSubsystem(); if (handSubsystem != null) { XRHand leftHand = handSubsystem.leftHand; if (leftHand.isTracked) { if (leftHand.GetJoint(XRHandJointID.IndexTip).TryGetPose(out Pose indexTipPose)) { \/\/ indexTipPose.position = position of left index fingertip } } } Gesture Recognition [SerializeField] XRHandGestures gestures; void OnEnable() { gestures.gesturePerformed += OnGesturePerformed; } void OnGesturePerformed(XRHandGesture gesture, Handedness handedness) { Debug.Log($\"Gesture: {gesture.gestureName} performed with {handedness}\"); } 4. Configuring Interactables Adding an Interactable to an Object Add a\u00a0Collider\u00a0to the object (e.g. Box Collider). Add\u00a0XR Grab Interactable\u00a0for grabbable objects, or\u00a0XR Simple Interactable\u00a0for objects that receive events without being moved. public class MyButton : MonoBehaviour { [SerializeField] XRSimpleInteractable interactable; void OnEnable() { interactable.selectEntered.AddListener(OnSelected); } void OnSelected(SelectEnterEventArgs args) { Debug.Log(\"Selected by: \" + args.interactorObject); } } Interaction Layer Mask XRIT 3.x uses\u00a0Interaction Layer Masks\u00a0to filter which interactors can interact with which interactables: interactable.interactionLayers = InteractionLayerMask.GetMask(\"Default\", \"UI\"); 5. UI Canvas and Interaction World Space Canvas Create a\u00a0Canvas\u00a0and set\u00a0Render Mode\u00a0to\u00a0World Space. Add the\u00a0Tracked Device Graphic Raycaster\u00a0component to the Canvas (replaces the standard Graphic Raycaster). Add\u00a0XR UI Input Module\u00a0to the EventSystem GameObject in the scene (replaces the default Input System UI Input Module). Recommended Canvas Settings Parameter Recommended Value Render Mode World Space Dynamic Pixels Per Unit 1 Reference Pixels Per Unit 100 Scale 0.001 (for a ~1m canvas = 1000 pixel units) 6. Combining Controller and Hand Tracking On LeonardoXR it is not possible to simultaneously use headset Controllers and full Hand Tracking (with raycast from both hands) due to conflicts between OpenXR profiles. Option A \u2014 Controller Only (Companion Controller) Add\u00a0Microsoft MMRC Profile\u00a0to enabled profiles. Do not add Hand Interaction Profile. The Companion Controller handles pointing; hands can be used as colliders but not as raycast interactors. Option B \u2014 Hands Only (Dual Hand Mode) Add\u00a0Hand Interaction Profile\u00a0to enabled profiles. Do not add Microsoft MMRC Profile. Remove the Device Pointer Prefab from the Controller. Both hands tracked as full interactors; no phone input. Option C \u2014 Controller + One Hand Add\u00a0Microsoft MMRC Profile\u00a0to enabled profiles. Keep only the Right Hand Controller active in the XR Origin. The left hand can still function as a collider and poke interaction trigger, but not as a ray interactor. 7. UniTask \u2014 Asynchronous Operations UniTask 2.5.10 is included as a dependency for high-performance async operations (asset loading, waiting for subsystems, etc.) without GC allocations. using Cysharp.Threading.Tasks; public class HandSubsystemWaiter : MonoBehaviour { async UniTaskVoid Start() { \/\/ Wait until the XR Hands subsystem is ready await UniTask.WaitUntil(() =&gt; XRHandSubsystemUtility.GetSubsystem()?.running ?? false); Debug.Log(\"XR Hands subsystem ready.\"); } } UniTask is used internally by the LeonardoXR SDK for asynchronous operations. It is recommended to use it in application code as well for consistency with the SDK lifecycle. OpenXR Interaction Profile Reference Profile Use Microsoft Mixed Reality Motion Controller Profile Physical controllers interaction profile Hand Interaction Profile Hand tracking with poke\/pinch interactor LeonardoXR Hand Interaction Profile Hand tracking with poke\/pinch interactor","og_url":"https:\/\/www.youbiquo.eu\/geckode\/en\/interaction-package-guides\/","og_site_name":"Geckode!","article_modified_time":"2026-04-09T13:13:39+00:00","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.youbiquo.eu\/geckode\/en\/interaction-package-guides\/","url":"https:\/\/www.youbiquo.eu\/geckode\/en\/interaction-package-guides\/","name":"Interaction Package Guides - Geckode!","isPartOf":{"@id":"https:\/\/www.youbiquo.eu\/geckode\/#website"},"datePublished":"2026-04-09T13:10:21+00:00","dateModified":"2026-04-09T13:13:39+00:00","breadcrumb":{"@id":"https:\/\/www.youbiquo.eu\/geckode\/en\/interaction-package-guides\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.youbiquo.eu\/geckode\/en\/interaction-package-guides\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.youbiquo.eu\/geckode\/en\/interaction-package-guides\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.youbiquo.eu\/geckode\/"},{"@type":"ListItem","position":2,"name":"Interaction Package Guides"}]},{"@type":"WebSite","@id":"https:\/\/www.youbiquo.eu\/geckode\/#website","url":"https:\/\/www.youbiquo.eu\/geckode\/","name":"Geckode!","description":"","publisher":{"@id":"https:\/\/www.youbiquo.eu\/geckode\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.youbiquo.eu\/geckode\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.youbiquo.eu\/geckode\/#organization","name":"Geckode!","url":"https:\/\/www.youbiquo.eu\/geckode\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.youbiquo.eu\/geckode\/#\/schema\/logo\/image\/","url":"https:\/\/www.youbiquo.eu\/geckode\/wp-content\/uploads\/sites\/7\/2026\/02\/Gemini_Generated_Image_ns1dvvns1dvvns1d-e1774014413830.png","contentUrl":"https:\/\/www.youbiquo.eu\/geckode\/wp-content\/uploads\/sites\/7\/2026\/02\/Gemini_Generated_Image_ns1dvvns1dvvns1d-e1774014413830.png","width":778,"height":778,"caption":"Geckode!"},"image":{"@id":"https:\/\/www.youbiquo.eu\/geckode\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.youbiquo.eu\/geckode\/wp-json\/wp\/v2\/pages\/1121","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.youbiquo.eu\/geckode\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/www.youbiquo.eu\/geckode\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/www.youbiquo.eu\/geckode\/wp-json\/wp\/v2\/users\/11"}],"replies":[{"embeddable":true,"href":"https:\/\/www.youbiquo.eu\/geckode\/wp-json\/wp\/v2\/comments?post=1121"}],"version-history":[{"count":7,"href":"https:\/\/www.youbiquo.eu\/geckode\/wp-json\/wp\/v2\/pages\/1121\/revisions"}],"predecessor-version":[{"id":1129,"href":"https:\/\/www.youbiquo.eu\/geckode\/wp-json\/wp\/v2\/pages\/1121\/revisions\/1129"}],"wp:attachment":[{"href":"https:\/\/www.youbiquo.eu\/geckode\/wp-json\/wp\/v2\/media?parent=1121"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}