【XR手柄交互】Unity 中使用 InputActions 實現手柄控制詳解(基于 OpenXR + Unity新輸入系統(Input Actions))

摘要:
本文主要介紹如何使用 Input Actions(Unity 新輸入系統)+ OpenXR 來實現 VR手柄控制(監聽ABXY按鈕、搖桿、抓握等操作)

圖片為AI生成


🎮 Unity 中使用 InputActions 實現手柄控制詳解(基于 OpenXR + 新輸入系統)


? 一、環境準備

必要組件

  • Unity 2021.3 或以上(推薦使用 LTS 版本)
  • 已啟用 XR 插件管理器,并為目標平臺啟用 OpenXR
  • 安裝以下 Package:
    • Input System
    • OpenXR Plugin

啟用 OpenXR

Edit > Project Settings > XR Plug-in Management > OpenXR

然后啟用 OpenXR 的 Interaction Profiles:

  • OpenXR Feature Group > Interaction Profiles
    • ? Oculus Touch Controller
    • ? Valve Index Controller
    • ? Microsoft Mixed Reality Controller

🧱 二、創建 Input Actions 文件

1. 創建 Action 文件

Assets 文件夾中右鍵點擊:

Create > Input Actions

重命名為:XRControls.inputactions

雙擊打開,會出現如下結構編輯界面:


2. 添加 Action Map 和 Actions

示例:創建兩個 Action Maps
  • XRI LeftHand
  • XRI RightHand
XRI RightHand 中添加這些動作:
Action NameAction TypeControl TypeBinding Path
selectButtonButton<XRController>{RightHand}/trigger
activateButtonButton<XRController>{RightHand}/grip
positionValueVector3<XRController>{RightHand}/devicePosition
rotationValueQuaternion<XRController>{RightHand}/deviceRotation
joystickValueVector2<XRController>{RightHand}/thumbstick
primaryButtonButtonButton<XRController>{RightHand}/primaryButton
secondaryButtonButtonButton<XRController>{RightHand}/secondaryButton

💡 注意:ABXY 按鈕在默認的 XRI Default Input Actions 文件中 沒有綁定,需要你手動添加綁定。

對于左手 X/Y 按鈕,可添加:
  • <XRController>{LeftHand}/primaryButton → X 按鈕
  • <XRController>{LeftHand}/secondaryButton → Y 按鈕

配置完成后,點擊 Save。


🔌 三、綁定 Action 到腳本中監聽手柄輸入

1. 創建腳本:XRControllerInputListener.cs

using UnityEngine;
using UnityEngine.InputSystem;public class XRControllerInputListener : MonoBehaviour
{[Header("輸入綁定")]public InputActionProperty selectAction;public InputActionProperty activateAction;public InputActionProperty joystickAction;public InputActionProperty positionAction;public InputActionProperty rotationAction;[Header("主按鈕(ABXY)")]public InputActionProperty rightPrimaryButton;   // A 按鈕public InputActionProperty rightSecondaryButton; // B 按鈕public InputActionProperty leftPrimaryButton;    // X 按鈕public InputActionProperty leftSecondaryButton;  // Y 按鈕void OnEnable(){selectAction.action.Enable();activateAction.action.Enable();joystickAction.action.Enable();positionAction.action.Enable();rotationAction.action.Enable();rightPrimaryButton.action.Enable();rightSecondaryButton.action.Enable();leftPrimaryButton.action.Enable();leftSecondaryButton.action.Enable();selectAction.action.performed += OnSelectPressed;activateAction.action.performed += OnGripPressed;rightPrimaryButton.action.performed += ctx => Debug.Log("A 按鈕按下");rightPrimaryButton.action.canceled  += ctx => Debug.Log("A 按鈕抬起");rightSecondaryButton.action.performed += ctx => Debug.Log("B 按鈕按下");leftPrimaryButton.action.performed     += ctx => Debug.Log("X 按鈕按下");leftSecondaryButton.action.performed   += ctx => Debug.Log("Y 按鈕按下");}void OnDisable(){selectAction.action.performed -= OnSelectPressed;activateAction.action.performed -= OnGripPressed;}void OnSelectPressed(InputAction.CallbackContext ctx){Debug.Log("Trigger pressed");}void OnGripPressed(InputAction.CallbackContext ctx){Debug.Log("Grip pressed");}void Update(){// 搖桿值Vector2 joystick = joystickAction.action.ReadValue<Vector2>();if (joystick.magnitude > 0.1f){Debug.Log($"Joystick: {joystick}");}// 控制器位置Vector3 pos = positionAction.action.ReadValue<Vector3>();Quaternion rot = rotationAction.action.ReadValue<Quaternion>();transform.SetPositionAndRotation(pos, rot);}
}

2. 綁定 InputActionProperty 到 Inspector

