From d4cf4d727df3c6b8f1ef76deca6a4b8001859781 Mon Sep 17 00:00:00 2001 From: JaXt0r Date: Thu, 22 Oct 2026 16:31:36 +0200 Subject: [PATCH 1/2] feat: XR Interaction Simulator for the Xri backend (EnableVRDeviceSimulator) with an on-screen key list (F1), keyboard shortcuts only while it runs (jump Space, crouch X, sprint F, menu Esc), point-and-click on the rig's controllers and swim strokes from simulated controller movement; CI job builds the VR targets without HVR (HVR phase 1d). No player-visible change on the default Hvr backend. Co-Authored-By: Claude Opus 5.5 --- .github/workflows/test_and_build.yml | 70 +- Assets/Gothic-Lab/Scenes/Lab.unity | 62 + .../Resources/VR/Input/GothicVR.inputactions | 29 +- .../VR - XR Interaction Simulator.prefab | 1098 +++++++++++++++++ .../VR - XR Interaction Simulator.prefab.meta | 7 + Assets/Gothic-VR/Scenes/VR/Player.unity | 62 + .../Scripts/Adapters/Player/VRPlayer.cs | 2 +- .../Interaction/Backends/Hvr/HvrInput.cs | 2 + .../Interaction/Backends/Xri/XriBackend.cs | 6 +- .../Interaction/Backends/Xri/XriInput.cs | 84 +- .../Backends/Xri/XriSimulatorControlsGUI.cs | 92 ++ .../Xri/XriSimulatorControlsGUI.cs.meta | 2 + .../Scripts/Interaction/Ports/IVrInput.cs | 6 + Assets/Gothic-VR/Simulator.meta | 8 + ...teraction Controller Controls.inputactions | 417 +++++++ ...tion Controller Controls.inputactions.meta | 14 + ...nteraction Simulator Controls.inputactions | 612 +++++++++ ...ction Simulator Controls.inputactions.meta | 14 + .../phase-1-rig-input-locomotion-ui.md | 69 +- 19 files changed, 2614 insertions(+), 42 deletions(-) create mode 100644 Assets/Gothic-VR/Resources/VR/Prefabs/VR - XR Interaction Simulator.prefab create mode 100644 Assets/Gothic-VR/Resources/VR/Prefabs/VR - XR Interaction Simulator.prefab.meta create mode 100644 Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriSimulatorControlsGUI.cs create mode 100644 Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriSimulatorControlsGUI.cs.meta create mode 100644 Assets/Gothic-VR/Simulator.meta create mode 100644 Assets/Gothic-VR/Simulator/XR Interaction Controller Controls.inputactions create mode 100644 Assets/Gothic-VR/Simulator/XR Interaction Controller Controls.inputactions.meta create mode 100644 Assets/Gothic-VR/Simulator/XR Interaction Simulator Controls.inputactions create mode 100644 Assets/Gothic-VR/Simulator/XR Interaction Simulator Controls.inputactions.meta diff --git a/.github/workflows/test_and_build.yml b/.github/workflows/test_and_build.yml index cc1ced3c3..166a7c1d2 100644 --- a/.github/workflows/test_and_build.yml +++ b/.github/workflows/test_and_build.yml @@ -10,21 +10,55 @@ env: HVRversion: 'v2.9.3.a-Unity-6' jobs: - ######### - # DEV COMPILE WITHOUT HVR # - ######### - testCompileWithoutHVR: - name: Compile test without HVR installation + ########################## + # BUILD WITHOUT HVR (XRI) # + ########################## + # Builds the VR targets without the private HVR repo and without GOTHIC_HVR_INSTALLED. The DeveloperConfig + # still requests the Hvr backend; VRContextBootstrap falls back to the Xri backend (XR Interaction Toolkit) when + # HVR isn't compiled in. Same label as the HVR build, or "pipeline-test-build-xri" for this job only. + buildWithoutHVR: + if: ${{ github.event.label.name == 'pipeline-test-build' || github.event.label.name == 'pipeline-test-build-xri' }} + name: Build Gothic without HVR (Xri backend) runs-on: ubuntu-latest - # disabled - Let's re-enable once we implement Flat implementation. - if: false && github.event.pull_request.draft == false + strategy: + fail-fast: true + matrix: + include: + - targetPlatform: StandaloneWindows64 + targetDevice: Windows64 + - targetPlatform: Android + targetDevice: Pico + - targetPlatform: Android + targetDevice: Quest steps: + - name: Free Disk Space (Ubuntu) + uses: jlumbroso/free-disk-space@main + with: + tool-cache: false + - name: Checkout repository uses: actions/checkout@v4 with: clean: true - - name: Remove PlayerSetting HVR symbol temporarily - run: sed -i 's/GOTHIC_HVR_INSTALLED/GOTHIC_PLACEHOLDER/g' ProjectSettings/ProjectSettings.asset + # Own cache key: the Library compiled with HVR must not be reused here (and the other way round). + - uses: actions/cache@v4 + with: + path: Library + key: Library-Xri-${{ matrix.targetPlatform }} + restore-keys: Library-Xri- + + - name: Remove PlayerSetting HVR symbol + run: | + sed -i 's/GOTHIC_HVR_INSTALLED;\?//g' ProjectSettings/ProjectSettings.asset + if grep -q 'GOTHIC_HVR_INSTALLED' ProjectSettings/ProjectSettings.asset; then + echo "GOTHIC_HVR_INSTALLED is still set in ProjectSettings.asset" + exit 1 + fi + if [ -d Assets/HurricaneVR ]; then + echo "Assets/HurricaneVR must not exist for this build" + exit 1 + fi + - name: Build project uses: game-ci/unity-builder@v4 env: @@ -32,9 +66,23 @@ jobs: UNITY_EMAIL: ${{ secrets.UNITY_EMAIL }} UNITY_PASSWORD: ${{ secrets.UNITY_PASSWORD }} with: - targetPlatform: StandaloneWindows64 + targetPlatform: ${{ matrix.targetPlatform }} allowDirtyBuild: true - buildMethod: Gothic.VR.Editor.VRBuilderActions.PerformWindows64Build + buildMethod: Gothic.VR.Editor.VRBuilderActions.Perform${{ matrix.targetDevice }}Build + # Android Keystore settings + androidKeystoreBase64: ${{ secrets.ANDROID_KEYSTORE_BASE64 }} + androidKeystoreName: Gothic.keystore + customParameters: > + -keystoreName "Gothic.keystore" + -keystorePass "${{ secrets.ANDROID_KEYSTORE_PASS }}" + -keyaliasName "${{ secrets.ANDROID_KEYALIAS_NAME }}" + -keyaliasPass "${{ secrets.ANDROID_KEYALIAS_PASS }}" + + - uses: actions/upload-artifact@v4 + with: + name: Gothic-Unity-${{ matrix.targetDevice }}-Xri + path: Builds/${{ matrix.targetDevice }} + retention-days: 7 diff --git a/Assets/Gothic-Lab/Scenes/Lab.unity b/Assets/Gothic-Lab/Scenes/Lab.unity index e98921661..db6180d35 100644 --- a/Assets/Gothic-Lab/Scenes/Lab.unity +++ b/Assets/Gothic-Lab/Scenes/Lab.unity @@ -7004,6 +7004,67 @@ MonoBehaviour: m_FlexibleWidth: 1 m_FlexibleHeight: -1 m_LayoutPriority: 1 +--- !u!1001 &824432547 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 8135023674665499069, guid: 46fcf28ff6eb0db4d9951a3d7a830b58, type: 3} + propertyPath: m_Name + value: VR - XR Interaction Simulator + objectReference: {fileID: 0} + - target: {fileID: 8135023674665499069, guid: 46fcf28ff6eb0db4d9951a3d7a830b58, type: 3} + propertyPath: m_IsActive + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8518324294302271954, guid: 46fcf28ff6eb0db4d9951a3d7a830b58, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8518324294302271954, guid: 46fcf28ff6eb0db4d9951a3d7a830b58, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8518324294302271954, guid: 46fcf28ff6eb0db4d9951a3d7a830b58, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8518324294302271954, guid: 46fcf28ff6eb0db4d9951a3d7a830b58, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 8518324294302271954, guid: 46fcf28ff6eb0db4d9951a3d7a830b58, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8518324294302271954, guid: 46fcf28ff6eb0db4d9951a3d7a830b58, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8518324294302271954, guid: 46fcf28ff6eb0db4d9951a3d7a830b58, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8518324294302271954, guid: 46fcf28ff6eb0db4d9951a3d7a830b58, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8518324294302271954, guid: 46fcf28ff6eb0db4d9951a3d7a830b58, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8518324294302271954, guid: 46fcf28ff6eb0db4d9951a3d7a830b58, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 46fcf28ff6eb0db4d9951a3d7a830b58, type: 3} --- !u!1 &826442470 GameObject: m_ObjectHideFlags: 0 @@ -20461,6 +20522,7 @@ SceneRoots: - {fileID: 1042196316} - {fileID: 1122706743} - {fileID: 1020358201} + - {fileID: 824432547} - {fileID: 1620998804} - {fileID: 1046231032} - {fileID: 905288120} diff --git a/Assets/Gothic-VR/Resources/VR/Input/GothicVR.inputactions b/Assets/Gothic-VR/Resources/VR/Input/GothicVR.inputactions index dd56af770..c486c0e29 100644 --- a/Assets/Gothic-VR/Resources/VR/Input/GothicVR.inputactions +++ b/Assets/Gothic-VR/Resources/VR/Input/GothicVR.inputactions @@ -408,7 +408,7 @@ "path": "{LeftHand}/{SecondaryButton}", "interactions": "", "processors": "", - "groups": "", + "groups": "XR", "action": "Menu", "isComposite": false, "isPartOfComposite": false @@ -419,7 +419,7 @@ "path": "/escape", "interactions": "", "processors": "", - "groups": "", + "groups": "Simulator", "action": "Menu", "isComposite": false, "isPartOfComposite": false @@ -430,7 +430,7 @@ "path": "{RightHand}/{PrimaryButton}", "interactions": "", "processors": "", - "groups": "", + "groups": "XR", "action": "Jump", "isComposite": false, "isPartOfComposite": false @@ -441,7 +441,7 @@ "path": "/space", "interactions": "", "processors": "", - "groups": "", + "groups": "Simulator", "action": "Jump", "isComposite": false, "isPartOfComposite": false @@ -452,18 +452,7 @@ "path": "{RightHand}/{SecondaryButton}", "interactions": "", "processors": "", - "groups": "", - "action": "Crouch", - "isComposite": false, - "isPartOfComposite": false - }, - { - "name": "", - "id": "e3f30bb9-cd1c-4fc6-9531-d5d9421cc255", - "path": "/z", - "interactions": "", - "processors": "", - "groups": "", + "groups": "XR", "action": "Crouch", "isComposite": false, "isPartOfComposite": false @@ -474,7 +463,7 @@ "path": "/x", "interactions": "", "processors": "", - "groups": "", + "groups": "Simulator", "action": "Crouch", "isComposite": false, "isPartOfComposite": false @@ -485,7 +474,7 @@ "path": "{LeftHand}/{Primary2DAxisClick}", "interactions": "", "processors": "", - "groups": "", + "groups": "XR", "action": "Sprint", "isComposite": false, "isPartOfComposite": false @@ -493,10 +482,10 @@ { "name": "", "id": "8810bed4-d1c4-48a4-972b-93cc6086cafe", - "path": "/leftShift", + "path": "/f", "interactions": "", "processors": "", - "groups": "", + "groups": "Simulator", "action": "Sprint", "isComposite": false, "isPartOfComposite": false diff --git a/Assets/Gothic-VR/Resources/VR/Prefabs/VR - XR Interaction Simulator.prefab b/Assets/Gothic-VR/Resources/VR/Prefabs/VR - XR Interaction Simulator.prefab new file mode 100644 index 000000000..65b75faf3 --- /dev/null +++ b/Assets/Gothic-VR/Resources/VR/Prefabs/VR - XR Interaction Simulator.prefab @@ -0,0 +1,1098 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &8135023674665499069 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8518324294302271954} + - component: {fileID: 6900676903622151380} + - component: {fileID: 3966192772413791964} + - component: {fileID: 9147200356447112767} + - component: {fileID: 8031605675589883834} + - component: {fileID: 8763304602052374922} + m_Layer: 0 + m_Name: VR - XR Interaction Simulator + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &8518324294302271954 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8135023674665499069} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &6900676903622151380 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8135023674665499069} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: da1bb8ac6d49b4bbe8d0a43005a26072, type: 3} + m_Name: + m_EditorClassIdentifier: + m_CameraTransform: {fileID: 0} + m_LeftControllerTransform: {fileID: 0} + m_RightControllerTransform: {fileID: 0} + m_LeftHandAimTransform: {fileID: 0} + m_RightHandAimTransform: {fileID: 0} + m_DeviceLifecycleManager: {fileID: 3966192772413791964} + m_HandPlaybackManager: {fileID: 8031605675589883834} + m_InteractionSimulatorUI: {fileID: 0} + m_HMDIsTracked: 1 + m_HMDTrackingState: 3 + m_LeftControllerIsTracked: 1 + m_LeftControllerTrackingState: 3 + m_RightControllerIsTracked: 1 + m_RightControllerTrackingState: 3 + m_LeftHandIsTracked: 1 + m_RightHandIsTracked: 1 + m_TranslateXInput: + m_InputSourceMode: 2 + m_InputAction: + m_Name: Translate X Input + m_Type: 0 + m_ExpectedControlType: Vector2 + m_Id: 5822c4b4-a664-465e-a057-233b967c1623 + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionReference: {fileID: -3200219634954553115, guid: f52857e8660fd2a48aa592e1c5b0908c, type: 3} + m_ObjectReferenceObject: {fileID: 0} + m_ManualValue: 0 + m_TranslateYInput: + m_InputSourceMode: 2 + m_InputAction: + m_Name: Translate Y Input + m_Type: 0 + m_ExpectedControlType: Vector2 + m_Id: 3f2f90b6-a0f8-45d2-ac53-519eebb2380b + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionReference: {fileID: -5752695439704788112, guid: f52857e8660fd2a48aa592e1c5b0908c, type: 3} + m_ObjectReferenceObject: {fileID: 0} + m_ManualValue: 0 + m_TranslateZInput: + m_InputSourceMode: 2 + m_InputAction: + m_Name: Translate Z Input + m_Type: 0 + m_ExpectedControlType: Vector2 + m_Id: 235215a3-88db-45ef-ad35-3c87287d607f + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionReference: {fileID: 4902220377737472081, guid: f52857e8660fd2a48aa592e1c5b0908c, type: 3} + m_ObjectReferenceObject: {fileID: 0} + m_ManualValue: 0 + m_ToggleManipulateLeftInput: + m_InputSourceMode: 2 + m_InputActionPerformed: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: fbcd679f-34f4-4f1e-a0ab-8b110215af1d + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionValue: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: a5fd0c97-eb12-441a-9fe4-bf4015e633c5 + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionReferencePerformed: {fileID: 3213396149142689940, guid: f52857e8660fd2a48aa592e1c5b0908c, type: 3} + m_InputActionReferenceValue: {fileID: 3213396149142689940, guid: f52857e8660fd2a48aa592e1c5b0908c, type: 3} + m_ObjectReferenceObject: {fileID: 0} + m_ManualPerformed: 0 + m_ManualValue: 0 + m_ManualQueuePerformed: 0 + m_ManualQueueWasPerformedThisFrame: 0 + m_ManualQueueWasCompletedThisFrame: 0 + m_ManualQueueValue: 0 + m_ManualQueueTargetFrame: 0 + m_ToggleManipulateRightInput: + m_InputSourceMode: 2 + m_InputActionPerformed: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: 5091c43b-ace3-44a9-8274-9bbbc1fadf05 + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionValue: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: 694232ca-9c8e-4597-bf46-dba2044986a4 + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionReferencePerformed: {fileID: -5271534249742427606, guid: f52857e8660fd2a48aa592e1c5b0908c, type: 3} + m_InputActionReferenceValue: {fileID: -5271534249742427606, guid: f52857e8660fd2a48aa592e1c5b0908c, type: 3} + m_ObjectReferenceObject: {fileID: 0} + m_ManualPerformed: 0 + m_ManualValue: 0 + m_ManualQueuePerformed: 0 + m_ManualQueueWasPerformedThisFrame: 0 + m_ManualQueueWasCompletedThisFrame: 0 + m_ManualQueueValue: 0 + m_ManualQueueTargetFrame: 0 + m_LeftDeviceActionsInput: + m_InputSourceMode: 2 + m_InputActionPerformed: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: cf456fa7-8a90-48f6-b8f4-bc7c2cd85dc8 + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionValue: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: 253e215d-e20a-4724-b6bd-288d3f5e0f57 + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionReferencePerformed: {fileID: 3321593861189579426, guid: f52857e8660fd2a48aa592e1c5b0908c, type: 3} + m_InputActionReferenceValue: {fileID: 3321593861189579426, guid: f52857e8660fd2a48aa592e1c5b0908c, type: 3} + m_ObjectReferenceObject: {fileID: 0} + m_ManualPerformed: 0 + m_ManualValue: 0 + m_ManualQueuePerformed: 0 + m_ManualQueueWasPerformedThisFrame: 0 + m_ManualQueueWasCompletedThisFrame: 0 + m_ManualQueueValue: 0 + m_ManualQueueTargetFrame: 0 + m_CycleDevicesInput: + m_InputSourceMode: 2 + m_InputActionPerformed: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: 16299362-8b97-40dc-b8e1-7090ccdc7269 + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionValue: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: 0eb8a0e1-277e-4d8a-bb9e-e1ab5d270d66 + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionReferencePerformed: {fileID: 4631941292811771548, guid: f52857e8660fd2a48aa592e1c5b0908c, type: 3} + m_InputActionReferenceValue: {fileID: 4631941292811771548, guid: f52857e8660fd2a48aa592e1c5b0908c, type: 3} + m_ObjectReferenceObject: {fileID: 0} + m_ManualPerformed: 0 + m_ManualValue: 0 + m_ManualQueuePerformed: 0 + m_ManualQueueWasPerformedThisFrame: 0 + m_ManualQueueWasCompletedThisFrame: 0 + m_ManualQueueValue: 0 + m_ManualQueueTargetFrame: 0 + m_KeyboardRotationDeltaInput: + m_InputSourceMode: 2 + m_InputAction: + m_Name: Keyboard Rotation Delta Input + m_Type: 0 + m_ExpectedControlType: Vector2 + m_Id: 313a7293-06cb-444b-8d0f-2152e644f92b + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionReference: {fileID: 3913660673247662550, guid: f52857e8660fd2a48aa592e1c5b0908c, type: 3} + m_ObjectReferenceObject: {fileID: 0} + m_ManualValue: {x: 0, y: 0} + m_ToggleMouseInput: + m_InputSourceMode: 2 + m_InputActionPerformed: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: 02a94c6e-2eea-46b6-b154-19b1c879557c + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionValue: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: 32eab01f-072b-4664-89ad-f44bba74d6a1 + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionReferencePerformed: {fileID: -9163217798601591907, guid: f52857e8660fd2a48aa592e1c5b0908c, type: 3} + m_InputActionReferenceValue: {fileID: -9163217798601591907, guid: f52857e8660fd2a48aa592e1c5b0908c, type: 3} + m_ObjectReferenceObject: {fileID: 0} + m_ManualPerformed: 0 + m_ManualValue: 0 + m_ManualQueuePerformed: 0 + m_ManualQueueWasPerformedThisFrame: 0 + m_ManualQueueWasCompletedThisFrame: 0 + m_ManualQueueValue: 0 + m_ManualQueueTargetFrame: 0 + m_MouseRotationDeltaInput: + m_InputSourceMode: 2 + m_InputAction: + m_Name: Mouse Rotation Delta Input + m_Type: 0 + m_ExpectedControlType: Vector2 + m_Id: 48cd5fb3-f69b-408c-9081-393875473ffb + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionReference: {fileID: 599841986371110129, guid: f52857e8660fd2a48aa592e1c5b0908c, type: 3} + m_ObjectReferenceObject: {fileID: 0} + m_ManualValue: {x: 0, y: 0} + m_MouseScrollInput: + m_InputSourceMode: 2 + m_InputAction: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: 4a9ad3d7-dd9f-4336-b560-f503d8d6fbd4 + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionReference: {fileID: 8389547204797823760, guid: f52857e8660fd2a48aa592e1c5b0908c, type: 3} + m_ObjectReferenceObject: {fileID: 0} + m_ManualValue: {x: 0, y: 0} + m_GripInput: + m_InputSourceMode: 2 + m_InputActionPerformed: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: dd9345f0-3f71-4a7e-ae89-14cbb98b4ae4 + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionValue: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: c35e6cf2-0f2f-454e-b41e-dd4f1df7424a + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionReferencePerformed: {fileID: 8553031990505490215, guid: 079d8797bb64fc6439253516861e5d1e, type: 3} + m_InputActionReferenceValue: {fileID: 8553031990505490215, guid: 079d8797bb64fc6439253516861e5d1e, type: 3} + m_ObjectReferenceObject: {fileID: 0} + m_ManualPerformed: 0 + m_ManualValue: 0 + m_ManualQueuePerformed: 0 + m_ManualQueueWasPerformedThisFrame: 0 + m_ManualQueueWasCompletedThisFrame: 0 + m_ManualQueueValue: 0 + m_ManualQueueTargetFrame: 0 + m_TriggerInput: + m_InputSourceMode: 2 + m_InputActionPerformed: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: dc1c3032-d44c-412b-ba14-de814dc8c5c7 + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionValue: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: 68d3beb5-6ab1-46f1-b4e7-604951a1ea5c + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionReferencePerformed: {fileID: -4512514473501099499, guid: 079d8797bb64fc6439253516861e5d1e, type: 3} + m_InputActionReferenceValue: {fileID: -4512514473501099499, guid: 079d8797bb64fc6439253516861e5d1e, type: 3} + m_ObjectReferenceObject: {fileID: 0} + m_ManualPerformed: 0 + m_ManualValue: 0 + m_ManualQueuePerformed: 0 + m_ManualQueueWasPerformedThisFrame: 0 + m_ManualQueueWasCompletedThisFrame: 0 + m_ManualQueueValue: 0 + m_ManualQueueTargetFrame: 0 + m_PrimaryButtonInput: + m_InputSourceMode: 2 + m_InputActionPerformed: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: 90585208-ec5a-48d6-a642-79e6e8f22a4c + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionValue: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: af5f7b27-e80e-4497-89c3-877bd44c0361 + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionReferencePerformed: {fileID: 4076482269478747861, guid: 079d8797bb64fc6439253516861e5d1e, type: 3} + m_InputActionReferenceValue: {fileID: 4076482269478747861, guid: 079d8797bb64fc6439253516861e5d1e, type: 3} + m_ObjectReferenceObject: {fileID: 0} + m_ManualPerformed: 0 + m_ManualValue: 0 + m_ManualQueuePerformed: 0 + m_ManualQueueWasPerformedThisFrame: 0 + m_ManualQueueWasCompletedThisFrame: 0 + m_ManualQueueValue: 0 + m_ManualQueueTargetFrame: 0 + m_SecondaryButtonInput: + m_InputSourceMode: 2 + m_InputActionPerformed: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: 4f260533-4b31-40c2-a69b-e5e4b2590136 + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionValue: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: 5bacaf1d-6070-4f42-b8aa-4a44d5927e1e + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionReferencePerformed: {fileID: -5098320950465842095, guid: 079d8797bb64fc6439253516861e5d1e, type: 3} + m_InputActionReferenceValue: {fileID: -5098320950465842095, guid: 079d8797bb64fc6439253516861e5d1e, type: 3} + m_ObjectReferenceObject: {fileID: 0} + m_ManualPerformed: 0 + m_ManualValue: 0 + m_ManualQueuePerformed: 0 + m_ManualQueueWasPerformedThisFrame: 0 + m_ManualQueueWasCompletedThisFrame: 0 + m_ManualQueueValue: 0 + m_ManualQueueTargetFrame: 0 + m_MenuInput: + m_InputSourceMode: 2 + m_InputActionPerformed: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: fdd7d9a8-94d2-44db-940b-35ef0eccfef2 + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionValue: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: a308ab2a-5b97-4dd7-bc4e-ff6f6423f7c7 + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionReferencePerformed: {fileID: -2175126461719354192, guid: 079d8797bb64fc6439253516861e5d1e, type: 3} + m_InputActionReferenceValue: {fileID: -2175126461719354192, guid: 079d8797bb64fc6439253516861e5d1e, type: 3} + m_ObjectReferenceObject: {fileID: 0} + m_ManualPerformed: 0 + m_ManualValue: 0 + m_ManualQueuePerformed: 0 + m_ManualQueueWasPerformedThisFrame: 0 + m_ManualQueueWasCompletedThisFrame: 0 + m_ManualQueueValue: 0 + m_ManualQueueTargetFrame: 0 + m_Primary2DAxisClickInput: + m_InputSourceMode: 2 + m_InputActionPerformed: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: ce8c29a4-6244-4793-8d6b-79a07e2467fe + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionValue: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: 21fdd06e-9f9d-4b18-acb6-1f586dfca3fe + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionReferencePerformed: {fileID: 2172344595811146813, guid: 079d8797bb64fc6439253516861e5d1e, type: 3} + m_InputActionReferenceValue: {fileID: 2172344595811146813, guid: 079d8797bb64fc6439253516861e5d1e, type: 3} + m_ObjectReferenceObject: {fileID: 0} + m_ManualPerformed: 0 + m_ManualValue: 0 + m_ManualQueuePerformed: 0 + m_ManualQueueWasPerformedThisFrame: 0 + m_ManualQueueWasCompletedThisFrame: 0 + m_ManualQueueValue: 0 + m_ManualQueueTargetFrame: 0 + m_Secondary2DAxisClickInput: + m_InputSourceMode: 2 + m_InputActionPerformed: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: cfcacab9-dd55-437f-a68f-bd84ee5c9662 + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionValue: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: 6b5011c4-d233-4e99-b140-ec8176900fad + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionReferencePerformed: {fileID: 6699102922214864198, guid: 079d8797bb64fc6439253516861e5d1e, type: 3} + m_InputActionReferenceValue: {fileID: 6699102922214864198, guid: 079d8797bb64fc6439253516861e5d1e, type: 3} + m_ObjectReferenceObject: {fileID: 0} + m_ManualPerformed: 0 + m_ManualValue: 0 + m_ManualQueuePerformed: 0 + m_ManualQueueWasPerformedThisFrame: 0 + m_ManualQueueWasCompletedThisFrame: 0 + m_ManualQueueValue: 0 + m_ManualQueueTargetFrame: 0 + m_Primary2DAxisTouchInput: + m_InputSourceMode: 2 + m_InputActionPerformed: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: 124a7090-19b3-4007-b281-0cd33eb158ae + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionValue: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: 914f60e2-7ca5-485f-a814-71c797ec9888 + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionReferencePerformed: {fileID: -2381628869112830682, guid: 079d8797bb64fc6439253516861e5d1e, type: 3} + m_InputActionReferenceValue: {fileID: -2381628869112830682, guid: 079d8797bb64fc6439253516861e5d1e, type: 3} + m_ObjectReferenceObject: {fileID: 0} + m_ManualPerformed: 0 + m_ManualValue: 0 + m_ManualQueuePerformed: 0 + m_ManualQueueWasPerformedThisFrame: 0 + m_ManualQueueWasCompletedThisFrame: 0 + m_ManualQueueValue: 0 + m_ManualQueueTargetFrame: 0 + m_Secondary2DAxisTouchInput: + m_InputSourceMode: 2 + m_InputActionPerformed: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: eb1c44e4-1460-4b5d-bdc7-8345e3f1e53f + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionValue: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: 821bd71f-fe5f-48d9-9afc-14f5d263cd2e + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionReferencePerformed: {fileID: -4479395440843591556, guid: 079d8797bb64fc6439253516861e5d1e, type: 3} + m_InputActionReferenceValue: {fileID: -4479395440843591556, guid: 079d8797bb64fc6439253516861e5d1e, type: 3} + m_ObjectReferenceObject: {fileID: 0} + m_ManualPerformed: 0 + m_ManualValue: 0 + m_ManualQueuePerformed: 0 + m_ManualQueueWasPerformedThisFrame: 0 + m_ManualQueueWasCompletedThisFrame: 0 + m_ManualQueueValue: 0 + m_ManualQueueTargetFrame: 0 + m_PrimaryTouchInput: + m_InputSourceMode: 2 + m_InputActionPerformed: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: a197c50b-b303-4b3f-9d4d-5333500b0528 + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionValue: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: 4578d959-042f-4cd8-a8b6-884dab43e62e + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionReferencePerformed: {fileID: 8336412024222105820, guid: 079d8797bb64fc6439253516861e5d1e, type: 3} + m_InputActionReferenceValue: {fileID: 8336412024222105820, guid: 079d8797bb64fc6439253516861e5d1e, type: 3} + m_ObjectReferenceObject: {fileID: 0} + m_ManualPerformed: 0 + m_ManualValue: 0 + m_ManualQueuePerformed: 0 + m_ManualQueueWasPerformedThisFrame: 0 + m_ManualQueueWasCompletedThisFrame: 0 + m_ManualQueueValue: 0 + m_ManualQueueTargetFrame: 0 + m_SecondaryTouchInput: + m_InputSourceMode: 2 + m_InputActionPerformed: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: 338fb5cf-c6aa-4b81-9da3-7d3996fcdb89 + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionValue: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: 34586855-8a73-44f6-a31a-2bdff81c6ab6 + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionReferencePerformed: {fileID: -1594649908218047336, guid: 079d8797bb64fc6439253516861e5d1e, type: 3} + m_InputActionReferenceValue: {fileID: -1594649908218047336, guid: 079d8797bb64fc6439253516861e5d1e, type: 3} + m_ObjectReferenceObject: {fileID: 0} + m_ManualPerformed: 0 + m_ManualValue: 0 + m_ManualQueuePerformed: 0 + m_ManualQueueWasPerformedThisFrame: 0 + m_ManualQueueWasCompletedThisFrame: 0 + m_ManualQueueValue: 0 + m_ManualQueueTargetFrame: 0 + m_XConstraintInput: + m_InputSourceMode: 2 + m_InputActionPerformed: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: a92fd368-7bb5-4fa2-b7dd-f43b91d232cb + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionValue: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: 0f93b608-0210-43f7-b0f2-3349d306039c + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionReferencePerformed: {fileID: 2572553180361296755, guid: f52857e8660fd2a48aa592e1c5b0908c, type: 3} + m_InputActionReferenceValue: {fileID: 2572553180361296755, guid: f52857e8660fd2a48aa592e1c5b0908c, type: 3} + m_ObjectReferenceObject: {fileID: 0} + m_ManualPerformed: 0 + m_ManualValue: 0 + m_ManualQueuePerformed: 0 + m_ManualQueueWasPerformedThisFrame: 0 + m_ManualQueueWasCompletedThisFrame: 0 + m_ManualQueueValue: 0 + m_ManualQueueTargetFrame: 0 + m_YConstraintInput: + m_InputSourceMode: 2 + m_InputActionPerformed: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: 75790bd1-deb2-4985-9122-3fd945e90ec5 + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionValue: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: b4c034de-efd7-4d27-a503-4ab0c4586afc + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionReferencePerformed: {fileID: -3407157385946881053, guid: f52857e8660fd2a48aa592e1c5b0908c, type: 3} + m_InputActionReferenceValue: {fileID: -3407157385946881053, guid: f52857e8660fd2a48aa592e1c5b0908c, type: 3} + m_ObjectReferenceObject: {fileID: 0} + m_ManualPerformed: 0 + m_ManualValue: 0 + m_ManualQueuePerformed: 0 + m_ManualQueueWasPerformedThisFrame: 0 + m_ManualQueueWasCompletedThisFrame: 0 + m_ManualQueueValue: 0 + m_ManualQueueTargetFrame: 0 + m_ZConstraintInput: + m_InputSourceMode: 2 + m_InputActionPerformed: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: d8d4f135-2fff-4dc7-ac2a-4792bfba148e + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionValue: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: 024d1062-74bf-417f-a5e9-fd3665f38937 + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionReferencePerformed: {fileID: -5325362164213077080, guid: f52857e8660fd2a48aa592e1c5b0908c, type: 3} + m_InputActionReferenceValue: {fileID: -5325362164213077080, guid: f52857e8660fd2a48aa592e1c5b0908c, type: 3} + m_ObjectReferenceObject: {fileID: 0} + m_ManualPerformed: 0 + m_ManualValue: 0 + m_ManualQueuePerformed: 0 + m_ManualQueueWasPerformedThisFrame: 0 + m_ManualQueueWasCompletedThisFrame: 0 + m_ManualQueueValue: 0 + m_ManualQueueTargetFrame: 0 + m_ResetInput: + m_InputSourceMode: 2 + m_InputActionPerformed: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: 85cc1aaa-795f-4a5f-ac50-d7615529bba4 + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionValue: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: d2858175-cd7e-4675-beeb-e71c3ce67cbd + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionReferencePerformed: {fileID: 11620207395796075, guid: f52857e8660fd2a48aa592e1c5b0908c, type: 3} + m_InputActionReferenceValue: {fileID: 11620207395796075, guid: f52857e8660fd2a48aa592e1c5b0908c, type: 3} + m_ObjectReferenceObject: {fileID: 0} + m_ManualPerformed: 0 + m_ManualValue: 0 + m_ManualQueuePerformed: 0 + m_ManualQueueWasPerformedThisFrame: 0 + m_ManualQueueWasCompletedThisFrame: 0 + m_ManualQueueValue: 0 + m_ManualQueueTargetFrame: 0 + m_Axis2DInput: + m_InputSourceMode: 2 + m_InputAction: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: fd37527d-420f-4159-a0f6-7ee8dfac74f6 + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionReference: {fileID: -1332309148777543880, guid: 079d8797bb64fc6439253516861e5d1e, type: 3} + m_ObjectReferenceObject: {fileID: 0} + m_ManualValue: {x: 0, y: 0} + m_TogglePrimary2DAxisTargetInput: + m_InputSourceMode: 2 + m_InputActionPerformed: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: 5138cae7-03cb-47a0-b474-84c874b37249 + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionValue: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: 20719701-0f48-475b-823b-1d391892ecd7 + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionReferencePerformed: {fileID: 6428220943409794746, guid: f52857e8660fd2a48aa592e1c5b0908c, type: 3} + m_InputActionReferenceValue: {fileID: 6428220943409794746, guid: f52857e8660fd2a48aa592e1c5b0908c, type: 3} + m_ObjectReferenceObject: {fileID: 0} + m_ManualPerformed: 0 + m_ManualValue: 0 + m_ManualQueuePerformed: 0 + m_ManualQueueWasPerformedThisFrame: 0 + m_ManualQueueWasCompletedThisFrame: 0 + m_ManualQueueValue: 0 + m_ManualQueueTargetFrame: 0 + m_ToggleSecondary2DAxisTargetInput: + m_InputSourceMode: 2 + m_InputActionPerformed: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: 3c1ff7f3-4e1f-423a-bb6b-a15a8ee667ff + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionValue: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: 0215c07f-d61a-42bd-bb6c-f716c86b2fd5 + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionReferencePerformed: {fileID: -7347648447869668501, guid: f52857e8660fd2a48aa592e1c5b0908c, type: 3} + m_InputActionReferenceValue: {fileID: -7347648447869668501, guid: f52857e8660fd2a48aa592e1c5b0908c, type: 3} + m_ObjectReferenceObject: {fileID: 0} + m_ManualPerformed: 0 + m_ManualValue: 0 + m_ManualQueuePerformed: 0 + m_ManualQueueWasPerformedThisFrame: 0 + m_ManualQueueWasCompletedThisFrame: 0 + m_ManualQueueValue: 0 + m_ManualQueueTargetFrame: 0 + m_CycleQuickActionInput: + m_InputSourceMode: 2 + m_InputActionPerformed: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: 91140a16-3bc9-493a-94f7-a0ea309ca778 + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionValue: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: 8fa3ed19-5761-4b9e-8068-a6f0b6658dfc + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionReferencePerformed: {fileID: -6034075130793752588, guid: f52857e8660fd2a48aa592e1c5b0908c, type: 3} + m_InputActionReferenceValue: {fileID: -6034075130793752588, guid: f52857e8660fd2a48aa592e1c5b0908c, type: 3} + m_ObjectReferenceObject: {fileID: 0} + m_ManualPerformed: 0 + m_ManualValue: 0 + m_ManualQueuePerformed: 0 + m_ManualQueueWasPerformedThisFrame: 0 + m_ManualQueueWasCompletedThisFrame: 0 + m_ManualQueueValue: 0 + m_ManualQueueTargetFrame: 0 + m_TogglePerformQuickActionInput: + m_InputSourceMode: 2 + m_InputActionPerformed: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: 13c1b3bf-c88f-4938-b142-cadb2584d0ee + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionValue: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: 71a85489-41c7-4d8c-b7f4-76f96faf0fb8 + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionReferencePerformed: {fileID: 764344162618281306, guid: f52857e8660fd2a48aa592e1c5b0908c, type: 3} + m_InputActionReferenceValue: {fileID: 764344162618281306, guid: f52857e8660fd2a48aa592e1c5b0908c, type: 3} + m_ObjectReferenceObject: {fileID: 0} + m_ManualPerformed: 0 + m_ManualValue: 0 + m_ManualQueuePerformed: 0 + m_ManualQueueWasPerformedThisFrame: 0 + m_ManualQueueWasCompletedThisFrame: 0 + m_ManualQueueValue: 0 + m_ManualQueueTargetFrame: 0 + m_ToggleManipulateHeadInput: + m_InputSourceMode: 2 + m_InputActionPerformed: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: a7828afb-d162-4b2e-82f9-b8eaddd37820 + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionValue: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: 12d9e889-0924-4752-83f8-9dbd53b19116 + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionReferencePerformed: {fileID: -1736447518294294610, guid: f52857e8660fd2a48aa592e1c5b0908c, type: 3} + m_InputActionReferenceValue: {fileID: -1736447518294294610, guid: f52857e8660fd2a48aa592e1c5b0908c, type: 3} + m_ObjectReferenceObject: {fileID: 0} + m_ManualPerformed: 0 + m_ManualValue: 0 + m_ManualQueuePerformed: 0 + m_ManualQueueWasPerformedThisFrame: 0 + m_ManualQueueWasCompletedThisFrame: 0 + m_ManualQueueValue: 0 + m_ManualQueueTargetFrame: 0 + m_MouseClickInput: + m_InputSourceMode: 2 + m_InputActionPerformed: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: b9f4dc3c-8884-4a29-a04a-ef0a71cb6d5a + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionValue: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: a9499719-28e8-4cfc-a547-4232c54cac9f + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionReferencePerformed: {fileID: 8311685460447447450, guid: f52857e8660fd2a48aa592e1c5b0908c, type: 3} + m_InputActionReferenceValue: {fileID: 8311685460447447450, guid: f52857e8660fd2a48aa592e1c5b0908c, type: 3} + m_ObjectReferenceObject: {fileID: 0} + m_ManualPerformed: 0 + m_ManualValue: 0 + m_ManualQueuePerformed: 0 + m_ManualQueueWasPerformedThisFrame: 0 + m_ManualQueueWasCompletedThisFrame: 0 + m_ManualQueueValue: 0 + m_ManualQueueTargetFrame: 0 + m_MousePointInput: + m_InputSourceMode: 2 + m_InputAction: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: 495ae9af-b055-4d4d-8706-bc6b3924db07 + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionReference: {fileID: 7146441330815918761, guid: f52857e8660fd2a48aa592e1c5b0908c, type: 3} + m_ObjectReferenceObject: {fileID: 0} + m_ManualValue: {x: 0, y: 0} + m_GripAmount: 1 + m_TriggerAmount: 1 + m_TranslateXSpeed: 0.2 + m_TranslateYSpeed: 0.2 + m_TranslateZSpeed: 0.2 + m_BodyTranslateMultiplier: 5 + m_RotateXSensitivity: 0.2 + m_RotateYSensitivity: 0.2 + m_MouseScrollRotateSensitivity: 0.05 + m_RotateYInvert: 0 + m_TranslateSpace: 1 + m_QuickActionControllerInputModes: 01000000020000000300000004000000 + m_UsePointAndClick: 1 + m_DeviceAimCameraRadius: 0.5 + m_DefaultPointAndClickHandedness: 2 + m_PointAndClickHandExpression: + m_Name: pinch-pointandclick + m_ToggleInput: + m_InputSourceMode: 2 + m_InputActionPerformed: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: e34af426-c604-4b58-a971-715787a19e2f + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionValue: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: e6389e05-071b-4c77-bcf8-8973a118148c + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionReferencePerformed: {fileID: 0} + m_InputActionReferenceValue: {fileID: 0} + m_ObjectReferenceObject: {fileID: 0} + m_ManualPerformed: 0 + m_ManualValue: 0 + m_ManualQueuePerformed: 0 + m_ManualQueueWasPerformedThisFrame: 0 + m_ManualQueueWasCompletedThisFrame: 0 + m_ManualQueueValue: 0 + m_ManualQueueTargetFrame: 0 + m_SequenceType: 1 + m_Capture: {fileID: 0} + m_IsQuickAction: 0 +--- !u!114 &3966192772413791964 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8135023674665499069} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 2a798ede3f9ef495cb5b62f2a9896b2e, type: 3} + m_Name: + m_EditorClassIdentifier: + m_RemoveOtherHMDDevices: 1 + m_HandTrackingCapability: 0 +--- !u!114 &9147200356447112767 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8135023674665499069} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 017c5e3933235514c9520e1dace2a4b2, type: 3} + m_Name: + m_EditorClassIdentifier: + m_ActionAssets: + - {fileID: -944628639613478452, guid: f52857e8660fd2a48aa592e1c5b0908c, type: 3} + - {fileID: -944628639613478452, guid: 079d8797bb64fc6439253516861e5d1e, type: 3} +--- !u!114 &8031605675589883834 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8135023674665499069} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1eb83c2ee0ce243f6823f2f7551cfd7a, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.XR.Interaction.Toolkit::UnityEngine.XR.Interaction.Toolkit.Inputs.Simulation.SimulatedHandPlaybackManager + m_SimulatedHandExpressions: [] + m_RestingHandExpression: + m_Name: Idle + m_ToggleInput: + m_InputSourceMode: 2 + m_InputActionPerformed: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: c0757c62-965d-410c-8d7c-2087116582b7 + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionValue: + m_Name: + m_Type: 0 + m_ExpectedControlType: + m_Id: 8636ed2c-e387-4194-af84-67725aef5b23 + m_Processors: + m_Interactions: + m_SingletonActionBindings: [] + m_Flags: 0 + m_InputActionReferencePerformed: {fileID: 0} + m_InputActionReferenceValue: {fileID: 0} + m_ObjectReferenceObject: {fileID: 0} + m_ManualPerformed: 0 + m_ManualValue: 0 + m_ManualQueuePerformed: 0 + m_ManualQueueWasPerformedThisFrame: 0 + m_ManualQueueWasCompletedThisFrame: 0 + m_ManualQueueValue: 0 + m_ManualQueueTargetFrame: 0 + m_SequenceType: 0 + m_Capture: {fileID: 0} + m_IsQuickAction: 0 +--- !u!114 &8763304602052374922 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8135023674665499069} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e16824e6c8a92b14b8f4172425cbca6a, type: 3} + m_Name: + m_EditorClassIdentifier: Gothic.VR::Gothic.VR.Interaction.Backends.Xri.XriSimulatorControlsGUI + IsVisible: 1 diff --git a/Assets/Gothic-VR/Resources/VR/Prefabs/VR - XR Interaction Simulator.prefab.meta b/Assets/Gothic-VR/Resources/VR/Prefabs/VR - XR Interaction Simulator.prefab.meta new file mode 100644 index 000000000..b08650427 --- /dev/null +++ b/Assets/Gothic-VR/Resources/VR/Prefabs/VR - XR Interaction Simulator.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 46fcf28ff6eb0db4d9951a3d7a830b58 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Gothic-VR/Scenes/VR/Player.unity b/Assets/Gothic-VR/Scenes/VR/Player.unity index dc4e7312a..17c76705b 100644 --- a/Assets/Gothic-VR/Scenes/VR/Player.unity +++ b/Assets/Gothic-VR/Scenes/VR/Player.unity @@ -392,6 +392,67 @@ GameObject: m_CorrespondingSourceObject: {fileID: 3469872686997064003, guid: c9aaa67c73a5ed34d8a865ecc7613ca2, type: 3} m_PrefabInstance: {fileID: 441653735} m_PrefabAsset: {fileID: 0} +--- !u!1001 &824432547 +PrefabInstance: + m_ObjectHideFlags: 0 + serializedVersion: 2 + m_Modification: + serializedVersion: 3 + m_TransformParent: {fileID: 0} + m_Modifications: + - target: {fileID: 8135023674665499069, guid: 46fcf28ff6eb0db4d9951a3d7a830b58, type: 3} + propertyPath: m_Name + value: VR - XR Interaction Simulator + objectReference: {fileID: 0} + - target: {fileID: 8135023674665499069, guid: 46fcf28ff6eb0db4d9951a3d7a830b58, type: 3} + propertyPath: m_IsActive + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8518324294302271954, guid: 46fcf28ff6eb0db4d9951a3d7a830b58, type: 3} + propertyPath: m_LocalPosition.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8518324294302271954, guid: 46fcf28ff6eb0db4d9951a3d7a830b58, type: 3} + propertyPath: m_LocalPosition.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8518324294302271954, guid: 46fcf28ff6eb0db4d9951a3d7a830b58, type: 3} + propertyPath: m_LocalPosition.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8518324294302271954, guid: 46fcf28ff6eb0db4d9951a3d7a830b58, type: 3} + propertyPath: m_LocalRotation.w + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 8518324294302271954, guid: 46fcf28ff6eb0db4d9951a3d7a830b58, type: 3} + propertyPath: m_LocalRotation.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8518324294302271954, guid: 46fcf28ff6eb0db4d9951a3d7a830b58, type: 3} + propertyPath: m_LocalRotation.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8518324294302271954, guid: 46fcf28ff6eb0db4d9951a3d7a830b58, type: 3} + propertyPath: m_LocalRotation.z + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8518324294302271954, guid: 46fcf28ff6eb0db4d9951a3d7a830b58, type: 3} + propertyPath: m_LocalEulerAnglesHint.x + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8518324294302271954, guid: 46fcf28ff6eb0db4d9951a3d7a830b58, type: 3} + propertyPath: m_LocalEulerAnglesHint.y + value: 0 + objectReference: {fileID: 0} + - target: {fileID: 8518324294302271954, guid: 46fcf28ff6eb0db4d9951a3d7a830b58, type: 3} + propertyPath: m_LocalEulerAnglesHint.z + value: 0 + objectReference: {fileID: 0} + m_RemovedComponents: [] + m_RemovedGameObjects: [] + m_AddedGameObjects: [] + m_AddedComponents: [] + m_SourcePrefab: {fileID: 100100000, guid: 46fcf28ff6eb0db4d9951a3d7a830b58, type: 3} --- !u!1001 &855327201 PrefabInstance: m_ObjectHideFlags: 0 @@ -607,4 +668,5 @@ SceneRoots: - {fileID: 441653735} - {fileID: 877978168} - {fileID: 1402327359425347789} + - {fileID: 824432547} - {fileID: 855327201} diff --git a/Assets/Gothic-VR/Scripts/Adapters/Player/VRPlayer.cs b/Assets/Gothic-VR/Scripts/Adapters/Player/VRPlayer.cs index 53cae9242..5636c260e 100644 --- a/Assets/Gothic-VR/Scripts/Adapters/Player/VRPlayer.cs +++ b/Assets/Gothic-VR/Scripts/Adapters/Player/VRPlayer.cs @@ -56,7 +56,7 @@ public bool IsBothGripsActive { get { - if (_vrInput.IsSimulator) + if (_vrInput.IsSimulator && _vrInput.UsesBothGripsSimulatorKey) return Keyboard.current[Key.T].isPressed; return _vrInput.GetButton(VrHandSide.Left, VrButton.Grip).IsActive diff --git a/Assets/Gothic-VR/Scripts/Interaction/Backends/Hvr/HvrInput.cs b/Assets/Gothic-VR/Scripts/Interaction/Backends/Hvr/HvrInput.cs index 70af90ea2..577da5c8c 100644 --- a/Assets/Gothic-VR/Scripts/Interaction/Backends/Hvr/HvrInput.cs +++ b/Assets/Gothic-VR/Scripts/Interaction/Backends/Hvr/HvrInput.cs @@ -25,6 +25,8 @@ public bool IsSimulator } } + public bool UsesBothGripsSimulatorKey => true; + public VrButtonState GetButton(VrHandSide side, VrButton button) { return HVRController.GetButtonState(side.ToHvr(), button.ToHvr()).ToVr(); diff --git a/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriBackend.cs b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriBackend.cs index 6d02db6db..9513c8b69 100644 --- a/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriBackend.cs +++ b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriBackend.cs @@ -17,9 +17,9 @@ public class XriBackend : IVrBackend public void InstallBindings(ContainerBuilder containerBuilder) { - Logger.LogWarning("XRI backend is work in progress: rig, locomotion, input, haptics, UI laser pointers " + - "and screen fades work. The simulator (HVR phase 1d) and grabbing (phase 2) are " + - "missing.", LogCat.VR); + Logger.LogWarning("XRI backend is work in progress: rig, locomotion, input, haptics, UI laser pointers, " + + "screen fades and the XR Interaction Simulator work. Grabbing (phase 2), sockets (3), " + + "doors/chests/ladders (4) and hands (5) are missing.", LogCat.VR); containerBuilder.AddSingleton(typeof(XriInput), typeof(IVrInput), typeof(XriInput)); containerBuilder.AddSingleton(typeof(XriHaptics), typeof(IVrHaptics)); diff --git a/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriInput.cs b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriInput.cs index 343decabb..e9539ac20 100644 --- a/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriInput.cs +++ b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriInput.cs @@ -24,6 +24,10 @@ public class XriInput : IVrInput private const string _velocityActionName = "Velocity"; private const string _hapticActionName = "Haptic"; + // Binding groups of the "Gothic" map: controller bindings ("XR") are always used, the keyboard shortcuts + // ("Simulator") only while the XR Interaction Simulator is active. + private const string _xrBindingGroup = "XR"; + // Indexed by VrButton. private static readonly string[] _buttonActionNames = { @@ -38,13 +42,22 @@ public class XriInput : IVrInput private readonly InputAction[] _haptics = new InputAction[2]; private readonly InputAction[] _gothicActions = new InputAction[_gothicActionNames.Length]; + // Simulator only: velocity from the controller's position change, as simulated devices have no velocity. + private readonly Vector3[] _simulatedVelocities = new Vector3[2]; + private readonly Vector3[] _simulatedLastPositions = new Vector3[2]; + private readonly int[] _simulatedVelocityFrames = { -1, -1 }; + + private InputActionMap _gothicMap; private XRInteractionSimulator _simulator; + private XriRig _simulatorRig; private bool _isSimulatorActive; public InputActionAsset Actions { get; } public bool IsSimulator => _isSimulatorActive && _simulator != null && _simulator.isActiveAndEnabled; + public bool UsesBothGripsSimulatorKey => false; + public XriInput() { Actions = Resources.Load(InputActionsResourcePath); @@ -58,10 +71,11 @@ public XriInput() InitHand(VrHandSide.Left, _leftHandMapName); InitHand(VrHandSide.Right, _rightHandMapName); - var gothicMap = Actions.FindActionMap(_gothicMapName, true); + _gothicMap = Actions.FindActionMap(_gothicMapName, true); for (var i = 0; i < _gothicActionNames.Length; i++) - _gothicActions[i] = gothicMap.FindAction(_gothicActionNames[i], true); - gothicMap.Enable(); + _gothicActions[i] = _gothicMap.FindAction(_gothicActionNames[i], true); + ApplyKeyboardShortcuts(false); + _gothicMap.Enable(); } private void InitHand(VrHandSide side, string mapName) @@ -90,10 +104,36 @@ public VrButtonState GetGothicAction(XriGothicAction action) public Vector3 GetControllerVelocity(VrHandSide side) { + if (IsSimulator && _simulatorRig != null) + return GetSimulatedControllerVelocity(side); + var action = _velocities[(int)side]; return action == null ? Vector3.zero : action.ReadValue(); } + /// + /// The XR Interaction Simulator's controllers report no velocity (swim strokes would do nothing). Derived from + /// the controller's position in the tracking space between two frames instead. Zero on the first call after a + /// pause, as there is nothing to compare against. + /// + private Vector3 GetSimulatedControllerVelocity(VrHandSide side) + { + var index = (int)side; + if (_simulatedVelocityFrames[index] == Time.frameCount) + return _simulatedVelocities[index]; + + var hand = side == VrHandSide.Left ? _simulatorRig.LeftHand : _simulatorRig.RightHand; + var position = hand.localPosition; + var isConsecutiveFrame = _simulatedVelocityFrames[index] == Time.frameCount - 1; + _simulatedVelocities[index] = isConsecutiveFrame && Time.deltaTime > 0f + ? (position - _simulatedLastPositions[index]) / Time.deltaTime + : Vector3.zero; + _simulatedLastPositions[index] = position; + _simulatedVelocityFrames[index] = Time.frameCount; + + return _simulatedVelocities[index]; + } + /// /// Pass-through action bound to the controller device, used to send haptic impulses. /// @@ -113,11 +153,47 @@ public void SetDeviceSimulatorActive(bool isActive) { if (isActive) Logger.LogWarning("XRI backend: no XR Interaction Simulator in the active scene. " + - "It's added to the player scene with HVR phase 1d.", LogCat.VR); + "Add 'VR - XR Interaction Simulator.prefab' (inactive) to the player scene.", + LogCat.VR); + ApplyKeyboardShortcuts(false); return; } + if (isActive) + AssignSimulatorControllers(); + _simulator.gameObject.SetActive(isActive); + ApplyKeyboardShortcuts(isActive); + } + + /// + /// The simulator finds the controllers only via an XRInputModalityManager, which our rig doesn't have. Without + /// them, point-and-click (mouse aims the controller ray) would aim the camera instead. + /// Called before the simulator's GameObject is enabled, as it reads them in OnEnable. + /// + private void AssignSimulatorControllers() + { + var rig = Object.FindFirstObjectByType(); + if (rig == null) + return; + + _simulatorRig = rig; + + if (_simulator.leftControllerTransform == null) + _simulator.leftControllerTransform = rig.LeftHand; + if (_simulator.rightControllerTransform == null) + _simulator.rightControllerTransform = rig.RightHand; + } + + /// + /// The keyboard shortcuts of the "Gothic" map (Esc, Space, X, F) only work with the simulator, like on HVR. + /// + private void ApplyKeyboardShortcuts(bool isEnabled) + { + if (_gothicMap == null) + return; + + _gothicMap.bindingMask = isEnabled ? null : InputBinding.MaskByGroup(_xrBindingGroup); } private static VrButtonState ToState(InputAction action) diff --git a/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriSimulatorControlsGUI.cs b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriSimulatorControlsGUI.cs new file mode 100644 index 000000000..41ad05cba --- /dev/null +++ b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriSimulatorControlsGUI.cs @@ -0,0 +1,92 @@ +using UnityEngine; +using UnityEngine.InputSystem; +using UnityEngine.XR.Interaction.Toolkit.Inputs.Simulation; + +namespace Gothic.VR.Interaction.Backends.Xri +{ + /// + /// On-screen key list for the XR Interaction Simulator (Xri backend), next to the simulator component. + /// Shows the simulator's own keys and the Gothic shortcuts of GothicVR.inputactions ("Gothic" map, group + /// "Simulator"). F1 hides/shows it. + /// + [RequireComponent(typeof(XRInteractionSimulator))] + public class XriSimulatorControlsGUI : MonoBehaviour + { + private const string _gothicKeys = + "Menu -> Esc\n" + + "Jump -> Space\n" + + "Crouch -> X\n" + + "Sprint -> F (while walking)\n" + + "Walk (left stick) -> Shift + I/J/K/L\n" + + "Turn (right stick) -> J/L\n" + + "Laser click -> aim with the mouse, T (or left click)\n" + + "Swim stroke -> ] then hold G and move with W/A/S/D\n" + + "Both grips (speech) -> [ and ] together, then G"; + + private const string _simulatorKeys = + "Move in room -> W/A/S/D, Q/E (up/down)\n" + + "Look -> hold right mouse + move, arrow keys\n" + + "Select device -> [ left, ] right, [+] both\n" + + "Cycle head/controllers -> Tab, head only -> H\n" + + "Reset device -> R\n" + + "Trigger -> T, Grip -> G\n" + + "Primary (A/X) -> 1, Secondary (B/Y) -> 2\n" + + "Stick click -> 3, Menu -> M\n" + + "Buttons go to the right hand, hold Shift for the left\n" + + "Quick action -> Enter, cycle it -> `\n" + + "Help on/off -> F1"; + + [Tooltip("Show the key list when the simulator starts.")] + public bool IsVisible = true; + + private XRInteractionSimulator _simulator; + private GUIStyle _style; + + private void Awake() + { + _simulator = GetComponent(); + } + + private void Update() + { + var keyboard = Keyboard.current; + if (keyboard != null && keyboard.f1Key.wasPressedThisFrame) + IsVisible = !IsVisible; + } + + private void OnGUI() + { + if (!IsVisible) + return; + + _style ??= new GUIStyle(GUI.skin.box) + { + alignment = TextAnchor.UpperLeft, + richText = true, + fontSize = 12, + wordWrap = false + }; + + var text = $"Gothic\n{_gothicKeys}\n\nXR Interaction Simulator\n{_simulatorKeys}\n\n" + + $"Active: {GetTargetText()}"; + var content = new GUIContent(text); + var size = _style.CalcSize(content); + GUI.Box(new Rect(4, Screen.height - size.y - 4, size.x, size.y), content, _style); + } + + private string GetTargetText() + { + if (_simulator == null) + return "-"; + if (_simulator.manipulatingHMD) + return "head"; + + var hands = _simulator.manipulatingLeftDevice && _simulator.manipulatingRightDevice ? "both controllers" + : _simulator.manipulatingLeftDevice ? "left controller" + : _simulator.manipulatingRightDevice ? "right controller" + : "no controller"; + + return _simulator.manipulatingFPS ? $"head + {hands}" : hands; + } + } +} diff --git a/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriSimulatorControlsGUI.cs.meta b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriSimulatorControlsGUI.cs.meta new file mode 100644 index 000000000..dbf211e03 --- /dev/null +++ b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriSimulatorControlsGUI.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: e16824e6c8a92b14b8f4172425cbca6a \ No newline at end of file diff --git a/Assets/Gothic-VR/Scripts/Interaction/Ports/IVrInput.cs b/Assets/Gothic-VR/Scripts/Interaction/Ports/IVrInput.cs index 89ceab4aa..282d5b946 100644 --- a/Assets/Gothic-VR/Scripts/Interaction/Ports/IVrInput.cs +++ b/Assets/Gothic-VR/Scripts/Interaction/Ports/IVrInput.cs @@ -14,6 +14,12 @@ public interface IVrInput /// bool IsSimulator { get; } + /// + /// In the simulator, VRPlayer.IsBothGripsActive is the T key (HVR simulator: no way to hold both grips). + /// The XR Interaction Simulator holds both grips itself ([ and ] together, then G) and uses T as trigger. + /// + bool UsesBothGripsSimulatorKey { get; } + VrButtonState GetButton(VrHandSide side, VrButton button); /// diff --git a/Assets/Gothic-VR/Simulator.meta b/Assets/Gothic-VR/Simulator.meta new file mode 100644 index 000000000..1881ddbe4 --- /dev/null +++ b/Assets/Gothic-VR/Simulator.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: f045b4210985ce140884f6bdf165ddf8 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Gothic-VR/Simulator/XR Interaction Controller Controls.inputactions b/Assets/Gothic-VR/Simulator/XR Interaction Controller Controls.inputactions new file mode 100644 index 000000000..3d235db9d --- /dev/null +++ b/Assets/Gothic-VR/Simulator/XR Interaction Controller Controls.inputactions @@ -0,0 +1,417 @@ +{ + "name": "XR Interaction Controller Controls", + "maps": [ + { + "name": "Controller", + "id": "11c7c072-283e-4c4f-969d-bea4cb0809cf", + "actions": [ + { + "name": "Axis 2D", + "type": "Value", + "id": "76f4cfaf-5aeb-4f66-87d2-a63aa567764a", + "expectedControlType": "Vector2", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Resting Hand Axis 2D", + "type": "Value", + "id": "42778bc8-d1b8-438d-9618-e41a28b3dc56", + "expectedControlType": "Vector2", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Grip", + "type": "Button", + "id": "c7937c78-cea4-4888-8feb-8d9da13005f2", + "expectedControlType": "", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Trigger", + "type": "Button", + "id": "3808b2c1-2f77-4a89-bc2a-34c0e0ef0ad3", + "expectedControlType": "", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Primary Button", + "type": "Button", + "id": "54068f2e-4569-46ab-9864-63b23fb9c26a", + "expectedControlType": "", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Secondary Button", + "type": "Button", + "id": "970b4191-957d-4a7f-ba64-e0e701950d99", + "expectedControlType": "", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Menu", + "type": "Button", + "id": "ccb35b49-777b-460f-bca8-3168c41cc779", + "expectedControlType": "", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Primary 2D Axis Click", + "type": "Button", + "id": "22416e35-4897-43a8-b712-74381678af80", + "expectedControlType": "", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Secondary 2D Axis Click", + "type": "Button", + "id": "b3a541b3-564a-4213-8a9a-a4417b3de5cf", + "expectedControlType": "", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Primary 2D Axis Touch", + "type": "Button", + "id": "9b069098-df41-435e-9a59-ce43682df020", + "expectedControlType": "", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Secondary 2D Axis Touch", + "type": "Button", + "id": "cf4b67af-47c4-43d7-b748-b69c7709d64b", + "expectedControlType": "", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Primary Touch", + "type": "Button", + "id": "04a0ca31-1719-49b1-9e4c-bc95a9905486", + "expectedControlType": "", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Secondary Touch", + "type": "Button", + "id": "613de0bf-5bc1-4b53-a4b8-0ae20fb87272", + "expectedControlType": "", + "processors": "", + "interactions": "", + "initialStateCheck": false + } + ], + "bindings": [ + { + "name": "2D Vector", + "id": "094bdcd9-42d3-4b66-8bf7-69d931e4af25", + "path": "2DVector", + "interactions": "", + "processors": "", + "groups": "", + "action": "Axis 2D", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "up", + "id": "1b2e98a9-b6d7-45bf-b4cc-d679acb0502a", + "path": "/i", + "interactions": "", + "processors": "", + "groups": "", + "action": "Axis 2D", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "down", + "id": "597b5587-05e8-4ffc-a928-539ab9f8d947", + "path": "/k", + "interactions": "", + "processors": "", + "groups": "", + "action": "Axis 2D", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "left", + "id": "87590669-a188-4b8b-ba41-f5f8a58cede9", + "path": "/j", + "interactions": "", + "processors": "", + "groups": "", + "action": "Axis 2D", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "right", + "id": "6e1f0a95-84c0-4e06-98b8-18728329aa43", + "path": "/l", + "interactions": "", + "processors": "", + "groups": "", + "action": "Axis 2D", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "2D Vector", + "id": "df76e063-0f58-453c-9bdb-a000e261868d", + "path": "2DVector", + "interactions": "", + "processors": "", + "groups": "", + "action": "Resting Hand Axis 2D", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "up", + "id": "6be1edad-fb89-4f8b-8041-8a539b9aa22e", + "path": "/i", + "interactions": "", + "processors": "", + "groups": "", + "action": "Resting Hand Axis 2D", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "down", + "id": "387c7efc-30f2-423a-a537-9a8b6e7d7860", + "path": "/k", + "interactions": "", + "processors": "", + "groups": "", + "action": "Resting Hand Axis 2D", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "left", + "id": "e1b7cebf-9197-42dd-91a0-6ec9bfa15f9f", + "path": "/j", + "interactions": "", + "processors": "", + "groups": "", + "action": "Resting Hand Axis 2D", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "right", + "id": "3c625ee8-b7f9-4125-917a-f05eab326a3e", + "path": "/l", + "interactions": "", + "processors": "", + "groups": "", + "action": "Resting Hand Axis 2D", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "2D Vector", + "id": "4f579817-5f31-4ac7-899b-04fec58abb48", + "path": "2DVector", + "interactions": "", + "processors": "", + "groups": "", + "action": "Resting Hand Axis 2D", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "up", + "id": "20ac1683-e9a0-4cea-ac68-6689033459df", + "path": "/forwardButton", + "interactions": "", + "processors": "", + "groups": "", + "action": "Resting Hand Axis 2D", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "down", + "id": "60663e10-c213-4c1a-9177-68680f497799", + "path": "/backButton", + "interactions": "", + "processors": "", + "groups": "", + "action": "Resting Hand Axis 2D", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "left", + "id": "cca7347a-79f9-4a90-9912-627c7aeb7509", + "path": "/q", + "interactions": "", + "processors": "", + "groups": "", + "action": "Resting Hand Axis 2D", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "right", + "id": "7a178081-4cf4-4dc4-ae08-3448a76351e6", + "path": "/e", + "interactions": "", + "processors": "", + "groups": "", + "action": "Resting Hand Axis 2D", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "", + "id": "32072c42-6a30-4383-8362-d65ff475c920", + "path": "/g", + "interactions": "", + "processors": "", + "groups": "", + "action": "Grip", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "4f6dfc4a-38d9-455d-9364-3a188b0e9326", + "path": "/t", + "interactions": "", + "processors": "", + "groups": "", + "action": "Trigger", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "c17eb846-7a66-4006-9d57-6b91831868d0", + "path": "/1", + "interactions": "", + "processors": "", + "groups": "", + "action": "Primary Button", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "69ce3e33-7d81-423f-b162-7232a5791c2f", + "path": "/2", + "interactions": "", + "processors": "", + "groups": "", + "action": "Secondary Button", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "45511393-aa9b-4031-8e31-4eec53ab2d3f", + "path": "/m", + "interactions": "", + "processors": "", + "groups": "", + "action": "Menu", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "8e2bc8db-cb64-45ae-967f-55e716a538ba", + "path": "/3", + "interactions": "", + "processors": "", + "groups": "", + "action": "Primary 2D Axis Click", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "37235877-ac7c-41c4-bc1b-b03be3563189", + "path": "/4", + "interactions": "", + "processors": "", + "groups": "", + "action": "Secondary 2D Axis Click", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "ff1581e6-f183-439b-8980-ad03b5a01e60", + "path": "/5", + "interactions": "", + "processors": "", + "groups": "", + "action": "Primary 2D Axis Touch", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "325ec093-e834-4551-9b8f-4a3311ed737e", + "path": "/6", + "interactions": "", + "processors": "", + "groups": "", + "action": "Secondary 2D Axis Touch", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "d5f47d18-df5a-4dcd-a20a-c1130b0d4541", + "path": "/7", + "interactions": "", + "processors": "", + "groups": "", + "action": "Primary Touch", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "ab5101fb-5323-4b55-9fe7-e6c377cf7d82", + "path": "/8", + "interactions": "", + "processors": "", + "groups": "", + "action": "Secondary Touch", + "isComposite": false, + "isPartOfComposite": false + } + ] + } + ], + "controlSchemes": [] +} \ No newline at end of file diff --git a/Assets/Gothic-VR/Simulator/XR Interaction Controller Controls.inputactions.meta b/Assets/Gothic-VR/Simulator/XR Interaction Controller Controls.inputactions.meta new file mode 100644 index 000000000..fca53bf30 --- /dev/null +++ b/Assets/Gothic-VR/Simulator/XR Interaction Controller Controls.inputactions.meta @@ -0,0 +1,14 @@ +fileFormatVersion: 2 +guid: 079d8797bb64fc6439253516861e5d1e +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 8404be70184654265930450def6a9037, type: 3} + generateWrapperCode: 0 + wrapperCodePath: + wrapperClassName: + wrapperCodeNamespace: diff --git a/Assets/Gothic-VR/Simulator/XR Interaction Simulator Controls.inputactions b/Assets/Gothic-VR/Simulator/XR Interaction Simulator Controls.inputactions new file mode 100644 index 000000000..3c53b3800 --- /dev/null +++ b/Assets/Gothic-VR/Simulator/XR Interaction Simulator Controls.inputactions @@ -0,0 +1,612 @@ +{ + "name": "XR Interaction Simulator Controls", + "maps": [ + { + "name": "Main", + "id": "c96c4ddb-3eb8-4074-bbd9-a8ae6f1f6475", + "actions": [ + { + "name": "X Translate", + "type": "Value", + "id": "d4eb7006-5077-4816-9d5c-f570b6d586f3", + "expectedControlType": "Axis", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Z Translate", + "type": "Value", + "id": "3ea275ac-e111-4610-891f-105676c72cd5", + "expectedControlType": "Axis", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Y Translate", + "type": "Value", + "id": "5cc58f95-e9dc-4675-a42e-dd66874c3ba3", + "expectedControlType": "Axis", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Toggle Manipulate Left", + "type": "Button", + "id": "847b79d9-a69b-4484-8688-a4bf40e58163", + "expectedControlType": "", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Toggle Manipulate Right", + "type": "Button", + "id": "241f6068-ebc8-4c6d-b747-8bc2c1f74f87", + "expectedControlType": "", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Toggle Manipulate Head", + "type": "Button", + "id": "f5febf74-651b-4f73-8d0a-08b0acdabc4d", + "expectedControlType": "", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Cycle Devices", + "type": "Button", + "id": "d728c6fb-4deb-4268-9110-d64c7861cd17", + "expectedControlType": "", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Keyboard Rotation Delta", + "type": "Value", + "id": "0b945dbf-d750-40cb-97c6-593686fcf012", + "expectedControlType": "Vector2", + "processors": "ScaleVector2(x=3,y=3)", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Toggle Mouse", + "type": "Button", + "id": "0d3e6ba8-5003-4e87-88fd-d173e4669b16", + "expectedControlType": "", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Mouse Rotation Delta", + "type": "Value", + "id": "962fe178-9cca-4e50-9c28-1678bdef1f2e", + "expectedControlType": "Vector2", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Mouse Scroll", + "type": "Value", + "id": "b2a408da-a9fd-4638-9af3-17fb9bc2811d", + "expectedControlType": "Vector2", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Z Constraint", + "type": "Button", + "id": "d3e9308c-6f8c-46f7-bb6f-14422c345983", + "expectedControlType": "", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "X Constraint", + "type": "Button", + "id": "11dc7a94-7230-49ff-b56d-06e6473e9951", + "expectedControlType": "", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Y Constraint", + "type": "Button", + "id": "11ab79c6-b9c6-4301-8086-3e9c6904ef14", + "expectedControlType": "", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Reset", + "type": "Button", + "id": "339ccb79-aee9-4ba4-8864-3b6c81c199db", + "expectedControlType": "", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Cycle Quick Action", + "type": "Button", + "id": "ccb24539-98db-4cd7-a1e9-20bbb63e6c7c", + "expectedControlType": "", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Toggle Perform Quick Action", + "type": "Button", + "id": "1d046e41-ffee-47fc-8eb7-009b81d7d463", + "expectedControlType": "", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Left Device Actions", + "type": "Button", + "id": "88dbb9ff-a55d-4741-a7ea-eb39285ba737", + "expectedControlType": "", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Toggle Primary 2D Axis Target", + "type": "Button", + "id": "e0fdec2d-309b-4313-aad7-9dcc71f1394d", + "expectedControlType": "", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Toggle Secondary 2D Axis Target", + "type": "Button", + "id": "b3b49ea5-f80f-4d24-a782-d61a13a004b3", + "expectedControlType": "", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "Mouse Click", + "type": "Button", + "id": "584edc5e-d39e-4b94-97fd-f18ae89bcc7c", + "expectedControlType": "", + "processors": "", + "interactions": "", + "initialStateCheck": true + }, + { + "name": "Mouse Point", + "type": "Value", + "id": "edfc7561-b5a5-4378-92a9-556dcc1639ed", + "expectedControlType": "Vector2", + "processors": "", + "interactions": "", + "initialStateCheck": true + } + ], + "bindings": [ + { + "name": "1D Axis", + "id": "db741065-2a46-439d-9e13-11960dc3355a", + "path": "1DAxis", + "interactions": "", + "processors": "", + "groups": "", + "action": "X Translate", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "negative", + "id": "3d2e07de-025e-4c2e-98df-250511a8ff6d", + "path": "/a", + "interactions": "", + "processors": "", + "groups": "", + "action": "X Translate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "positive", + "id": "04e1437d-c862-4a04-8f8e-40e9f52c4f5e", + "path": "/d", + "interactions": "", + "processors": "", + "groups": "", + "action": "X Translate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "1D Axis", + "id": "cb7c4679-31f4-4170-885a-e7d78c049443", + "path": "1DAxis", + "interactions": "", + "processors": "", + "groups": "", + "action": "Z Translate", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "negative", + "id": "732e790c-f2a2-4f90-b525-53139a358de7", + "path": "/s", + "interactions": "", + "processors": "", + "groups": "", + "action": "Z Translate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "positive", + "id": "d5a98916-ade7-419d-a138-86bcdf05670f", + "path": "/w", + "interactions": "", + "processors": "", + "groups": "", + "action": "Z Translate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "1D Axis", + "id": "fca20498-bf6f-4824-ba15-6dc2d191eb2f", + "path": "1DAxis", + "interactions": "", + "processors": "", + "groups": "", + "action": "Y Translate", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "negative", + "id": "2c01790c-a24a-4266-a2e9-74e2a1ca3fa7", + "path": "/q", + "interactions": "", + "processors": "", + "groups": "", + "action": "Y Translate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "positive", + "id": "f5223aed-93c0-4633-8aa3-c393ce890872", + "path": "/e", + "interactions": "", + "processors": "", + "groups": "", + "action": "Y Translate", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "2D Vector", + "id": "71c7e5e7-f445-4612-876f-d6bf5d6e8571", + "path": "2DVector", + "interactions": "", + "processors": "ScaleVector2(x=2,y=2)", + "groups": "", + "action": "Keyboard Rotation Delta", + "isComposite": true, + "isPartOfComposite": false + }, + { + "name": "up", + "id": "46ddaac9-982d-45fe-994d-20625c0c08e3", + "path": "/upArrow", + "interactions": "", + "processors": "", + "groups": "", + "action": "Keyboard Rotation Delta", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "down", + "id": "f22c5b09-b38f-449e-9cee-ce4e1617d5a8", + "path": "/downArrow", + "interactions": "", + "processors": "", + "groups": "", + "action": "Keyboard Rotation Delta", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "left", + "id": "806b2e40-e883-4e59-8b6f-4b381e6afbb9", + "path": "/leftArrow", + "interactions": "", + "processors": "", + "groups": "", + "action": "Keyboard Rotation Delta", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "right", + "id": "fb7d8ac6-274f-447b-92c3-3e5d62c1ae46", + "path": "/rightArrow", + "interactions": "", + "processors": "", + "groups": "", + "action": "Keyboard Rotation Delta", + "isComposite": false, + "isPartOfComposite": true + }, + { + "name": "", + "id": "66e536bc-b5b6-4c7b-903a-fbcc05fc854e", + "path": "/scroll", + "interactions": "", + "processors": "", + "groups": "", + "action": "Mouse Scroll", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "0fa0d566-1e07-4e17-9b14-3e8fce69ec26", + "path": "/v", + "interactions": "", + "processors": "", + "groups": "", + "action": "X Constraint", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "71c185e1-73fb-4691-b910-70610f397b42", + "path": "/c", + "interactions": "", + "processors": "", + "groups": "", + "action": "Y Constraint", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "09809c10-d09e-4c49-b58f-1995e50cf685", + "path": "/z", + "interactions": "", + "processors": "", + "groups": "", + "action": "Z Constraint", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "cd7dcdd6-b569-4c25-87ea-c62a0fb1cf89", + "path": "/r", + "interactions": "", + "processors": "", + "groups": "", + "action": "Reset", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "5dacc4c7-2e70-4500-8c72-99595c72b49e", + "path": "/tab", + "interactions": "", + "processors": "", + "groups": "", + "action": "Cycle Devices", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "e8a0a3b9-06cf-40a8-86d8-1d8f1d704451", + "path": "/rightBracket", + "interactions": "", + "processors": "", + "groups": "", + "action": "Toggle Manipulate Right", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "b62df009-54c9-4b03-9721-07ca66fe1bdf", + "path": "/leftBracket", + "interactions": "", + "processors": "", + "groups": "", + "action": "Toggle Manipulate Left", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "86517ac9-cd2e-4c4d-b65b-9a4778775f45", + "path": "/backquote", + "interactions": "", + "processors": "", + "groups": "", + "action": "Cycle Quick Action", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "3e77bddb-a66d-4efe-bdca-d2e589f6f5ab", + "path": "/enter", + "interactions": "", + "processors": "", + "groups": "", + "action": "Toggle Perform Quick Action", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "172a43ed-da34-4ccd-a9b3-07c4f61fa144", + "path": "/h", + "interactions": "", + "processors": "", + "groups": "", + "action": "Toggle Manipulate Head", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "b60dac83-d2d0-4ce2-9110-6594bb414c06", + "path": "/shift", + "interactions": "", + "processors": "", + "groups": "", + "action": "Left Device Actions", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "5293c2a3-bad4-4a0e-9068-683f86bc0aa2", + "path": "/rightButton", + "interactions": "", + "processors": "", + "groups": "", + "action": "Toggle Mouse", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "cfb9abc5-87fa-42c9-bdd0-6a65150e573e", + "path": "/delta", + "interactions": "", + "processors": "", + "groups": "", + "action": "Mouse Rotation Delta", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "81d47d9e-4920-4098-94d8-bac2888d6433", + "path": "/0", + "interactions": "", + "processors": "", + "groups": "", + "action": "Toggle Secondary 2D Axis Target", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "4bfdd0e6-1936-4f44-8e97-20e16dbc879f", + "path": "/9", + "interactions": "", + "processors": "", + "groups": "", + "action": "Toggle Primary 2D Axis Target", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "f185f12a-caec-4590-9570-01f698454be6", + "path": "/position", + "interactions": "", + "processors": "", + "groups": "", + "action": "Mouse Point", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "00efa338-0eb0-4cd5-b470-3280680cd861", + "path": "/leftButton", + "interactions": "", + "processors": "", + "groups": "", + "action": "Mouse Click", + "isComposite": false, + "isPartOfComposite": false + } + ] + }, + { + "name": "UI", + "id": "58a8d986-915c-4e05-8f5c-82630ab36cb1", + "actions": [ + { + "name": "ToggleActionMenu", + "type": "Button", + "id": "9cf6336f-a66e-49cc-98ec-029ee4a05b7f", + "expectedControlType": "", + "processors": "", + "interactions": "", + "initialStateCheck": false + }, + { + "name": "ToggleInputSelectionMenu", + "type": "Button", + "id": "47fdc296-4a53-41c0-a978-ff0096493db1", + "expectedControlType": "", + "processors": "", + "interactions": "", + "initialStateCheck": false + } + ], + "bindings": [ + { + "name": "", + "id": "4ae39c2f-52ef-4e8e-9aed-d5fe6c7c55d4", + "path": "/x", + "interactions": "", + "processors": "", + "groups": "", + "action": "ToggleActionMenu", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "c5636bc1-ad11-4a8c-abc6-ec1a98fe94f7", + "path": "/y", + "interactions": "", + "processors": "", + "groups": "", + "action": "ToggleInputSelectionMenu", + "isComposite": false, + "isPartOfComposite": false + } + ] + } + ], + "controlSchemes": [] +} \ No newline at end of file diff --git a/Assets/Gothic-VR/Simulator/XR Interaction Simulator Controls.inputactions.meta b/Assets/Gothic-VR/Simulator/XR Interaction Simulator Controls.inputactions.meta new file mode 100644 index 000000000..8b320d4a5 --- /dev/null +++ b/Assets/Gothic-VR/Simulator/XR Interaction Simulator Controls.inputactions.meta @@ -0,0 +1,14 @@ +fileFormatVersion: 2 +guid: f52857e8660fd2a48aa592e1c5b0908c +ScriptedImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 2 + userData: + assetBundleName: + assetBundleVariant: + script: {fileID: 11500000, guid: 8404be70184654265930450def6a9037, type: 3} + generateWrapperCode: 0 + wrapperCodePath: + wrapperClassName: + wrapperCodeNamespace: diff --git a/Docs/HVR-replacement/phase-1-rig-input-locomotion-ui.md b/Docs/HVR-replacement/phase-1-rig-input-locomotion-ui.md index 106187ff7..cfabd2258 100644 --- a/Docs/HVR-replacement/phase-1-rig-input-locomotion-ui.md +++ b/Docs/HVR-replacement/phase-1-rig-input-locomotion-ui.md @@ -9,12 +9,18 @@ menus and dialogs, and watch videos, on a headset or in the simulator. Grabbing ## Exit criteria - [ ] `DeveloperConfig.VrInteractionBackend = Xri` boots Quest, Pico and PCVR builds into the world without HVR - installed. + installed. (Editor play mode boots into the world on Xri; the project compiles without `GOTHIC_HVR_INSTALLED`. + Builds: first run of the CI job `buildWithoutHVR`, then a headset.) - [ ] Every comfort setting from the accessibility menu works on the XRI rig, and existing Gothic.ini values load. + (Implemented in 1b; snap turn and move speeds checked in the simulator. Needs headset playtests.) - [ ] Menus, dialogs, virtual keyboard, cinema, subtitles, print-screen messages and the spectator camera work. + (Simulator: in-game menu laser click, dialog choice, video skip. Virtual keyboard, print-screen and spectator + camera untested; needs a headset.) - [ ] Swimming/diving behaves as on HVR (strokes, gravity, fade with air, walking out of water). -- [ ] The XR Interaction Simulator replaces the HVR simulator for the Xri backend. -- [ ] CI builds the Xri backend without the private HVR repo (new job or label). + (Simulator: swim mode, gravity, strokes; dive fade via code in 1c. Climbing out and the feel need a headset.) +- [x] The XR Interaction Simulator replaces the HVR simulator for the Xri backend. (1d) +- [ ] CI builds the Xri backend without the private HVR repo (new job or label). (1d: job `buildWithoutHVR` added, + not run yet.) ## Packages @@ -263,11 +269,54 @@ Already on `IVrRig` after Phase 0. Check: `HVRBodySimulator`. - Port the on-screen help from `VRSimulatorControlsGUI` (keys list) as a small `OnGUI`/UGUI overlay. +- [x] Done in 1d. Notes: + - Prefab `Gothic-VR/Resources/VR/Prefabs/VR - XR Interaction Simulator.prefab` (copy of the sample prefab: + `XRInteractionSimulator`, `SimulatedDeviceLifecycleManager`, `InputActionManager`, `SimulatedHandPlaybackManager`, + all package scripts) plus our `XriSimulatorControlsGUI`. Its input actions are copied to `Gothic-VR/Simulator/` + (`XR Interaction Simulator Controls`, `XR Interaction Controller Controls`); no reference into `Samples/` is left. + Left out: the sample UI prefab (1 MB, sample scripts; replaced by our overlay) and the hand mode (hand controls, + expressions and 32 MB of hand recordings; hand tracking capability off, expression lists empty), as the rig + uses controllers only. + - `Player.unity` and `Lab.unity` hold it inactive next to `HVR - XRDeviceSimulator`. `XriInput.SetDeviceSimulatorActive` + (called from `SetupPlayerController` with `EnableVRDeviceSimulator`) enables it; the Hvr backend still toggles the + HVR simulator only. `XriInput.IsSimulator` is true while it is active. + - The simulator finds controllers only through an `XRInputModalityManager` (our rig has none) and fell back to the + camera, so point-and-click aimed the camera. `XriInput` assigns the rig's `Left/Right Controller` to it before + enabling it. + - Simulated controllers report no velocity, so swim strokes did nothing. While the simulator is active, + `XriInput.GetControllerVelocity` derives it from the controller's position change in the tracking space. + - `XriSimulatorControlsGUI` (own code, `OnGUI`, F1 toggles): Gothic keys, the simulator's keys and the device it + currently drives. + - Key conflicts with the simulator, resolved: + + | Gothic key (1a) | Simulator use | Now | + |-----------------|---------------|-----| + | Esc (menu) | - | unchanged | + | Space (jump) | toggle quick action | Space stays jump; quick action moved to **Enter** in our copy of the simulator controls | + | Z / X (crouch) | Z: Z-axis constraint, X: action menu of the sample UI (not used) | crouch is **X** only | + | Left Shift (sprint) | Shift = buttons/stick go to the left controller | sprint is **F**; walking is Shift + I/J/K/L (left stick) | + | T (both grips, `VRPlayer`) | trigger (= UI click) | T is the trigger only on Xri; `IVrInput.UsesBothGripsSimulatorKey` (Hvr true, Xri false). Both grips: `[` and `]` together, then G | + + The Gothic keyboard bindings are in binding group `Simulator`, the controller bindings in `XR`. `XriInput` masks the + `Gothic` map to `XR` unless the simulator is active, so the keyboard does nothing on a headset (like on HVR). + Before, T in the XRI simulator started speech-to-text recording on every trigger press (and threw in + `SpeechToTextHandler.GetMicrophoneDeviceName` without a microphone). + - Play mode test (G1, Xri, simulator; keys injected via the Input System, Game view at 919x301), see the test plan + section below. + ## CI - Add a build job that doesn't inject HVR, removes `GOTHIC_HVR_INSTALLED` and sets the backend to `Xri`. Methods stay `VRBuilderActions.Perform*Build`. +- [x] Done in 1d: job `buildWithoutHVR` in `.github/workflows/test_and_build.yml` replaces the disabled + `testCompileWithoutHVR`. Same matrix (Windows64, Pico, Quest) and build methods as `buildForAllPlatforms`, runs on + the label `pipeline-test-build` (together with the HVR build) or `pipeline-test-build-xri` (alone). It removes + `GOTHIC_HVR_INSTALLED` from `ProjectSettings.asset` and fails if the define or `Assets/HurricaneVR` is still there, + uses its own Library cache key (`Library-Xri-*`) and uploads `Gothic-Unity--Xri`. The backend isn't set + in an asset: `VRContextBootstrap.SelectBackend` falls back to Xri when HVR isn't compiled in (1a). Not run yet (no CI + access from here); YAML checked with a parser. + ## Test plan On Quest 3, Pico 4 and PCVR (Index), backend `Xri`: @@ -281,6 +330,20 @@ On Quest 3, Pico 4 and PCVR (Index), backend `Xri`: 7. Head into a wall → fades. 8. Simulator on a desktop without a headset: all of the above that applies. +1d results with the simulator (G1 new game, Xri backend, `EnableVRDeviceSimulator`, editor play mode without a +headset; keys injected into the Input System from editor scripts, not typed by a person): +- OK: `IsSimulator` true, Gothic keyboard bindings unmasked; intro video skipped with the simulated right primary + button (key 1); walk with the simulated left stick (Shift + I, 1.5 m/s, stopped by a rock); sprint (F, move speed + 3.5 until the stick is released); snap turn (L, 15°); jump (Space, +0.35 m); crouch toggle (X, camera 1.66 -> 0.70 + m and back); menu (Esc); laser click in the in-game menu (mouse aims the right controller ray, T = trigger opened + Options); Diego's start dialog: choice clicked with the ray + T, dialog went on; walking away from a dialog chose + END; swim (teleport into 3.3 m deep water -> Swim, gravity 0, jump/crouch off) and strokes (] + hold G + S: hand + pulled back, player swam 9 m forward); T no longer triggers both grips/speech-to-text. +- Not tested in 1d: dive and air fade with the simulator (1c checked them via code), climbing out of water, main + menu pages/virtual keyboard/sliders, accessibility settings, subtitles visually, the help overlay visually (only + compiled and enabled; OnGUI isn't in MCP screenshots), Lab.unity. +- Needs a headset: everything on Quest 3 / Pico 4 / PCVR (items 1-7 above), room-scale, comfort settings, haptics. + ## Risks | Risk | Mitigation | From 25817d989dafebb2bde517537392074e3d4fcf47 Mon Sep 17 00:00:00 2001 From: JaXt0r Date: Thu, 22 Oct 2026 16:32:15 +0200 Subject: [PATCH 2/2] docs: HVR replacement plan updated - physics hands (phase 5d) skipped, Phase 5 on hold until Gothic's own fist meshes are used for hands, and nothing from UltimateXR is used (no meshes, no code, no reference). Phase 6 now only waits for Phases 1-4. Co-Authored-By: Claude Opus 5.5 --- Docs/HVR-replacement/04-recommendation.md | 5 ++++- Docs/HVR-replacement/README.md | 4 +++- Docs/HVR-replacement/phase-2-grabbing.md | 2 +- .../phase-4-doors-chests-ladders.md | 4 ++-- Docs/HVR-replacement/phase-5-hands.md | 17 +++++++++++++++-- Docs/HVR-replacement/phase-6-removal.md | 8 ++++---- 6 files changed, 29 insertions(+), 11 deletions(-) diff --git a/Docs/HVR-replacement/04-recommendation.md b/Docs/HVR-replacement/04-recommendation.md index 00d232c76..90c926e02 100644 --- a/Docs/HVR-replacement/04-recommendation.md +++ b/Docs/HVR-replacement/04-recommendation.md @@ -48,6 +48,9 @@ containers/doors), and **borrow selectively from UltimateXR (MIT)**, mainly its the phase most likely to overrun, and keep physics hands optional. - During the transition there are two backends. Phase 0 keeps that cheap. +> **Update 2026-10-22:** physics hands (5d) are skipped, hands will be Gothic's own fist meshes, and nothing is +> taken from UltimateXR. Phase 5 is on hold; see `phase-5-hands.md`. + ## Target architecture ``` @@ -104,7 +107,7 @@ can run in parallel once Phase 1 has landed. | HVR asset | Replacement | |-----------|-------------| | TechDemo XR rig | New `VR - Player.prefab` from XRI Starter Assets as reference, built through UnityMCP | -| Hand models / controller models | UXR hands (MIT, keep notice); controller models from XRI / OpenXR render models or none | +| Hand models / controller models | Gothic's own fist meshes at runtime via ZenKit (future task, decision 2026-10-22; nothing from UXR); controller models none | | Socket rings, teleport marker | Simple procedural/CC0 meshes + our URP materials | | Backpack prefab + SFX | Gothic asset at runtime (a bag/pouch mesh from the Gothic install, loaded via ZenKit) + Gothic SFX - keeps the "no bundled assets" principle | | Input maps, controller offsets | XRI Input Actions asset + per-profile pose offsets (OpenXR grip/aim poses mostly make them unnecessary) | diff --git a/Docs/HVR-replacement/README.md b/Docs/HVR-replacement/README.md index 5a2c81920..ac6121bda 100644 --- a/Docs/HVR-replacement/README.md +++ b/Docs/HVR-replacement/README.md @@ -19,7 +19,7 @@ Quest 2/3, Pico, PCVR, including Index / Steam Frame finger tracking. | 2 | [phase-2-grabbing.md](phase-2-grabbing.md) - items, melee, distance grab, hover, mobs, NPCs | M-L | | 3 | [phase-3-sockets-inventory.md](phase-3-sockets-inventory.md) - backpack, holsters, chest slots, NPC loot | L | | 4 | [phase-4-doors-chests-ladders.md](phase-4-doors-chests-ladders.md) - hinges, lock picking, chest lids, ladders | M | -| 5 | [phase-5-hands.md](phase-5-hands.md) - hand models, finger curls, procedural posing, physics hands | L-XL | +| 5 | [phase-5-hands.md](phase-5-hands.md) - **on hold**; physics hands skipped, Gothic fist meshes later | L-XL | | 6 | [phase-6-removal.md](phase-6-removal.md) - delete HVR, define, CI injection; update docs | S | ## TL;DR @@ -37,6 +37,8 @@ Quest 2/3, Pico, PCVR, including Index / Steam Frame finger tracking. Missing: physics hands, procedural/authored hand posing. - **Recommendation:** our own `Gothic.VR.Interaction` ports, with XRI as the backend, our own procedural poser, physics hands and door/container components, plus selected UltimateXR borrowings (hands art, pose ideas). +- **Update 2026-10-22:** physics hands are skipped, hands will use Gothic's own fist meshes, and nothing from + UltimateXR is used. Phase 5 is on hold. Six phases, ≈12-18 developer-weeks. Phase 0 (decoupling behind ports while HVR still runs) comes first and keeps every other option open. diff --git a/Docs/HVR-replacement/phase-2-grabbing.md b/Docs/HVR-replacement/phase-2-grabbing.md index 1545761bf..e1db6de8c 100644 --- a/Docs/HVR-replacement/phase-2-grabbing.md +++ b/Docs/HVR-replacement/phase-2-grabbing.md @@ -100,7 +100,7 @@ HVR ones. | Risk | Mitigation | |------|-----------| -| Hand and item separate visually (no physics hands until Phase 5) | Accept for now, or attach the hand model to the item while held (`XRGrabInteractable` → parent the hand visual to the attach transform). That's a cheap interim fix worth doing. | +| Hand and item separate visually (no physics hands: 5d is skipped) | Accept, or attach the hand model to the item while held (`XRGrabInteractable` → parent the hand visual to the attach transform). That's a cheap interim fix worth doing. | | VelocityTracking jitter while walking | Turn on rigidbody interpolation for held items and test XRI's visual-smoothing options for velocity-tracked grabs. Test while running. | | API names in this doc drift from the pinned XRI version | Names here follow XRI 3.x docs. Verify each one with `unity_reflect` / the package docs before implementing. | | Runtime colliders not registered | Register the interactable after `VobItem` creation (see the mapping table). Add a log warning if `colliders.Count == 0` on hover registration. | diff --git a/Docs/HVR-replacement/phase-4-doors-chests-ladders.md b/Docs/HVR-replacement/phase-4-doors-chests-ladders.md index 10f5e792d..1f0fddb4c 100644 --- a/Docs/HVR-replacement/phase-4-doors-chests-ladders.md +++ b/Docs/HVR-replacement/phase-4-doors-chests-ladders.md @@ -51,8 +51,8 @@ hand drags the leaf physically. No position tracking of the hand → hinge, whic problem. Set `trackRotation = false` so only the position drives the leaf (feels like pushing/pulling a handle). Alternative if VelocityTracking + HingeJoint feels jittery: kinematic leaf with our own angle solve (project the hand -movement onto the hinge plane, clamp to the limits). That's how UltimateXR does constrained grabbables -(`UxrGrabbableObject` rotation constraints, MIT, useful as a reference). +movement onto the hinge plane, clamp to the limits). (Decision 2026-10-22: nothing from UltimateXR is used, not even +as a code reference.) ### Chest diff --git a/Docs/HVR-replacement/phase-5-hands.md b/Docs/HVR-replacement/phase-5-hands.md index 21dddca35..ebe0530c6 100644 --- a/Docs/HVR-replacement/phase-5-hands.md +++ b/Docs/HVR-replacement/phase-5-hands.md @@ -6,6 +6,19 @@ hands that don't pass through walls. **Size:** L-XL (3-5 weeks) · **Depends on:** Phases 1-3 · **Riskiest phase** (see 04, "What we accept") +> **Decision 2026-10-22 (team): Phase 5 is on hold, 5d is skipped.** +> - **5d physics hands: skipped.** Not part of the HVR replacement. Hands follow the controllers directly (Phase 2 +> state incl. the interim "parent the hand visual to the held item" fix). +> - **Hand models: Gothic's own fist meshes**, loaded at runtime via ZenKit like every other asset (future task). +> **Nothing is imported or copied from UltimateXR** - no hand meshes, no pose editor, no code. The UXR references +> below are history. +> - 5a-5c are designed for articulated hands. With fist-only meshes, finger curls (5b) and procedural finger posing +> (5c) probably don't apply; re-plan them once the Gothic fist meshes are in. Until then the Xri rig shows a simple +> placeholder (or no) hand visual. +> - Phase 6 doesn't wait for Phase 5. +> +> The rest of this document is the original plan, kept for reference. + Split into four parts that ship separately. 5a-5c are required, 5d is optional. | Part | Content | Size | @@ -13,7 +26,7 @@ Split into four parts that ship separately. 5a-5c are required, 5d is optional. | 5a | Hand models + rig + `VRHandsOnTop` | S | | 5b | `FingerCurlProvider` (buttons, touches, XR Hands) | S-M | | 5c | `ProceduralHandPoser` + few authored poses | M-L | -| 5d | `PhysicsHand` (joint-driven), ghost hand, teleport handling | L | +| 5d | ~~`PhysicsHand` (joint-driven), ghost hand, teleport handling~~ **skipped** | L | ## Exit criteria @@ -89,7 +102,7 @@ UltimateXR Hand Pose Editor (MIT, authored poses). `VrHandPose` asset = per-bone local rotations; capture them in the editor from the posed hand (a small "Save pose" inspector button) instead of porting a full pose editor. -## 5d - Physics hands (optional, immersion setting) +## 5d - Physics hands (optional, immersion setting) - SKIPPED (see decision at the top) Replaces `HVRJointHand` + `HVRHandPhysics` + `HVRGhostHand` + the hand part of `HVRTeleportCollisonHandler`. diff --git a/Docs/HVR-replacement/phase-6-removal.md b/Docs/HVR-replacement/phase-6-removal.md index f1512ad55..4cf3b3c36 100644 --- a/Docs/HVR-replacement/phase-6-removal.md +++ b/Docs/HVR-replacement/phase-6-removal.md @@ -3,13 +3,13 @@ **Goal:** HVR is gone from the repository, the build and the docs. Every contributor can open the project, build the VR targets and play them, with or without a headset (simulator). -**Size:** S (2-3 days) · **Depends on:** Phases 1-5 accepted in playtests on Quest, Pico and PCVR (5d may still be -off by default) +**Size:** S (2-3 days) · **Depends on:** Phases 1-4 accepted in playtests on Quest, Pico and PCVR (Phase 5 is on hold, +5d physics hands are skipped - see phase-5-hands.md) ## Entry check (go / no-go) - [ ] Xri backend has been the default for at least one release/playtest round without HVR-only regressions. -- [ ] The playtest checklists of Phases 0-5 pass on Quest 3, Pico 4 and PCVR (Index). +- [ ] The playtest checklists of Phases 0-4 pass on Quest 3, Pico 4 and PCVR (Index). - [ ] Nobody on Discord has open work that depends on HVR components. ## Work items @@ -38,7 +38,7 @@ off by default) `HVRGlobal` instance in `Player.unity` / `Lab.unity`, `UIManager` (HVR) instance. - [ ] Rename `VR - Player XRI.prefab` → `VR - Player.prefab`. - [ ] Delete `Gothic-VR/Resources/VR/HVR Settings/`, `GUZ-VR-Socketables.asset`, - `Player-Elements/BackPack/backpack_*_hand_pose.asset` (replaced in Phase 5), old slot prefabs. + `Player-Elements/BackPack/backpack_*_hand_pose.asset` (no replacement while Phase 5 is on hold), old slot prefabs. - [ ] Open every VR prefab and scene once and check for "Missing script" (UnityMCP `find_gameobjects` / console). ### Build and CI