選中綁定此腳本的 GameObject,在 Inspector 中:

  • 展開每個字段(例如 rightPrimaryButton
  • 選擇 InputActionAsset 中的:
    • XRI RightHand/primaryButton
    • XRI RightHand/secondaryButton
    • XRI LeftHand/primaryButton
    • XRI LeftHand/secondaryButton

📌 常用輸入綁定路徑(OpenXR)

控制器部位Binding Path
扳機 Trigger<XRController>{RightHand}/trigger
抓握 Grip<XRController>{RightHand}/grip
主按鈕 A/B/X/Y<XRController>{RightHand}/primaryButton
搖桿方向<XRController>{RightHand}/thumbstick
搖桿點擊<XRController>{RightHand}/thumbstickClick
控制器位置<XRController>{RightHand}/devicePosition
控制器旋轉<XRController>{RightHand}/deviceRotation

? 如果仍想使用默認 XRIActions 文件怎么辦?

可以這樣做:

  1. 復制一份 XRI Default Input Actions.inputactions
  2. 重命名為你自己的(比如 XRControls.inputactions
  3. 添加上述的 ABXY Action
  4. Project Settings > XR Interaction Toolkit 中替換為你的版本

? 總結

通過 Unity 的 Input System + OpenXR,可以優雅地實現對手柄各種輸入(按鈕、搖桿、位置等)的監聽和處理。其優勢是:

  • 自動適配各種頭顯(Oculus、Index、Pico)
  • 支持多平臺一致性
  • 易于拓展和可視化調試

同時補充支持 ABXY 按鈕,只需擴展綁定路徑與監聽邏輯即可,無需重新實現控制器系統。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/902853.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/902853.shtml
英文地址,請注明出處:http://en.pswp.cn/news/902853.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java實現網格交易回測

以下是一個基于Java實現的簡單網格交易回測程序框架&#xff0c;以證券ETF&#xff08;512880&#xff09;為例。代碼包含歷史數據加載、網格策略邏輯和基礎統計指標&#xff1a; import java.io.BufferedReader; import java.io.FileReader; import java.text.ParseException…

探秘 3D 展廳之卓越優勢,解鎖沉浸式體驗新境界

&#xff08;一&#xff09;打破時空枷鎖&#xff0c;全球觸達? 3D 展廳的首要優勢便是打破了時空限制。在傳統展廳中&#xff0c;觀眾需要親臨現場&#xff0c;且必須在展廳開放的特定時間內參觀。而 3D 展廳依托互聯網&#xff0c;讓觀眾無論身處世界哪個角落&#xff0c;只…

第十二屆藍橋杯 2021 C/C++組 直線

目錄 題目&#xff1a; 題目描述&#xff1a; 題目鏈接&#xff1a; 思路&#xff1a; 核心思路&#xff1a; 兩點確定一條直線&#xff1a; 思路詳解&#xff1a; 代碼&#xff1a; 第一種方式代碼詳解&#xff1a; 第二種方式代碼詳解&#xff1a; 題目&#xff1a;…

微信小程序藍牙連接打印機打印單據完整Demo【藍牙小票打印】

文章目錄 一、準備工作1. 硬件準備2. 開發環境 二、小程序配置1. 修改app.json 三、完整代碼實現1. pages/index/index.wxml2. pages/index/index.wxss3. pages/index/index.js 四、ESC/POS指令說明五、測試流程六、常見問題解決七、進一步優化建議 下面我將提供一個完整的微信…

ubuntu opencv 安裝

1.ubuntu opencv 安裝 在Ubuntu系統中安裝OpenCV&#xff0c;可以通過多種方式進行&#xff0c;以下是一種常用的安裝方法&#xff0c;包括從源代碼編譯安裝。請注意&#xff0c;安裝步驟可能會因OpenCV的版本和Ubuntu系統的具體版本而略有不同。 一、安裝準備 更新系統&…

【C++】class靜態常量

Usage: static const T 1 background static const成員屬于類&#xff0c;而不是類的實例&#xff0c;所以它們的初始化需要在類外進行(或者在C17之后可以用inline初始化)。 使用中可能遇到的情況&#xff1a; 在頭文件中聲明一個static const成員&#xff0c;然后在多個cpp…

Java 安全:如何防止 DDoS 攻擊?

一、DDoS 攻擊簡介 DDoS&#xff08;分布式拒絕服務&#xff09;攻擊是一種常見的網絡攻擊手段&#xff0c;攻擊者通過控制大量的僵尸主機向目標服務器發送海量請求&#xff0c;致使服務器資源耗盡&#xff0c;無法正常響應合法用戶請求。在 Java 應用開發中&#xff0c;了解 …

統計文件中單詞出現的次數并累計

# 統計單詞出現次數 fileopen("E:\Dasktape/python_test.txt","r",encoding"UTF-8") f1file.read() # 讀取文件 countf1.count("is") # 統計文件中is 單詞出現的次數 print(f"此文件中單詞is出現了{count}次")# 2.判斷單詞出…

C語言實現貪心算法

一、貪心算法核心思想 特征&#xff1a;在每一步選擇中都采取當前狀態下最優&#xff08;局部最優&#xff09;的選擇&#xff0c;從而希望導致全局最優解 適用場景&#xff1a;需要滿足貪心選擇性質和最優子結構性質 二、經典貪心算法示例 1. 活動選擇問題 目標&#xff1a…

《一文讀懂Transformers庫:開啟自然語言處理新世界的大門》

《一文讀懂Transformers庫:開啟自然語言處理新世界的大門》 GitHub - huggingface/transformers: ?? Transformers: State-of-the-art Machine Learning for Pytorch, TensorFlow, and JAX. HF-Mirror Hello! Transformers快速入門 pip install transformers -i https:/…

Vue里面elementUi-aside 和el-main不垂直排列

先說解決方法 main.js少導包 import element-ui/lib/theme-chalk/index.css; //加入此行即可 問題復現 排查了一個小時終于找出來問題了&#xff0c;建議導包去看官方的文檔&#xff0c;作者就是因為看了別人的導包流程導致的問題 導包官網地址Element UI導包快速入門

MYSQL 常用字符串函數 和 時間函數詳解

一、字符串函數 1、?CONCAT(str1, str2, …) 拼接多個字符串。 SELECT CONCAT(Hello, , World); -- 輸出 Hello World2、SUBSTRING(str, start, length)?? 或 ?SUBSTR() 截取字符串。 SELECT SUBSTRING(MySQL, 3, 2); -- 輸出 SQ3、LENGTH(str)?? 與 ?CHAR_LENGTH…

Python-Agent調用多個Server-FastAPI版本

Python-Agent調用多個Server-FastAPI版本 Agent調用多個McpServer進行工具調用 1-核心知識點 fastAPI的快速使用agent調用多個server 2-思路整理 1&#xff09;先把每個子服務搭建起來2&#xff09;再暴露一個Agent 3-參考網址 VSCode配置Python開發環境&#xff1a;https:/…

Drools+自定義規則庫

文章目錄 前言一、創建規則庫二、SpringBootDrools程序1.Maven依賴2.application.yml3.Mapper.xml4.Drools配置類5.Service6.Contoller7.測試接口 前言 公司的技術方案想搭建Drools自定義規則庫配合大模型進行數據的校驗。本篇用來記錄使用SpringBoot配合Drools開發Demo程序。…

潮了 低配電腦6G顯存生成60秒AI視頻 本地部署/一鍵包/云算力部署/批量生成

最近發現了一個讓人眼前一亮的工具——FramePack&#xff0c;它能用一塊普通的6GB顯存筆記本GPU&#xff0c;生成60秒電影級的高清視頻畫面&#xff0c;效果堪稱炸裂&#xff01;那么我們就把他本地部署起來玩一玩、下載離線一鍵整合包&#xff0c;或者是用云算力快速上手。接下…

【藍橋杯選拔賽真題104】Scratch回文數 第十五屆藍橋杯scratch圖形化編程 少兒編程創意編程選拔賽真題解析

目錄 scratch回文數 一、題目要求 1、準備工作 2、功能實現 二、案例分析 1、角色分析 2、背景分析 3、前期準備 三、解題思路 四、程序編寫 五、考點分析 六、推薦資料 1、scratch資料 2、python資料 3、C++資料 scratch回文數 第十五屆青少年藍橋杯scratch編…

大廠面試-框架篇

前言 本章內容來自B站黑馬程序員java大廠面試題和小林coding 博主學習筆記&#xff0c;如果有不對的地方&#xff0c;海涵。 如果這篇文章對你有幫助&#xff0c;可以點點關注&#xff0c;點點贊&#xff0c;謝謝你&#xff01; 1.Spring 1.1 Spring框架中的單例bean是線程…

【AI 加持下的 Python 編程實戰 2_10】DIY 拓展:從掃雷小游戲開發再探問題分解與 AI 代碼調試能力(中)

文章目錄 DIY 實戰&#xff1a;從掃雷小游戲開發再探問題分解能力3 問題分解實戰&#xff08;自頂向下&#xff09;3.2 頁面渲染邏輯3.3 事件綁定邏輯 4 代碼實現&#xff08;自底向上&#xff09;4.1 頁面渲染部分4.2 事件綁定部分 寫在前面 本篇將利用《Learn AI-assisted Py…

微信小程序開發1------微信小程序中的消息提示框總結

微信小程序中的消息提示框主要分為以下幾種&#xff1a; 1. wx.showToast(Object object) 功能&#xff1a; 顯示消息提示框&#xff0c;一般用于顯示操作結果、狀態等。 特點&#xff1a; 提示框顯示在屏幕中間&#xff0c;持續一段時間后自動消失&#xff08;默認1.5秒&…

AI 場景落地:API 接口服務 VS 本地部署,哪種更適合?

在當前 AI 技術迅猛發展的背景下&#xff0c;企業在實現 AI 場景落地時&#xff0c;面臨著一個關鍵抉擇&#xff1a;是選擇各大廠商提供的 API 接口服務&#xff0c;還是進行本地化部署&#xff1f;這不僅關乎成本、性能和安全性&#xff0c;還涉及到技術架構、數據治理和長期戰…