From 127cc41a9d590615a093a05a2d22c7f94976ea53 Mon Sep 17 00:00:00 2001 From: JaXt0r Date: Thu, 22 Oct 2026 16:59:03 +0200 Subject: [PATCH] feat: items can be grabbed on the Xri backend - Near-Far interactor per hand (direct grab, distance grab pulled to the hand with line-of-sight check, UI pointing on the same ray), GothicGrabInteractable (velocity tracking, two hands, throw) and XriInteractableBridge on oCItem raising the VrInteractable events (inventory, ghost layer, hover label); swimming disables grabbing and hovering; small sphere as interim hand visual (HVR phase 2a). No player-visible change on the default Hvr backend. Co-Authored-By: Claude Opus 5.5 --- .../VR/Prefabs/VR - Player XRI.prefab | 2004 ++++++++++------- .../Resources/VR/Prefabs/Vobs/oCItem.prefab | 145 ++ .../Backends/Hvr/HvrInteractableBridge.cs | 11 +- .../Backends/Xri/GothicGrabInteractable.cs | 62 + .../Xri/GothicGrabInteractable.cs.meta | 2 + .../Interaction/Backends/Xri/XriBackend.cs | 11 +- .../Backends/Xri/XriGrabberBridge.cs | 150 ++ .../Backends/Xri/XriGrabberBridge.cs.meta | 2 + .../Backends/Xri/XriInteractableBridge.cs | 207 ++ .../Xri/XriInteractableBridge.cs.meta | 2 + .../Backends/Xri/XriLineOfSightFilter.cs | 80 + .../Backends/Xri/XriLineOfSightFilter.cs.meta | 2 + .../Interaction/Backends/Xri/XriRig.cs | 53 +- .../Interaction/Backends/Xri/XriUiPointers.cs | 2 +- .../Interaction/Components/VrInteractable.cs | 13 +- .../Interaction/Models/VrGrabberKind.cs | 3 +- .../Ports/IVrInteractableBackend.cs | 6 + Docs/HVR-replacement/phase-2-grabbing.md | 42 +- 18 files changed, 2002 insertions(+), 795 deletions(-) create mode 100644 Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/GothicGrabInteractable.cs create mode 100644 Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/GothicGrabInteractable.cs.meta create mode 100644 Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriGrabberBridge.cs create mode 100644 Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriGrabberBridge.cs.meta create mode 100644 Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriInteractableBridge.cs create mode 100644 Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriInteractableBridge.cs.meta create mode 100644 Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriLineOfSightFilter.cs create mode 100644 Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriLineOfSightFilter.cs.meta diff --git a/Assets/Gothic-VR/Resources/VR/Prefabs/VR - Player XRI.prefab b/Assets/Gothic-VR/Resources/VR/Prefabs/VR - Player XRI.prefab index 7a225ccce..2a7708b59 100644 --- a/Assets/Gothic-VR/Resources/VR/Prefabs/VR - Player XRI.prefab +++ b/Assets/Gothic-VR/Resources/VR/Prefabs/VR - Player XRI.prefab @@ -38,6 +38,186 @@ Transform: - {fileID: 1397900127559310352} m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1648582915323492552 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 7590858937247465678} + - component: {fileID: 3406680570543717621} + - component: {fileID: 6819593342976840041} + m_Layer: 8 + m_Name: Hand Placeholder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &7590858937247465678 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1648582915323492552} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.04, y: 0.04, z: 0.04} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 6788907536904435118} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &3406680570543717621 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1648582915323492552} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &6819593342976840041 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1648582915323492552} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_MaskInteraction: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!1 &1779402344543698678 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5574353106735583174} + - component: {fileID: 6781701994134242995} + - component: {fileID: 8195154184858830657} + m_Layer: 8 + m_Name: Hand Placeholder + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &5574353106735583174 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1779402344543698678} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.04, y: 0.04, z: 0.04} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 5451842862611423810} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!33 &6781701994134242995 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1779402344543698678} + m_Mesh: {fileID: 10207, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &8195154184858830657 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1779402344543698678} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_MaskInteraction: 0 + m_AdditionalVertexStreams: {fileID: 0} --- !u!1 &3580888346999583535 GameObject: m_ObjectHideFlags: 0 @@ -345,7 +525,7 @@ Transform: m_ConstrainProportionsScale: 0 m_Children: - {fileID: 6001075864142468059} - - {fileID: 4353545054853201903} + - {fileID: 6788907536904435118} m_Father: {fileID: 7905090655299301591} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &7612709134508012581 @@ -666,7 +846,7 @@ MonoBehaviour: _fadeSpeed: 6 _teleportDistance: 1 _distanceIterations: 5 ---- !u!1 &4731101190965350723 +--- !u!1 &5458298503362937332 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -674,43 +854,279 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 6347680414218280407} - - component: {fileID: 1007848101285802167} - - component: {fileID: 4875168347225730959} - - component: {fileID: 6723761090415705728} + - component: {fileID: 907255186901895709} + - component: {fileID: 3084357974999831216} + - component: {fileID: 2422468784815213386} + - component: {fileID: 2509143315430069749} m_Layer: 8 - m_Name: UI Ray + m_Name: LineVisual m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &6347680414218280407 +--- !u!4 &907255186901895709 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4731101190965350723} + m_GameObject: {fileID: 5458298503362937332} 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: 4055452250844519603} + m_Father: {fileID: 5451842862611423810} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!120 &1007848101285802167 +--- !u!114 &3084357974999831216 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5458298503362937332} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 80e353695beb436ab39a90d9ecefaee6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_LineRenderer: {fileID: 2422468784815213386} + m_CurveVisualObject: {fileID: 9092921936286841604} + m_OverrideLineOrigin: 1 + m_LineOriginTransform: {fileID: 5451842862611423810} + m_VisualPointCount: 20 + m_MaxVisualCurveDistance: 30 + m_RestingVisualLineLength: 0.25 + m_LineDynamicsMode: 1 + m_RetractDelay: 1 + m_RetractDuration: 1 + m_ExtendLineToEmptyHit: 0 + m_ExtensionRate: 10 + m_EndPointExpansionRate: 10 + m_ComputeMidPointWithComplexCurves: 0 + m_SnapToSelectedAttachIfAvailable: 1 + m_SnapToSnapVolumeIfAvailable: 1 + m_CurveStartOffset: 0.015 + m_CurveEndOffset: 0.005 + m_CustomizeLinePropertiesForState: 1 + m_LinePropertyAnimationSpeed: 8 + m_NoValidHitProperties: + m_SmoothlyCurveLine: 1 + m_LineBendRatio: 0.25 + m_AdjustWidth: 1 + m_StartWidth: 0.003 + m_EndWidth: 0.003 + m_EndWidthScaleDistanceFactor: 2 + m_AdjustGradient: 1 + m_Gradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 0} + key1: {r: 1, g: 1, b: 1, a: 0.5019608} + key2: {r: 0, g: 0, b: 0, a: 0.2509804} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 193 + atime1: 8192 + atime2: 32768 + atime3: 55705 + atime4: 65342 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 4 + m_CustomizeExpandLineDrawPercent: 1 + m_ExpandModeLineDrawPercent: 0.9 + m_UIHitProperties: + m_SmoothlyCurveLine: 1 + m_LineBendRatio: 0.5 + m_AdjustWidth: 1 + m_StartWidth: 0.004 + m_EndWidth: 0.004 + m_EndWidthScaleDistanceFactor: 2 + m_AdjustGradient: 1 + m_Gradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 0} + key1: {r: 1, g: 0.78431374, b: 0.5686275, a: 0.49019608} + key2: {r: 1, g: 1, b: 1, a: 1} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 16384 + ctime2: 65535 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 8192 + atime2: 32768 + atime3: 65535 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 3 + m_NumAlphaKeys: 4 + m_CustomizeExpandLineDrawPercent: 1 + m_ExpandModeLineDrawPercent: 0.9 + m_UIPressHitProperties: + m_SmoothlyCurveLine: 1 + m_LineBendRatio: 0.5 + m_AdjustWidth: 1 + m_StartWidth: 0.003 + m_EndWidth: 0.003 + m_EndWidthScaleDistanceFactor: 2 + m_AdjustGradient: 1 + m_Gradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 0} + key1: {r: 0.5686275, g: 0.78431374, b: 1, a: 0.627451} + key2: {r: 1, g: 1, b: 1, a: 1} + key3: {r: 1, g: 1, b: 1, a: 0.78431374} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 32768 + ctime2: 65535 + ctime3: 65535 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 8192 + atime2: 26214 + atime3: 42598 + atime4: 65535 + atime5: 65535 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 3 + m_NumAlphaKeys: 5 + m_CustomizeExpandLineDrawPercent: 1 + m_ExpandModeLineDrawPercent: 0.9 + m_SelectHitProperties: + m_SmoothlyCurveLine: 1 + m_LineBendRatio: 0.5 + m_AdjustWidth: 1 + m_StartWidth: 0.003 + m_EndWidth: 0.003 + m_EndWidthScaleDistanceFactor: 2 + m_AdjustGradient: 1 + m_Gradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 0} + key1: {r: 0.5686275, g: 0.78431374, b: 1, a: 0.627451} + key2: {r: 1, g: 1, b: 1, a: 1} + key3: {r: 1, g: 1, b: 1, a: 0.78431374} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 32768 + ctime2: 65535 + ctime3: 65535 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 8192 + atime2: 26214 + atime3: 42598 + atime4: 65535 + atime5: 65535 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 3 + m_NumAlphaKeys: 5 + m_CustomizeExpandLineDrawPercent: 1 + m_ExpandModeLineDrawPercent: 0.75 + m_HoverHitProperties: + m_SmoothlyCurveLine: 1 + m_LineBendRatio: 0.25 + m_AdjustWidth: 1 + m_StartWidth: 0.004 + m_EndWidth: 0.004 + m_EndWidthScaleDistanceFactor: 2 + m_AdjustGradient: 1 + m_Gradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 0} + key1: {r: 1, g: 0.78431374, b: 0.5686275, a: 0.49019608} + key2: {r: 1, g: 1, b: 1, a: 1} + key3: {r: 1, g: 1, b: 1, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 16384 + ctime2: 65535 + ctime3: 65535 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 13878 + atime2: 32768 + atime3: 65535 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 3 + m_NumAlphaKeys: 4 + m_CustomizeExpandLineDrawPercent: 1 + m_ExpandModeLineDrawPercent: 0.9 + m_RenderLineInWorldSpace: 1 + m_SwapMaterials: 0 + m_BaseLineMaterial: {fileID: 0} + m_EmptyHitMaterial: {fileID: 0} +--- !u!120 &2422468784815213386 LineRenderer: serializedVersion: 3 m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4731101190965350723} - m_Enabled: 1 + m_GameObject: {fileID: 5458298503362937332} + m_Enabled: 0 m_CastShadows: 0 - m_ReceiveShadows: 0 + m_ReceiveShadows: 1 m_DynamicOccludee: 1 m_StaticShadowCaster: 0 m_MotionVectors: 0 @@ -726,7 +1142,7 @@ LineRenderer: m_RenderingLayerMask: 1 m_RendererPriority: 0 m_Materials: - - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} + - {fileID: 10306, guid: 0000000000000000f000000000000000, type: 0} m_StaticBatchInfo: firstSubMesh: 0 subMeshCount: 0 @@ -749,9 +1165,7 @@ LineRenderer: m_SortingLayer: 0 m_SortingOrder: 0 m_MaskInteraction: 0 - m_Positions: - - {x: 0, y: 0, z: 0} - - {x: 0, y: 0, z: 1} + m_Positions: [] m_Parameters: serializedVersion: 3 widthMultiplier: 1 @@ -760,7 +1174,7 @@ LineRenderer: m_Curve: - serializedVersion: 3 time: 0 - value: 1 + value: 0.012002945 inSlope: 0 outSlope: 0 tangentMode: 0 @@ -800,8 +1214,8 @@ LineRenderer: m_ColorSpace: -1 m_NumColorKeys: 2 m_NumAlphaKeys: 2 - numCornerVertices: 0 - numCapVertices: 2 + numCornerVertices: 8 + numCapVertices: 8 alignment: 0 textureMode: 0 textureScale: {x: 1, y: 1} @@ -809,51 +1223,103 @@ LineRenderer: generateLightingData: 0 m_UseWorldSpace: 1 m_Loop: 0 - m_ApplyActiveColorSpace: 1 ---- !u!114 &4875168347225730959 -MonoBehaviour: + m_ApplyActiveColorSpace: 0 +--- !u!210 &2509143315430069749 +SortingGroup: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4731101190965350723} + m_GameObject: {fileID: 5458298503362937332} m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 6803edce0201f574f923fd9d10e5b30a, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.XR.Interaction.Toolkit::UnityEngine.XR.Interaction.Toolkit.Interactors.XRRayInteractor - m_InteractionManager: {fileID: 0} - m_InteractionLayers: - m_Bits: 0 - m_Handedness: 2 - m_AttachTransform: {fileID: 0} - m_KeepSelectedTargetValid: 1 - m_DisableVisualsWhenBlockedInGroup: 1 - m_StartingSelectedInteractable: {fileID: 0} - m_StartingTargetFilter: {fileID: 0} - m_AutoFindParentInteractableInHierarchy: 0 - m_ParentInteractableObject: {fileID: 0} - m_HoverEntered: - m_PersistentCalls: - m_Calls: [] - m_HoverExited: - m_PersistentCalls: - m_Calls: [] - m_SelectEntered: - m_PersistentCalls: - m_Calls: [] + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 30005 + m_SortAtRoot: 0 + m_Sort3DAs2D: 0 +--- !u!1 &5636525272695460430 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6788907536904435118} + - component: {fileID: 1096273261276596531} + - component: {fileID: 7902857795092302613} + - component: {fileID: 1774130759478450103} + - component: {fileID: 3337548623410234358} + - component: {fileID: 6472663756327604934} + - component: {fileID: 3337253397848854983} + m_Layer: 8 + m_Name: Near-Far Interactor + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &6788907536904435118 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5636525272695460430} + 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: + - {fileID: 6160204099483398844} + - {fileID: 7590858937247465678} + m_Father: {fileID: 2704301485295035116} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1096273261276596531 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5636525272695460430} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 25a07ef133a37d140a87cdf1f1c75fdf, type: 3} + m_Name: + m_EditorClassIdentifier: + m_InteractionManager: {fileID: 6227812651718498198} + m_InteractionLayers: + m_Bits: 1 + m_Handedness: 1 + m_AttachTransform: {fileID: 0} + m_KeepSelectedTargetValid: 1 + m_DisableVisualsWhenBlockedInGroup: 1 + m_StartingSelectedInteractable: {fileID: 0} + m_StartingTargetFilter: {fileID: 6472663756327604934} + m_AutoFindParentInteractableInHierarchy: 0 + m_ParentInteractableObject: {fileID: 0} + m_HoverEntered: + m_PersistentCalls: + m_Calls: [] + m_HoverExited: + m_PersistentCalls: + m_Calls: [] + m_SelectEntered: + m_PersistentCalls: + m_Calls: [] m_SelectExited: m_PersistentCalls: m_Calls: [] m_StartingHoverFilters: [] m_StartingSelectFilters: [] m_SelectInput: - m_InputSourceMode: 0 + m_InputSourceMode: 2 m_InputActionPerformed: m_Name: Select m_Type: 1 m_ExpectedControlType: - m_Id: b471e55a-b3c9-4672-958c-b80bb6d9695e + m_Id: 2491b664-3d4e-4f20-a7ae-ee1861d845f2 m_Processors: m_Interactions: m_SingletonActionBindings: [] @@ -862,13 +1328,13 @@ MonoBehaviour: m_Name: Select Value m_Type: 0 m_ExpectedControlType: Axis - m_Id: 69fcf19e-30fe-4837-a9c7-fd0348702802 + m_Id: fc42dacc-33eb-41ec-9c17-d242ac6b0c5b m_Processors: m_Interactions: m_SingletonActionBindings: [] m_Flags: 0 - m_InputActionReferencePerformed: {fileID: 0} - m_InputActionReferenceValue: {fileID: 0} + m_InputActionReferencePerformed: {fileID: -7966444640328253993, guid: 2924cdc729619de4a8f9d4046047a886, type: 3} + m_InputActionReferenceValue: {fileID: -7989615598897241686, guid: 2924cdc729619de4a8f9d4046047a886, type: 3} m_ObjectReferenceObject: {fileID: 0} m_ManualPerformed: 0 m_ManualValue: 0 @@ -878,12 +1344,12 @@ MonoBehaviour: m_ManualQueueValue: 0 m_ManualQueueTargetFrame: 0 m_ActivateInput: - m_InputSourceMode: 0 + m_InputSourceMode: 2 m_InputActionPerformed: m_Name: Activate m_Type: 1 m_ExpectedControlType: - m_Id: 36a6bae6-ef66-428d-9799-25f86174d382 + m_Id: 77660b9e-6bbe-4740-b80f-1fea8d0f59e1 m_Processors: m_Interactions: m_SingletonActionBindings: [] @@ -892,13 +1358,13 @@ MonoBehaviour: m_Name: Activate Value m_Type: 0 m_ExpectedControlType: Axis - m_Id: 46d346f2-2d53-4246-b8f4-5a6820fa0027 + m_Id: 94568f52-c27a-47fc-a190-5e3b17572929 m_Processors: m_Interactions: m_SingletonActionBindings: [] m_Flags: 0 - m_InputActionReferencePerformed: {fileID: 0} - m_InputActionReferenceValue: {fileID: 0} + m_InputActionReferencePerformed: {fileID: -8244156659083291672, guid: 2924cdc729619de4a8f9d4046047a886, type: 3} + m_InputActionReferenceValue: {fileID: -8654792680252043297, guid: 2924cdc729619de4a8f9d4046047a886, type: 3} m_ObjectReferenceObject: {fileID: 0} m_ManualPerformed: 0 m_ManualValue: 0 @@ -944,61 +1410,29 @@ MonoBehaviour: m_HapticHoverCancelIntensity: 0 m_HapticHoverCancelDuration: 0 m_AllowHoverHapticsWhileSelecting: 1 - m_LineType: 0 - m_BlendVisualLinePoints: 1 - m_MaxRaycastDistance: 30 - m_RayOriginTransform: {fileID: 0} - m_ReferenceFrame: {fileID: 0} - m_Velocity: 16 - m_Acceleration: 9.8 - m_AdditionalGroundHeight: 0.1 - m_AdditionalFlightTime: 0.5 - m_EndPointDistance: 30 - m_EndPointHeight: -10 - m_ControlPointDistance: 10 - m_ControlPointHeight: 5 - m_SampleFrequency: 20 - m_HitDetectionType: 0 - m_SphereCastRadius: 0.1 - m_ConeCastAngle: 6 - m_LiveConeCastDebugVisuals: 0 - m_RaycastMask: - serializedVersion: 2 - m_Bits: 32 - m_RaycastTriggerInteraction: 1 - m_RaycastSnapVolumeInteraction: 1 - m_RaycastUIDocumentTriggerInteraction: 1 - m_HitClosestOnly: 0 - m_HoverToSelect: 0 - m_HoverTimeToSelect: 0.5 - m_AutoDeselect: 0 - m_TimeToAutoDeselect: 3 + m_InteractionAttachController: {fileID: 7902857795092302613} + m_EnableNearCasting: 1 + m_NearInteractionCaster: {fileID: 1774130759478450103} + m_NearCasterSortingStrategy: 1 + m_SortNearTargetsAfterTargetFilter: 0 + m_EnableFarCasting: 1 + m_FarInteractionCaster: {fileID: 3337548623410234358} + m_FarAttachMode: 0 m_EnableUIInteraction: 1 - m_BlockInteractionsWithScreenSpaceUI: 0 m_BlockUIOnInteractableSelection: 1 - m_ManipulateAttachTransform: 1 - m_UseForceGrab: 0 - m_RotateSpeed: 180 - m_TranslateSpeed: 1 - m_RotateReferenceFrame: {fileID: 0} - m_RotateMode: 0 m_UIHoverEntered: m_PersistentCalls: m_Calls: [] m_UIHoverExited: m_PersistentCalls: m_Calls: [] - m_EnableARRaycasting: 0 - m_OccludeARHitsWith3DObjects: 0 - m_OccludeARHitsWith2DObjects: 0 - m_ScaleMode: 0 m_UIPressInput: m_InputSourceMode: 2 m_InputActionPerformed: m_Name: UI Press m_Type: 1 m_ExpectedControlType: - m_Id: d0bfb5c4-7a68-4b72-9c10-aef78e3cacc5 + m_Id: ded1ccb2-ff18-46c7-ade9-b80985fe2825 m_Processors: m_Interactions: m_SingletonActionBindings: [] @@ -1007,13 +1441,13 @@ MonoBehaviour: m_Name: UI Press Value m_Type: 0 m_ExpectedControlType: Axis - m_Id: 7e769f7f-e0f9-4408-8325-11f0df58fd7f + m_Id: d762660e-30e0-4a4d-8e2a-e6b553e03f11 m_Processors: m_Interactions: m_SingletonActionBindings: [] m_Flags: 0 - m_InputActionReferencePerformed: {fileID: 2665380231154864692, guid: 2924cdc729619de4a8f9d4046047a886, type: 3} - m_InputActionReferenceValue: {fileID: 2562612067216775393, guid: 2924cdc729619de4a8f9d4046047a886, type: 3} + m_InputActionReferencePerformed: {fileID: -1689652814259620815, guid: 2924cdc729619de4a8f9d4046047a886, type: 3} + m_InputActionReferenceValue: {fileID: 6375731832589024377, guid: 2924cdc729619de4a8f9d4046047a886, type: 3} m_ObjectReferenceObject: {fileID: 0} m_ManualPerformed: 0 m_ManualValue: 0 @@ -1028,264 +1462,145 @@ MonoBehaviour: m_Name: UI Scroll m_Type: 0 m_ExpectedControlType: Vector2 - m_Id: eb22c89e-e384-48d0-83e1-8b0b4a55deba - m_Processors: - m_Interactions: - m_SingletonActionBindings: [] - m_Flags: 0 - m_InputActionReference: {fileID: -711930659198068045, guid: 2924cdc729619de4a8f9d4046047a886, type: 3} - m_ObjectReferenceObject: {fileID: 0} - m_ManualValue: {x: 0, y: 0} - m_TranslateManipulationInput: - m_InputSourceMode: 2 - m_InputAction: - m_Name: Translate Manipulation - m_Type: 0 - m_ExpectedControlType: Vector2 - m_Id: cc26a325-b3b1-4ad6-9df9-44d1e4ebaa9a - m_Processors: - m_Interactions: - m_SingletonActionBindings: [] - m_Flags: 0 - m_InputActionReference: {fileID: 0} - m_ObjectReferenceObject: {fileID: 0} - m_ManualValue: {x: 0, y: 0} - m_RotateManipulationInput: - m_InputSourceMode: 2 - m_InputAction: - m_Name: Rotate Manipulation - m_Type: 0 - m_ExpectedControlType: Vector2 - m_Id: 0d936db2-a7d3-4d2b-b7bc-b344da544173 - m_Processors: - m_Interactions: - m_SingletonActionBindings: [] - m_Flags: 0 - m_InputActionReference: {fileID: 0} - m_ObjectReferenceObject: {fileID: 0} - m_ManualValue: {x: 0, y: 0} - m_DirectionalManipulationInput: - m_InputSourceMode: 2 - m_InputAction: - m_Name: Directional Manipulation - m_Type: 0 - m_ExpectedControlType: Vector2 - m_Id: 3e8c45e8-765a-4b9d-9985-7e9199dcf134 + m_Id: ef5cc4a5-b968-432c-9ae7-45e494178db0 m_Processors: m_Interactions: m_SingletonActionBindings: [] m_Flags: 0 - m_InputActionReference: {fileID: 0} + m_InputActionReference: {fileID: 8109287064717489457, guid: 2924cdc729619de4a8f9d4046047a886, type: 3} m_ObjectReferenceObject: {fileID: 0} m_ManualValue: {x: 0, y: 0} - m_ScaleToggleInput: - m_InputSourceMode: 2 - m_InputActionPerformed: - m_Name: Scale Toggle - m_Type: 1 - m_ExpectedControlType: - m_Id: df8a8838-2881-4d9d-8486-2bee7662d138 - m_Processors: - m_Interactions: - m_SingletonActionBindings: [] - m_Flags: 0 - m_InputActionValue: - m_Name: Scale Toggle Value - m_Type: 0 - m_ExpectedControlType: Axis - m_Id: b4f1baad-1223-4283-8143-09cce25bd3b7 - 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_ScaleOverTimeInput: +--- !u!114 &7902857795092302613 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5636525272695460430} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 792f6c7eaa1a4b82abf8351559ac97eb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_TransformToFollow: {fileID: 6788907536904435118} + m_MotionStabilizationMode: 1 + m_PositionStabilization: 0.25 + m_AngleStabilization: 20 + m_SmoothOffset: 0 + m_SmoothingSpeed: 10 + m_UseDistanceBasedVelocityScaling: 1 + m_UseMomentum: 1 + m_MomentumDecayScale: 1.25 + m_MomentumDecayScaleFromInput: 5.5 + m_ZVelocityRampThreshold: 0.3 + m_PullVelocityBias: 1 + m_PushVelocityBias: 1.25 + m_MinAdditionalVelocityScalar: 0.05 + m_MaxAdditionalVelocityScalar: 1.5 + m_UseManipulationInput: 0 + m_ManipulationInput: m_InputSourceMode: 2 m_InputAction: - m_Name: Scale Over Time + m_Name: Manipulation m_Type: 0 m_ExpectedControlType: Vector2 - m_Id: 43f1d0ee-5981-4ed2-80bb-68e6a3c234d7 + m_Id: 9914e1e2-77ba-43ae-8266-fd33d44c8a24 m_Processors: m_Interactions: m_SingletonActionBindings: [] m_Flags: 0 - m_InputActionReference: {fileID: 0} + m_InputActionReference: {fileID: -1031338271674280626, guid: 2924cdc729619de4a8f9d4046047a886, type: 3} m_ObjectReferenceObject: {fileID: 0} m_ManualValue: {x: 0, y: 0} - m_ScaleDistanceDeltaInput: - m_InputSourceMode: 0 - m_InputAction: - m_Name: Scale Distance Delta - m_Type: 0 - m_ExpectedControlType: Axis - m_Id: 90bba99f-cfe6-486e-8303-cd6bf7ffc87a - m_Processors: - m_Interactions: - m_SingletonActionBindings: [] - m_Flags: 0 - m_InputActionReference: {fileID: 0} - m_ObjectReferenceObject: {fileID: 0} - m_ManualValue: 0 ---- !u!114 &6723761090415705728 + m_ManipulationXAxisMode: 1 + m_ManipulationYAxisMode: 2 + m_CombineManipulationAxes: 0 + m_ManipulationTranslateSpeed: 1 + m_ManipulationRotateSpeed: 180 + m_ManipulationRotateReferenceFrame: {fileID: 0} + m_EnableDebugLines: 0 +--- !u!114 &1774130759478450103 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 4731101190965350723} + m_GameObject: {fileID: 5636525272695460430} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: e988983f96fe1dd48800bcdfc82f23e9, type: 3} + m_Script: {fileID: 11500000, guid: 48139a683d3b4ac3a37cd5d24f71acf1, type: 3} m_Name: - m_EditorClassIdentifier: Unity.XR.Interaction.Toolkit::UnityEngine.XR.Interaction.Toolkit.Interactors.Visuals.XRInteractorLineVisual - m_LineWidth: 0.005 - m_OverrideInteractorLineLength: 1 - m_LineLength: 10 - m_AutoAdjustLineLength: 0 - m_MinLineLength: 0.5 - m_UseDistanceToHitAsMaxLineLength: 1 - m_LineRetractionDelay: 0.5 - m_LineLengthChangeSpeed: 12 - m_WidthCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - m_SetLineColorGradient: 1 - m_ValidColorGradient: + m_EditorClassIdentifier: + m_CastOrigin: {fileID: 6788907536904435118} + m_EnableStabilization: 0 + m_PositionStabilization: 0.25 + m_AngleStabilization: 20 + m_AimTargetObject: {fileID: 0} + m_PhysicsLayerMask: serializedVersion: 2 - key0: {r: 1, g: 1, b: 1, a: 1} - key1: {r: 1, g: 1, b: 1, a: 0.3} - key2: {r: 0, g: 0, b: 0, a: 0} - key3: {r: 0, g: 0, b: 0, a: 0} - key4: {r: 0, g: 0, b: 0, a: 0} - key5: {r: 0, g: 0, b: 0, a: 0} - key6: {r: 0, g: 0, b: 0, a: 0} - key7: {r: 0, g: 0, b: 0, a: 0} - ctime0: 0 - ctime1: 65535 - ctime2: 0 - ctime3: 0 - ctime4: 0 - ctime5: 0 - ctime6: 0 - ctime7: 0 - atime0: 0 - atime1: 65535 - atime2: 0 - atime3: 0 - atime4: 0 - atime5: 0 - atime6: 0 - atime7: 0 - m_Mode: 0 - m_ColorSpace: -1 - m_NumColorKeys: 2 - m_NumAlphaKeys: 2 - m_InvalidColorGradient: + m_Bits: 1051840 + m_PhysicsTriggerInteraction: 1 + m_CastRadius: 0.1 +--- !u!114 &3337548623410234358 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5636525272695460430} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ef20135915079454985abea5a2ec8967, type: 3} + m_Name: + m_EditorClassIdentifier: + m_CastOrigin: {fileID: 6788907536904435118} + m_EnableStabilization: 1 + m_PositionStabilization: 0.25 + m_AngleStabilization: 20 + m_AimTargetObject: {fileID: 1096273261276596531} + m_RaycastMask: serializedVersion: 2 - key0: {r: 1, g: 1, b: 1, a: 0} - key1: {r: 1, g: 1, b: 1, a: 0} - key2: {r: 0, g: 0, b: 0, a: 0} - key3: {r: 0, g: 0, b: 0, a: 0} - key4: {r: 0, g: 0, b: 0, a: 0} - key5: {r: 0, g: 0, b: 0, a: 0} - key6: {r: 0, g: 0, b: 0, a: 0} - key7: {r: 0, g: 0, b: 0, a: 0} - ctime0: 0 - ctime1: 65535 - ctime2: 0 - ctime3: 0 - ctime4: 0 - ctime5: 0 - ctime6: 0 - ctime7: 0 - atime0: 0 - atime1: 65535 - atime2: 0 - atime3: 0 - atime4: 0 - atime5: 0 - atime6: 0 - atime7: 0 - m_Mode: 0 - m_ColorSpace: -1 - m_NumColorKeys: 2 - m_NumAlphaKeys: 2 - m_BlockedColorGradient: + m_Bits: 1051873 + m_RaycastTriggerInteraction: 1 + m_RaycastSnapVolumeInteraction: 1 + m_RaycastUIDocumentTriggerInteraction: 1 + m_TargetNumCurveSegments: 1 + m_HitDetectionType: 2 + m_CastDistance: 30 + m_SphereCastRadius: 0.1 + m_ConeCastAngle: 6 + m_LiveConeCastDebugVisuals: 0 +--- !u!114 &6472663756327604934 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5636525272695460430} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 06d37e5228fbbc744a06dbbcbfa399a9, type: 3} + m_Name: + m_EditorClassIdentifier: Gothic.VR::Gothic.VR.Interaction.Backends.Xri.XriLineOfSightFilter + _blockingLayers: serializedVersion: 2 - key0: {r: 1, g: 1, b: 1, a: 0} - key1: {r: 1, g: 1, b: 1, a: 0} - key2: {r: 0, g: 0, b: 0, a: 0} - key3: {r: 0, g: 0, b: 0, a: 0} - key4: {r: 0, g: 0, b: 0, a: 0} - key5: {r: 0, g: 0, b: 0, a: 0} - key6: {r: 0, g: 0, b: 0, a: 0} - key7: {r: 0, g: 0, b: 0, a: 0} - ctime0: 0 - ctime1: 65535 - ctime2: 0 - ctime3: 0 - ctime4: 0 - ctime5: 0 - ctime6: 0 - ctime7: 0 - atime0: 0 - atime1: 65535 - atime2: 0 - atime3: 0 - atime4: 0 - atime5: 0 - atime6: 0 - atime7: 0 - m_Mode: 0 - m_ColorSpace: -1 - m_NumColorKeys: 2 - m_NumAlphaKeys: 2 - m_TreatSelectionAsValidState: 0 - m_SmoothMovement: 0 - m_FollowTightness: 10 - m_SnapThresholdDistance: 10 - m_Reticle: {fileID: 0} - m_BlockedReticle: {fileID: 0} - m_StopLineAtFirstRaycastHit: 1 - m_StopLineAtSelection: 0 - m_SnapEndpointIfAvailable: 1 - m_LineBendRatio: 0.5 - m_BendingEnabledInteractionLayers: - m_Bits: 4294967295 - m_OverrideInteractorLineOrigin: 1 - m_LineOriginTransform: {fileID: 0} - m_LineOriginOffset: 0 + m_Bits: 1051713 + _maxDistance: 10 + _minCheckDistance: 0.15 + _surfaceTolerance: 0.02 +--- !u!114 &3337253397848854983 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5636525272695460430} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dfa36fd411a0e614a83609318964c858, type: 3} + m_Name: + m_EditorClassIdentifier: Gothic.VR::Gothic.VR.Interaction.Backends.Xri.XriGrabberBridge + _nearGrabMargin: 0.05 --- !u!1 &5690067108025510331 GameObject: m_ObjectHideFlags: 0 @@ -1429,7 +1744,7 @@ MonoBehaviour: m_VarianceClampScale: 0.9 m_ContrastAdaptiveSharpening: 0 m_Version: 2 ---- !u!1 &6676953773607633624 +--- !u!1 &6995813130144571658 GameObject: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} @@ -1437,163 +1752,92 @@ GameObject: m_PrefabAsset: {fileID: 0} serializedVersion: 6 m_Component: - - component: {fileID: 4353545054853201903} - - component: {fileID: 6548728158081960086} - - component: {fileID: 4801461948607133199} - - component: {fileID: 3310644866045247143} + - component: {fileID: 7905090655299301591} m_Layer: 8 - m_Name: UI Ray + m_Name: Camera Offset m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 m_IsActive: 1 ---- !u!4 &4353545054853201903 +--- !u!4 &7905090655299301591 Transform: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6676953773607633624} + m_GameObject: {fileID: 6995813130144571658} 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: 2704301485295035116} + m_Children: + - {fileID: 3795310480892305868} + - {fileID: 2704301485295035116} + - {fileID: 4055452250844519603} + m_Father: {fileID: 1361426706454156200} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} ---- !u!120 &6548728158081960086 -LineRenderer: - serializedVersion: 3 +--- !u!1 &7605250946350940930 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 5451842862611423810} + - component: {fileID: 9092921936286841604} + - component: {fileID: 1382507949571466866} + - component: {fileID: 4320139648255297471} + - component: {fileID: 1489026597932994268} + - component: {fileID: 3191210277239289247} + - component: {fileID: 2750591488407108373} + m_Layer: 8 + m_Name: Near-Far Interactor + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &5451842862611423810 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7605250946350940930} + 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: + - {fileID: 907255186901895709} + - {fileID: 5574353106735583174} + m_Father: {fileID: 4055452250844519603} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &9092921936286841604 +MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6676953773607633624} - m_Enabled: 1 - m_CastShadows: 0 - m_ReceiveShadows: 0 - m_DynamicOccludee: 1 - m_StaticShadowCaster: 0 - m_MotionVectors: 0 - m_LightProbeUsage: 0 - m_ReflectionProbeUsage: 0 - m_RayTracingMode: 0 - m_RayTraceProcedural: 0 - m_RayTracingAccelStructBuildFlagsOverride: 0 - m_RayTracingAccelStructBuildFlags: 1 - m_SmallMeshCulling: 1 - m_ForceMeshLod: -1 - m_MeshLodSelectionBias: 0 - m_RenderingLayerMask: 1 - m_RendererPriority: 0 - m_Materials: - - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} - m_StaticBatchInfo: - firstSubMesh: 0 - subMeshCount: 0 - m_StaticBatchRoot: {fileID: 0} - m_ProbeAnchor: {fileID: 0} - m_LightProbeVolumeOverride: {fileID: 0} - m_ScaleInLightmap: 1 - m_ReceiveGI: 1 - m_PreserveUVs: 0 - m_IgnoreNormalsForChartDetection: 0 - m_ImportantGI: 0 - m_StitchLightmapSeams: 1 - m_SelectedEditorRenderState: 3 - m_MinimumChartSize: 4 - m_AutoUVMaxDistance: 0.5 - m_AutoUVMaxAngle: 89 - m_LightmapParameters: {fileID: 0} - m_GlobalIlluminationMeshLod: 0 - m_SortingLayerID: 0 - m_SortingLayer: 0 - m_SortingOrder: 0 - m_MaskInteraction: 0 - m_Positions: - - {x: 0, y: 0, z: 0} - - {x: 0, y: 0, z: 1} - m_Parameters: - serializedVersion: 3 - widthMultiplier: 1 - widthCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - colorGradient: - serializedVersion: 2 - key0: {r: 1, g: 1, b: 1, a: 1} - key1: {r: 1, g: 1, b: 1, a: 1} - key2: {r: 0, g: 0, b: 0, a: 0} - key3: {r: 0, g: 0, b: 0, a: 0} - key4: {r: 0, g: 0, b: 0, a: 0} - key5: {r: 0, g: 0, b: 0, a: 0} - key6: {r: 0, g: 0, b: 0, a: 0} - key7: {r: 0, g: 0, b: 0, a: 0} - ctime0: 0 - ctime1: 65535 - ctime2: 0 - ctime3: 0 - ctime4: 0 - ctime5: 0 - ctime6: 0 - ctime7: 0 - atime0: 0 - atime1: 65535 - atime2: 0 - atime3: 0 - atime4: 0 - atime5: 0 - atime6: 0 - atime7: 0 - m_Mode: 0 - m_ColorSpace: -1 - m_NumColorKeys: 2 - m_NumAlphaKeys: 2 - numCornerVertices: 0 - numCapVertices: 2 - alignment: 0 - textureMode: 0 - textureScale: {x: 1, y: 1} - shadowBias: 0.5 - generateLightingData: 0 - m_UseWorldSpace: 1 - m_Loop: 0 - m_ApplyActiveColorSpace: 1 ---- !u!114 &4801461948607133199 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6676953773607633624} + m_GameObject: {fileID: 7605250946350940930} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 6803edce0201f574f923fd9d10e5b30a, type: 3} + m_Script: {fileID: 11500000, guid: 25a07ef133a37d140a87cdf1f1c75fdf, type: 3} m_Name: - m_EditorClassIdentifier: Unity.XR.Interaction.Toolkit::UnityEngine.XR.Interaction.Toolkit.Interactors.XRRayInteractor - m_InteractionManager: {fileID: 0} + m_EditorClassIdentifier: + m_InteractionManager: {fileID: 6227812651718498198} m_InteractionLayers: - m_Bits: 0 - m_Handedness: 1 + m_Bits: 1 + m_Handedness: 2 m_AttachTransform: {fileID: 0} m_KeepSelectedTargetValid: 1 m_DisableVisualsWhenBlockedInGroup: 1 m_StartingSelectedInteractable: {fileID: 0} - m_StartingTargetFilter: {fileID: 0} + m_StartingTargetFilter: {fileID: 3191210277239289247} m_AutoFindParentInteractableInHierarchy: 0 m_ParentInteractableObject: {fileID: 0} m_HoverEntered: @@ -1611,12 +1855,12 @@ MonoBehaviour: m_StartingHoverFilters: [] m_StartingSelectFilters: [] m_SelectInput: - m_InputSourceMode: 0 + m_InputSourceMode: 2 m_InputActionPerformed: m_Name: Select m_Type: 1 m_ExpectedControlType: - m_Id: 2c2d09cc-6f7e-485d-8201-779ccb72b47b + m_Id: 2491b664-3d4e-4f20-a7ae-ee1861d845f2 m_Processors: m_Interactions: m_SingletonActionBindings: [] @@ -1625,13 +1869,13 @@ MonoBehaviour: m_Name: Select Value m_Type: 0 m_ExpectedControlType: Axis - m_Id: f4aa7ab5-9c01-4fe3-a9fa-e8e54bb69cf7 + m_Id: fc42dacc-33eb-41ec-9c17-d242ac6b0c5b m_Processors: m_Interactions: m_SingletonActionBindings: [] m_Flags: 0 - m_InputActionReferencePerformed: {fileID: 0} - m_InputActionReferenceValue: {fileID: 0} + m_InputActionReferencePerformed: {fileID: 2952293240542986942, guid: 2924cdc729619de4a8f9d4046047a886, type: 3} + m_InputActionReferenceValue: {fileID: 2356269739022366052, guid: 2924cdc729619de4a8f9d4046047a886, type: 3} m_ObjectReferenceObject: {fileID: 0} m_ManualPerformed: 0 m_ManualValue: 0 @@ -1641,12 +1885,12 @@ MonoBehaviour: m_ManualQueueValue: 0 m_ManualQueueTargetFrame: 0 m_ActivateInput: - m_InputSourceMode: 0 + m_InputSourceMode: 2 m_InputActionPerformed: m_Name: Activate m_Type: 1 m_ExpectedControlType: - m_Id: 350d7cae-4b8f-4992-9454-c02bafd85deb + m_Id: 77660b9e-6bbe-4740-b80f-1fea8d0f59e1 m_Processors: m_Interactions: m_SingletonActionBindings: [] @@ -1655,13 +1899,13 @@ MonoBehaviour: m_Name: Activate Value m_Type: 0 m_ExpectedControlType: Axis - m_Id: a491f432-bdc7-47e4-8aa2-c825497237e4 + m_Id: 94568f52-c27a-47fc-a190-5e3b17572929 m_Processors: m_Interactions: m_SingletonActionBindings: [] m_Flags: 0 - m_InputActionReferencePerformed: {fileID: 0} - m_InputActionReferenceValue: {fileID: 0} + m_InputActionReferencePerformed: {fileID: -2432073547575864795, guid: 2924cdc729619de4a8f9d4046047a886, type: 3} + m_InputActionReferenceValue: {fileID: -3908803764926266157, guid: 2924cdc729619de4a8f9d4046047a886, type: 3} m_ObjectReferenceObject: {fileID: 0} m_ManualPerformed: 0 m_ManualValue: 0 @@ -1707,61 +1951,29 @@ MonoBehaviour: m_HapticHoverCancelIntensity: 0 m_HapticHoverCancelDuration: 0 m_AllowHoverHapticsWhileSelecting: 1 - m_LineType: 0 - m_BlendVisualLinePoints: 1 - m_MaxRaycastDistance: 30 - m_RayOriginTransform: {fileID: 0} - m_ReferenceFrame: {fileID: 0} - m_Velocity: 16 - m_Acceleration: 9.8 - m_AdditionalGroundHeight: 0.1 - m_AdditionalFlightTime: 0.5 - m_EndPointDistance: 30 - m_EndPointHeight: -10 - m_ControlPointDistance: 10 - m_ControlPointHeight: 5 - m_SampleFrequency: 20 - m_HitDetectionType: 0 - m_SphereCastRadius: 0.1 - m_ConeCastAngle: 6 - m_LiveConeCastDebugVisuals: 0 - m_RaycastMask: - serializedVersion: 2 - m_Bits: 32 - m_RaycastTriggerInteraction: 1 - m_RaycastSnapVolumeInteraction: 1 - m_RaycastUIDocumentTriggerInteraction: 1 - m_HitClosestOnly: 0 - m_HoverToSelect: 0 - m_HoverTimeToSelect: 0.5 - m_AutoDeselect: 0 - m_TimeToAutoDeselect: 3 + m_InteractionAttachController: {fileID: 1382507949571466866} + m_EnableNearCasting: 1 + m_NearInteractionCaster: {fileID: 4320139648255297471} + m_NearCasterSortingStrategy: 1 + m_SortNearTargetsAfterTargetFilter: 0 + m_EnableFarCasting: 1 + m_FarInteractionCaster: {fileID: 1489026597932994268} + m_FarAttachMode: 0 m_EnableUIInteraction: 1 - m_BlockInteractionsWithScreenSpaceUI: 0 m_BlockUIOnInteractableSelection: 1 - m_ManipulateAttachTransform: 1 - m_UseForceGrab: 0 - m_RotateSpeed: 180 - m_TranslateSpeed: 1 - m_RotateReferenceFrame: {fileID: 0} - m_RotateMode: 0 m_UIHoverEntered: m_PersistentCalls: m_Calls: [] m_UIHoverExited: m_PersistentCalls: m_Calls: [] - m_EnableARRaycasting: 0 - m_OccludeARHitsWith3DObjects: 0 - m_OccludeARHitsWith2DObjects: 0 - m_ScaleMode: 0 m_UIPressInput: m_InputSourceMode: 2 m_InputActionPerformed: m_Name: UI Press m_Type: 1 m_ExpectedControlType: - m_Id: ef9aa844-3839-47af-8488-ffd1125978d8 + m_Id: ded1ccb2-ff18-46c7-ade9-b80985fe2825 m_Processors: m_Interactions: m_SingletonActionBindings: [] @@ -1770,13 +1982,13 @@ MonoBehaviour: m_Name: UI Press Value m_Type: 0 m_ExpectedControlType: Axis - m_Id: 6d73baf7-8ec0-40dc-88d1-79d81f74c543 + m_Id: d762660e-30e0-4a4d-8e2a-e6b553e03f11 m_Processors: m_Interactions: m_SingletonActionBindings: [] m_Flags: 0 - m_InputActionReferencePerformed: {fileID: -1689652814259620815, guid: 2924cdc729619de4a8f9d4046047a886, type: 3} - m_InputActionReferenceValue: {fileID: 6375731832589024377, guid: 2924cdc729619de4a8f9d4046047a886, type: 3} + m_InputActionReferencePerformed: {fileID: 2665380231154864692, guid: 2924cdc729619de4a8f9d4046047a886, type: 3} + m_InputActionReferenceValue: {fileID: 2562612067216775393, guid: 2924cdc729619de4a8f9d4046047a886, type: 3} m_ObjectReferenceObject: {fileID: 0} m_ManualPerformed: 0 m_ManualValue: 0 @@ -1791,298 +2003,145 @@ MonoBehaviour: m_Name: UI Scroll m_Type: 0 m_ExpectedControlType: Vector2 - m_Id: 8a8b5555-7f42-45ee-9db4-923737557f23 + m_Id: ef5cc4a5-b968-432c-9ae7-45e494178db0 m_Processors: m_Interactions: m_SingletonActionBindings: [] m_Flags: 0 - m_InputActionReference: {fileID: 8109287064717489457, guid: 2924cdc729619de4a8f9d4046047a886, type: 3} - m_ObjectReferenceObject: {fileID: 0} - m_ManualValue: {x: 0, y: 0} - m_TranslateManipulationInput: - m_InputSourceMode: 2 - m_InputAction: - m_Name: Translate Manipulation - m_Type: 0 - m_ExpectedControlType: Vector2 - m_Id: a93e6c6a-e2b8-4809-ad36-1ed6995957ee - m_Processors: - m_Interactions: - m_SingletonActionBindings: [] - m_Flags: 0 - m_InputActionReference: {fileID: 0} - m_ObjectReferenceObject: {fileID: 0} - m_ManualValue: {x: 0, y: 0} - m_RotateManipulationInput: - m_InputSourceMode: 2 - m_InputAction: - m_Name: Rotate Manipulation - m_Type: 0 - m_ExpectedControlType: Vector2 - m_Id: 8053c0d7-17d8-4ec6-acb0-e24bb3a4f6fc - m_Processors: - m_Interactions: - m_SingletonActionBindings: [] - m_Flags: 0 - m_InputActionReference: {fileID: 0} - m_ObjectReferenceObject: {fileID: 0} - m_ManualValue: {x: 0, y: 0} - m_DirectionalManipulationInput: - m_InputSourceMode: 2 - m_InputAction: - m_Name: Directional Manipulation - m_Type: 0 - m_ExpectedControlType: Vector2 - m_Id: 42fef18f-8012-4366-ab89-a49da023aecb - m_Processors: - m_Interactions: - m_SingletonActionBindings: [] - m_Flags: 0 - m_InputActionReference: {fileID: 0} + m_InputActionReference: {fileID: -711930659198068045, guid: 2924cdc729619de4a8f9d4046047a886, type: 3} m_ObjectReferenceObject: {fileID: 0} m_ManualValue: {x: 0, y: 0} - m_ScaleToggleInput: - m_InputSourceMode: 2 - m_InputActionPerformed: - m_Name: Scale Toggle - m_Type: 1 - m_ExpectedControlType: - m_Id: 5d9dcd36-d3e3-498b-8727-4d94092d47a8 - m_Processors: - m_Interactions: - m_SingletonActionBindings: [] - m_Flags: 0 - m_InputActionValue: - m_Name: Scale Toggle Value - m_Type: 0 - m_ExpectedControlType: Axis - m_Id: e70181b8-3068-4a01-a830-152a23f7c27f - 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_ScaleOverTimeInput: +--- !u!114 &1382507949571466866 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7605250946350940930} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 792f6c7eaa1a4b82abf8351559ac97eb, type: 3} + m_Name: + m_EditorClassIdentifier: + m_TransformToFollow: {fileID: 5451842862611423810} + m_MotionStabilizationMode: 1 + m_PositionStabilization: 0.25 + m_AngleStabilization: 20 + m_SmoothOffset: 0 + m_SmoothingSpeed: 10 + m_UseDistanceBasedVelocityScaling: 1 + m_UseMomentum: 1 + m_MomentumDecayScale: 1.25 + m_MomentumDecayScaleFromInput: 5.5 + m_ZVelocityRampThreshold: 0.3 + m_PullVelocityBias: 1 + m_PushVelocityBias: 1.25 + m_MinAdditionalVelocityScalar: 0.05 + m_MaxAdditionalVelocityScalar: 1.5 + m_UseManipulationInput: 0 + m_ManipulationInput: m_InputSourceMode: 2 m_InputAction: - m_Name: Scale Over Time + m_Name: Manipulation m_Type: 0 m_ExpectedControlType: Vector2 - m_Id: c17d131b-924f-465c-8d68-1e0382a3e18e + m_Id: 9914e1e2-77ba-43ae-8266-fd33d44c8a24 m_Processors: m_Interactions: m_SingletonActionBindings: [] m_Flags: 0 - m_InputActionReference: {fileID: 0} + m_InputActionReference: {fileID: 7489563345203072732, guid: 2924cdc729619de4a8f9d4046047a886, type: 3} m_ObjectReferenceObject: {fileID: 0} m_ManualValue: {x: 0, y: 0} - m_ScaleDistanceDeltaInput: - m_InputSourceMode: 0 - m_InputAction: - m_Name: Scale Distance Delta - m_Type: 0 - m_ExpectedControlType: Axis - m_Id: 5a7511f7-3e7a-4817-8f6b-7c6d55926fa3 - m_Processors: - m_Interactions: - m_SingletonActionBindings: [] - m_Flags: 0 - m_InputActionReference: {fileID: 0} - m_ObjectReferenceObject: {fileID: 0} - m_ManualValue: 0 ---- !u!114 &3310644866045247143 + m_ManipulationXAxisMode: 1 + m_ManipulationYAxisMode: 2 + m_CombineManipulationAxes: 0 + m_ManipulationTranslateSpeed: 1 + m_ManipulationRotateSpeed: 180 + m_ManipulationRotateReferenceFrame: {fileID: 0} + m_EnableDebugLines: 0 +--- !u!114 &4320139648255297471 MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6676953773607633624} + m_GameObject: {fileID: 7605250946350940930} m_Enabled: 1 m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: e988983f96fe1dd48800bcdfc82f23e9, type: 3} + m_Script: {fileID: 11500000, guid: 48139a683d3b4ac3a37cd5d24f71acf1, type: 3} m_Name: - m_EditorClassIdentifier: Unity.XR.Interaction.Toolkit::UnityEngine.XR.Interaction.Toolkit.Interactors.Visuals.XRInteractorLineVisual - m_LineWidth: 0.005 - m_OverrideInteractorLineLength: 1 - m_LineLength: 10 - m_AutoAdjustLineLength: 0 - m_MinLineLength: 0.5 - m_UseDistanceToHitAsMaxLineLength: 1 - m_LineRetractionDelay: 0.5 - m_LineLengthChangeSpeed: 12 - m_WidthCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - - serializedVersion: 3 - time: 1 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0 - outWeight: 0 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - m_SetLineColorGradient: 1 - m_ValidColorGradient: - serializedVersion: 2 - key0: {r: 1, g: 1, b: 1, a: 1} - key1: {r: 1, g: 1, b: 1, a: 0.3} - key2: {r: 0, g: 0, b: 0, a: 0} - key3: {r: 0, g: 0, b: 0, a: 0} - key4: {r: 0, g: 0, b: 0, a: 0} - key5: {r: 0, g: 0, b: 0, a: 0} - key6: {r: 0, g: 0, b: 0, a: 0} - key7: {r: 0, g: 0, b: 0, a: 0} - ctime0: 0 - ctime1: 65535 - ctime2: 0 - ctime3: 0 - ctime4: 0 - ctime5: 0 - ctime6: 0 - ctime7: 0 - atime0: 0 - atime1: 65535 - atime2: 0 - atime3: 0 - atime4: 0 - atime5: 0 - atime6: 0 - atime7: 0 - m_Mode: 0 - m_ColorSpace: -1 - m_NumColorKeys: 2 - m_NumAlphaKeys: 2 - m_InvalidColorGradient: + m_EditorClassIdentifier: + m_CastOrigin: {fileID: 5451842862611423810} + m_EnableStabilization: 0 + m_PositionStabilization: 0.25 + m_AngleStabilization: 20 + m_AimTargetObject: {fileID: 0} + m_PhysicsLayerMask: serializedVersion: 2 - key0: {r: 1, g: 1, b: 1, a: 0} - key1: {r: 1, g: 1, b: 1, a: 0} - key2: {r: 0, g: 0, b: 0, a: 0} - key3: {r: 0, g: 0, b: 0, a: 0} - key4: {r: 0, g: 0, b: 0, a: 0} - key5: {r: 0, g: 0, b: 0, a: 0} - key6: {r: 0, g: 0, b: 0, a: 0} - key7: {r: 0, g: 0, b: 0, a: 0} - ctime0: 0 - ctime1: 65535 - ctime2: 0 - ctime3: 0 - ctime4: 0 - ctime5: 0 - ctime6: 0 - ctime7: 0 - atime0: 0 - atime1: 65535 - atime2: 0 - atime3: 0 - atime4: 0 - atime5: 0 - atime6: 0 - atime7: 0 - m_Mode: 0 - m_ColorSpace: -1 - m_NumColorKeys: 2 - m_NumAlphaKeys: 2 - m_BlockedColorGradient: + m_Bits: 1051840 + m_PhysicsTriggerInteraction: 1 + m_CastRadius: 0.1 +--- !u!114 &1489026597932994268 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7605250946350940930} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: ef20135915079454985abea5a2ec8967, type: 3} + m_Name: + m_EditorClassIdentifier: + m_CastOrigin: {fileID: 5451842862611423810} + m_EnableStabilization: 1 + m_PositionStabilization: 0.25 + m_AngleStabilization: 20 + m_AimTargetObject: {fileID: 9092921936286841604} + m_RaycastMask: serializedVersion: 2 - key0: {r: 1, g: 1, b: 1, a: 0} - key1: {r: 1, g: 1, b: 1, a: 0} - key2: {r: 0, g: 0, b: 0, a: 0} - key3: {r: 0, g: 0, b: 0, a: 0} - key4: {r: 0, g: 0, b: 0, a: 0} - key5: {r: 0, g: 0, b: 0, a: 0} - key6: {r: 0, g: 0, b: 0, a: 0} - key7: {r: 0, g: 0, b: 0, a: 0} - ctime0: 0 - ctime1: 65535 - ctime2: 0 - ctime3: 0 - ctime4: 0 - ctime5: 0 - ctime6: 0 - ctime7: 0 - atime0: 0 - atime1: 65535 - atime2: 0 - atime3: 0 - atime4: 0 - atime5: 0 - atime6: 0 - atime7: 0 - m_Mode: 0 - m_ColorSpace: -1 - m_NumColorKeys: 2 - m_NumAlphaKeys: 2 - m_TreatSelectionAsValidState: 0 - m_SmoothMovement: 0 - m_FollowTightness: 10 - m_SnapThresholdDistance: 10 - m_Reticle: {fileID: 0} - m_BlockedReticle: {fileID: 0} - m_StopLineAtFirstRaycastHit: 1 - m_StopLineAtSelection: 0 - m_SnapEndpointIfAvailable: 1 - m_LineBendRatio: 0.5 - m_BendingEnabledInteractionLayers: - m_Bits: 4294967295 - m_OverrideInteractorLineOrigin: 1 - m_LineOriginTransform: {fileID: 0} - m_LineOriginOffset: 0 ---- !u!1 &6995813130144571658 -GameObject: + m_Bits: 1051873 + m_RaycastTriggerInteraction: 1 + m_RaycastSnapVolumeInteraction: 1 + m_RaycastUIDocumentTriggerInteraction: 1 + m_TargetNumCurveSegments: 1 + m_HitDetectionType: 2 + m_CastDistance: 30 + m_SphereCastRadius: 0.1 + m_ConeCastAngle: 6 + m_LiveConeCastDebugVisuals: 0 +--- !u!114 &3191210277239289247 +MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 7905090655299301591} - m_Layer: 8 - m_Name: Camera Offset - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!4 &7905090655299301591 -Transform: + m_GameObject: {fileID: 7605250946350940930} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 06d37e5228fbbc744a06dbbcbfa399a9, type: 3} + m_Name: + m_EditorClassIdentifier: Gothic.VR::Gothic.VR.Interaction.Backends.Xri.XriLineOfSightFilter + _blockingLayers: + serializedVersion: 2 + m_Bits: 1051713 + _maxDistance: 10 + _minCheckDistance: 0.15 + _surfaceTolerance: 0.02 +--- !u!114 &2750591488407108373 +MonoBehaviour: m_ObjectHideFlags: 0 m_CorrespondingSourceObject: {fileID: 0} m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6995813130144571658} - 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: - - {fileID: 3795310480892305868} - - {fileID: 2704301485295035116} - - {fileID: 4055452250844519603} - m_Father: {fileID: 1361426706454156200} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_GameObject: {fileID: 7605250946350940930} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dfa36fd411a0e614a83609318964c858, type: 3} + m_Name: + m_EditorClassIdentifier: Gothic.VR::Gothic.VR.Interaction.Backends.Xri.XriGrabberBridge + _nearGrabMargin: 0.05 --- !u!1 &7701317328730321625 GameObject: m_ObjectHideFlags: 0 @@ -2113,7 +2172,7 @@ Transform: m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: - - {fileID: 6347680414218280407} + - {fileID: 5451842862611423810} m_Father: {fileID: 7905090655299301591} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!114 &3829692317711544481 @@ -2185,6 +2244,397 @@ MonoBehaviour: m_Interactions: m_SingletonActionBindings: [] m_Flags: 0 +--- !u!1 &7854938562963395461 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6160204099483398844} + - component: {fileID: 8802700396031472356} + - component: {fileID: 2837570909488418039} + - component: {fileID: 8383563443979425973} + m_Layer: 8 + m_Name: LineVisual + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &6160204099483398844 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7854938562963395461} + 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: 6788907536904435118} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &8802700396031472356 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7854938562963395461} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 80e353695beb436ab39a90d9ecefaee6, type: 3} + m_Name: + m_EditorClassIdentifier: + m_LineRenderer: {fileID: 2837570909488418039} + m_CurveVisualObject: {fileID: 1096273261276596531} + m_OverrideLineOrigin: 1 + m_LineOriginTransform: {fileID: 6788907536904435118} + m_VisualPointCount: 20 + m_MaxVisualCurveDistance: 30 + m_RestingVisualLineLength: 0.25 + m_LineDynamicsMode: 1 + m_RetractDelay: 1 + m_RetractDuration: 1 + m_ExtendLineToEmptyHit: 0 + m_ExtensionRate: 10 + m_EndPointExpansionRate: 10 + m_ComputeMidPointWithComplexCurves: 0 + m_SnapToSelectedAttachIfAvailable: 1 + m_SnapToSnapVolumeIfAvailable: 1 + m_CurveStartOffset: 0.015 + m_CurveEndOffset: 0.005 + m_CustomizeLinePropertiesForState: 1 + m_LinePropertyAnimationSpeed: 8 + m_NoValidHitProperties: + m_SmoothlyCurveLine: 1 + m_LineBendRatio: 0.25 + m_AdjustWidth: 1 + m_StartWidth: 0.003 + m_EndWidth: 0.003 + m_EndWidthScaleDistanceFactor: 2 + m_AdjustGradient: 1 + m_Gradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 0} + key1: {r: 1, g: 1, b: 1, a: 0.5019608} + key2: {r: 0, g: 0, b: 0, a: 0.2509804} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 193 + atime1: 8192 + atime2: 32768 + atime3: 55705 + atime4: 65342 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 4 + m_CustomizeExpandLineDrawPercent: 1 + m_ExpandModeLineDrawPercent: 0.9 + m_UIHitProperties: + m_SmoothlyCurveLine: 1 + m_LineBendRatio: 0.5 + m_AdjustWidth: 1 + m_StartWidth: 0.004 + m_EndWidth: 0.004 + m_EndWidthScaleDistanceFactor: 2 + m_AdjustGradient: 1 + m_Gradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 0} + key1: {r: 1, g: 0.78431374, b: 0.5686275, a: 0.49019608} + key2: {r: 1, g: 1, b: 1, a: 1} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 16384 + ctime2: 65535 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 8192 + atime2: 32768 + atime3: 65535 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 3 + m_NumAlphaKeys: 4 + m_CustomizeExpandLineDrawPercent: 1 + m_ExpandModeLineDrawPercent: 0.9 + m_UIPressHitProperties: + m_SmoothlyCurveLine: 1 + m_LineBendRatio: 0.5 + m_AdjustWidth: 1 + m_StartWidth: 0.003 + m_EndWidth: 0.003 + m_EndWidthScaleDistanceFactor: 2 + m_AdjustGradient: 1 + m_Gradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 0} + key1: {r: 0.5686275, g: 0.78431374, b: 1, a: 0.627451} + key2: {r: 1, g: 1, b: 1, a: 1} + key3: {r: 1, g: 1, b: 1, a: 0.78431374} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 32768 + ctime2: 65535 + ctime3: 65535 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 8192 + atime2: 26214 + atime3: 42598 + atime4: 65535 + atime5: 65535 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 3 + m_NumAlphaKeys: 5 + m_CustomizeExpandLineDrawPercent: 1 + m_ExpandModeLineDrawPercent: 0.9 + m_SelectHitProperties: + m_SmoothlyCurveLine: 1 + m_LineBendRatio: 0.5 + m_AdjustWidth: 1 + m_StartWidth: 0.003 + m_EndWidth: 0.003 + m_EndWidthScaleDistanceFactor: 2 + m_AdjustGradient: 1 + m_Gradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 0} + key1: {r: 0.5686275, g: 0.78431374, b: 1, a: 0.627451} + key2: {r: 1, g: 1, b: 1, a: 1} + key3: {r: 1, g: 1, b: 1, a: 0.78431374} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 32768 + ctime2: 65535 + ctime3: 65535 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 8192 + atime2: 26214 + atime3: 42598 + atime4: 65535 + atime5: 65535 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 3 + m_NumAlphaKeys: 5 + m_CustomizeExpandLineDrawPercent: 1 + m_ExpandModeLineDrawPercent: 0.75 + m_HoverHitProperties: + m_SmoothlyCurveLine: 1 + m_LineBendRatio: 0.25 + m_AdjustWidth: 1 + m_StartWidth: 0.004 + m_EndWidth: 0.004 + m_EndWidthScaleDistanceFactor: 2 + m_AdjustGradient: 1 + m_Gradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 0} + key1: {r: 1, g: 0.78431374, b: 0.5686275, a: 0.49019608} + key2: {r: 1, g: 1, b: 1, a: 1} + key3: {r: 1, g: 1, b: 1, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 16384 + ctime2: 65535 + ctime3: 65535 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 13878 + atime2: 32768 + atime3: 65535 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 3 + m_NumAlphaKeys: 4 + m_CustomizeExpandLineDrawPercent: 1 + m_ExpandModeLineDrawPercent: 0.9 + m_RenderLineInWorldSpace: 1 + m_SwapMaterials: 0 + m_BaseLineMaterial: {fileID: 0} + m_EmptyHitMaterial: {fileID: 0} +--- !u!120 &2837570909488418039 +LineRenderer: + serializedVersion: 3 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7854938562963395461} + m_Enabled: 0 + m_CastShadows: 0 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 0 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 0 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10306, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_MaskInteraction: 0 + m_Positions: [] + m_Parameters: + serializedVersion: 3 + widthMultiplier: 1 + widthCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0.012002945 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + colorGradient: + serializedVersion: 2 + key0: {r: 1, g: 1, b: 1, a: 1} + key1: {r: 1, g: 1, b: 1, a: 1} + key2: {r: 0, g: 0, b: 0, a: 0} + key3: {r: 0, g: 0, b: 0, a: 0} + key4: {r: 0, g: 0, b: 0, a: 0} + key5: {r: 0, g: 0, b: 0, a: 0} + key6: {r: 0, g: 0, b: 0, a: 0} + key7: {r: 0, g: 0, b: 0, a: 0} + ctime0: 0 + ctime1: 65535 + ctime2: 0 + ctime3: 0 + ctime4: 0 + ctime5: 0 + ctime6: 0 + ctime7: 0 + atime0: 0 + atime1: 65535 + atime2: 0 + atime3: 0 + atime4: 0 + atime5: 0 + atime6: 0 + atime7: 0 + m_Mode: 0 + m_ColorSpace: -1 + m_NumColorKeys: 2 + m_NumAlphaKeys: 2 + numCornerVertices: 8 + numCapVertices: 8 + alignment: 0 + textureMode: 0 + textureScale: {x: 1, y: 1} + shadowBias: 0.5 + generateLightingData: 0 + m_UseWorldSpace: 1 + m_Loop: 0 + m_ApplyActiveColorSpace: 0 +--- !u!210 &8383563443979425973 +SortingGroup: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7854938562963395461} + m_Enabled: 1 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 30005 + m_SortAtRoot: 0 + m_Sort3DAs2D: 0 --- !u!1 &8467730262558146822 GameObject: m_ObjectHideFlags: 0 @@ -2534,6 +2984,8 @@ MonoBehaviour: _camera: {fileID: 7212599541473323004} _leftController: {fileID: 2704301485295035116} _rightController: {fileID: 4055452250844519603} + _leftGrabber: {fileID: 3337253397848854983} + _rightGrabber: {fileID: 2750591488407108373} _screenFade: {fileID: 7497269210671564284} _moveProvider: {fileID: 8165985969289754186} _snapTurnProvider: {fileID: 242655525520869064} diff --git a/Assets/Gothic-VR/Resources/VR/Prefabs/Vobs/oCItem.prefab b/Assets/Gothic-VR/Resources/VR/Prefabs/Vobs/oCItem.prefab index ccbf13ffa..112ced04b 100644 --- a/Assets/Gothic-VR/Resources/VR/Prefabs/Vobs/oCItem.prefab +++ b/Assets/Gothic-VR/Resources/VR/Prefabs/Vobs/oCItem.prefab @@ -18,6 +18,8 @@ GameObject: - component: {fileID: 2018021949967966991} - component: {fileID: 5746501746354695612} - component: {fileID: 6145980801324581266} + - component: {fileID: 5604778400711577802} + - component: {fileID: 1949468816389965935} m_Layer: 6 m_Name: oCItem m_TagString: GothicVob @@ -287,6 +289,149 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 594f5e7857d0629419c1bef807639a86, type: 3} m_Name: m_EditorClassIdentifier: Gothic.VR::Gothic.VR.Interaction.Backends.Hvr.HvrInteractableBridge +--- !u!114 &5604778400711577802 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6503575194566409312} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 6087a45bbe7ac8f469bf5110b3d64b49, type: 3} + m_Name: + m_EditorClassIdentifier: Gothic.VR::Gothic.VR.Interaction.Backends.Xri.GothicGrabInteractable + m_InteractionManager: {fileID: 0} + m_Colliders: [] + m_InteractionLayers: + m_Bits: 1 + m_DistanceCalculationMode: 1 + m_SelectMode: 1 + m_FocusMode: 1 + m_CustomReticle: {fileID: 0} + m_AllowGazeInteraction: 0 + m_AllowGazeSelect: 0 + m_OverrideGazeTimeToSelect: 0 + m_GazeTimeToSelect: 0.5 + m_OverrideTimeToAutoDeselectGaze: 0 + m_TimeToAutoDeselectGaze: 3 + m_AllowGazeAssistance: 0 + m_FirstHoverEntered: + m_PersistentCalls: + m_Calls: [] + m_LastHoverExited: + m_PersistentCalls: + m_Calls: [] + m_HoverEntered: + m_PersistentCalls: + m_Calls: [] + m_HoverExited: + m_PersistentCalls: + m_Calls: [] + m_FirstSelectEntered: + m_PersistentCalls: + m_Calls: [] + m_LastSelectExited: + m_PersistentCalls: + m_Calls: [] + m_SelectEntered: + m_PersistentCalls: + m_Calls: [] + m_SelectExited: + m_PersistentCalls: + m_Calls: [] + m_FirstFocusEntered: + m_PersistentCalls: + m_Calls: [] + m_LastFocusExited: + m_PersistentCalls: + m_Calls: [] + m_FocusEntered: + m_PersistentCalls: + m_Calls: [] + m_FocusExited: + m_PersistentCalls: + m_Calls: [] + m_Activated: + m_PersistentCalls: + m_Calls: [] + m_Deactivated: + m_PersistentCalls: + m_Calls: [] + m_StartingHoverFilters: [] + m_StartingSelectFilters: [] + m_StartingInteractionStrengthFilters: [] + m_AutoFindParentInteractableInHierarchy: 0 + m_ParentInteractableObject: {fileID: 0} + m_AttachTransform: {fileID: 0} + m_SecondaryAttachTransform: {fileID: 0} + m_UseDynamicAttach: 1 + m_MatchAttachPosition: 1 + m_MatchAttachRotation: 1 + m_SnapToColliderVolume: 1 + m_ReinitializeDynamicAttachEverySingleGrab: 1 + m_AttachEaseInTime: 0.15 + m_MovementType: 0 + m_PredictedVisualsTransform: {fileID: 0} + m_VelocityDamping: 1 + m_VelocityScale: 1 + m_AngularVelocityDamping: 1 + m_AngularVelocityScale: 1 + m_TrackPosition: 1 + m_SmoothPosition: 0 + m_SmoothPositionAmount: 8 + m_TightenPosition: 0.1 + m_TrackRotation: 1 + m_SmoothRotation: 0 + m_SmoothRotationAmount: 8 + m_TightenRotation: 0.1 + m_TrackScale: 1 + m_SmoothScale: 0 + m_SmoothScaleAmount: 8 + m_TightenScale: 0.1 + m_ThrowOnDetach: 1 + m_ThrowSmoothingDuration: 0.25 + m_ThrowSmoothingCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 1 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0 + outWeight: 0 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + m_ThrowVelocityScale: 1.5 + m_ThrowAngularVelocityScale: 1 + m_ForceGravityOnDetach: 0 + m_UnparentTransformOnGrab: 0 + m_RetainTransformParent: 1 + m_StartingSingleGrabTransformers: [] + m_StartingMultipleGrabTransformers: [] + m_AddDefaultGrabTransformers: 1 + m_FarAttachMode: 0 + m_LimitLinearVelocity: 0 + m_LimitAngularVelocity: 0 + m_MaxLinearVelocityDelta: 10 + m_MaxAngularVelocityDelta: 20 + _heldInterpolation: 1 +--- !u!114 &1949468816389965935 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6503575194566409312} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d53defac19fbb474d81910e60e275fd7, type: 3} + m_Name: + m_EditorClassIdentifier: Gothic.VR::Gothic.VR.Interaction.Backends.Xri.XriInteractableBridge --- !u!1001 &2283517946604736509 PrefabInstance: m_ObjectHideFlags: 0 diff --git a/Assets/Gothic-VR/Scripts/Interaction/Backends/Hvr/HvrInteractableBridge.cs b/Assets/Gothic-VR/Scripts/Interaction/Backends/Hvr/HvrInteractableBridge.cs index bf6e3f25b..a0f55c62d 100644 --- a/Assets/Gothic-VR/Scripts/Interaction/Backends/Hvr/HvrInteractableBridge.cs +++ b/Assets/Gothic-VR/Scripts/Interaction/Backends/Hvr/HvrInteractableBridge.cs @@ -5,6 +5,7 @@ using HurricaneVR.Framework.Core; using HurricaneVR.Framework.Core.Grabbers; using HurricaneVR.Framework.Core.Sockets; +using Reflex.Attributes; using UnityEngine; namespace Gothic.VR.Interaction.Backends.Hvr @@ -12,9 +13,12 @@ namespace Gothic.VR.Interaction.Backends.Hvr /// /// Sits next to an HVRGrabbable and its VrInteractable. Forwards HVR's grabbable events synchronously to the /// VrInteractable and executes its commands on the HVRGrabbable. + /// Inactive (no subscriptions) if another backend runs; prefabs carry the bridges of all backends. /// public class HvrInteractableBridge : MonoBehaviour, IVrInteractableBackend { + [Inject] private readonly IVrBackend _vrBackend; + private HVRGrabbable _grabbable; private VrInteractable _interactable; private bool _isSubscribed; @@ -29,13 +33,18 @@ private HVRGrabbable Grabbable } } + /// + /// Without injection (e.g. objects outside a scene scope), HVR is assumed as before the XRI backend existed. + /// + public bool IsActive => _vrBackend == null || _vrBackend is HvrBackend; + public bool IsHeld => Grabbable.IsBeingHeld; public IReadOnlyList Colliders => Grabbable.Colliders; private void Awake() { _interactable = GetComponent(); - if (Grabbable == null || _interactable == null) + if (!IsActive || Grabbable == null || _interactable == null) return; Grabbable.HoverEnter.AddListener(OnHoverEnter); diff --git a/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/GothicGrabInteractable.cs b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/GothicGrabInteractable.cs new file mode 100644 index 000000000..d0d30d6c2 --- /dev/null +++ b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/GothicGrabInteractable.cs @@ -0,0 +1,62 @@ +using UnityEngine; +using UnityEngine.XR.Interaction.Toolkit; +using UnityEngine.XR.Interaction.Toolkit.Interactables; + +namespace Gothic.VR.Interaction.Backends.Xri +{ + /// + /// XRGrabInteractable for Gothic items. Adds what XRI lacks compared to HVR: + /// - BeforeGrabbed: raised (via XriInteractableBridge) before XRI captures the Rigidbody state. Gothic items lie + /// kinematic, the game turns physics on there, so that VelocityTracking moves them and they fall when dropped. + /// - Interpolation while held, against jitter of velocity tracked items while walking. + /// + /// Disabled in the prefab. XriInteractableBridge enables it on the XRI backend once the runtime colliders exist. + /// + public class GothicGrabInteractable : XRGrabInteractable + { + [Tooltip("Rigidbody interpolation while held. Restored on drop.")] + [SerializeField] private RigidbodyInterpolation _heldInterpolation = RigidbodyInterpolation.Interpolate; + + private XriInteractableBridge _bridge; + private RigidbodyInterpolation _interpolationBeforeGrab; + private bool _isInterpolationOverridden; + + protected override void Awake() + { + base.Awake(); + _bridge = GetComponent(); + } + + protected override void OnSelectEntering(SelectEnterEventArgs args) + { + // Before base: XRGrabInteractable.Grab() stores isKinematic, which it restores on drop. + if (_bridge != null) + _bridge.OnSelectEntering(args); + + base.OnSelectEntering(args); + } + + protected override void SetupRigidbodyGrab(Rigidbody rigidbody) + { + // XRI calls it again when the movement type changes while held. + if (!_isInterpolationOverridden) + { + _interpolationBeforeGrab = rigidbody.interpolation; + _isInterpolationOverridden = true; + } + + base.SetupRigidbodyGrab(rigidbody); + rigidbody.interpolation = _heldInterpolation; + } + + protected override void SetupRigidbodyDrop(Rigidbody rigidbody) + { + base.SetupRigidbodyDrop(rigidbody); + if (!_isInterpolationOverridden) + return; + + rigidbody.interpolation = _interpolationBeforeGrab; + _isInterpolationOverridden = false; + } + } +} diff --git a/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/GothicGrabInteractable.cs.meta b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/GothicGrabInteractable.cs.meta new file mode 100644 index 000000000..7018b9acc --- /dev/null +++ b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/GothicGrabInteractable.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 6087a45bbe7ac8f469bf5110b3d64b49 \ No newline at end of file diff --git a/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriBackend.cs b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriBackend.cs index 9513c8b69..a68b61c92 100644 --- a/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriBackend.cs +++ b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriBackend.cs @@ -7,9 +7,10 @@ namespace Gothic.VR.Interaction.Backends.Xri { /// /// XR Interaction Toolkit backend. Always compiled, as XRI is a free package. - /// Implemented: input, haptics, SFX, UI laser pointers and the player rig (XriRig on "VR - Player XRI.prefab", - /// with ScreenFade/WallFade on its camera). - /// Missing: the simulator (HVR phase 1d) and grabbing (phase 2). + /// Implemented: input, haptics, SFX, UI laser pointers, the player rig (XriRig on "VR - Player XRI.prefab", + /// with ScreenFade/WallFade on its camera), the XR Interaction Simulator and item grabbing (Near-Far interactor + /// per hand, GothicGrabInteractable + XriInteractableBridge on oCItem). + /// Missing: grabbing mobs/NPCs (phase 2b), sockets (3), doors/chests/ladders (4) and hands (5). /// public class XriBackend : IVrBackend { @@ -18,8 +19,8 @@ public class XriBackend : IVrBackend public void InstallBindings(ContainerBuilder containerBuilder) { 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); + "screen fades, the XR Interaction Simulator and item grabbing work. Mobs/NPCs (phase " + + "2b), 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/XriGrabberBridge.cs b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriGrabberBridge.cs new file mode 100644 index 000000000..051eea660 --- /dev/null +++ b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriGrabberBridge.cs @@ -0,0 +1,150 @@ +using System; +using Gothic.VR.Interaction.Components; +using Gothic.VR.Interaction.Models; +using Gothic.VR.Interaction.Ports; +using UnityEngine; +using UnityEngine.XR.Interaction.Toolkit; +using UnityEngine.XR.Interaction.Toolkit.Interactables; +using UnityEngine.XR.Interaction.Toolkit.Interactors; +using UnityEngine.XR.Interaction.Toolkit.Interactors.Casters; +using UnityEngine.XR.Interaction.Toolkit.Utilities; + +namespace Gothic.VR.Interaction.Backends.Xri +{ + /// + /// Sits next to the NearFarInteractor of one hand and forwards its events synchronously as IVrGrabber events. + /// One interactor does direct and distance grabs, so Kind is always Hand. The VrGrabArgs of each event say + /// whether the current object was grabbed directly (Hand) or pulled from a distance (Distance). + /// BeforeGrabbed is raised by GothicGrabInteractable (XRI has no such interactor event). + /// + [RequireComponent(typeof(NearFarInteractor))] + public class XriGrabberBridge : MonoBehaviour, IVrGrabber + { + [Tooltip("Added to the near caster's radius: a target this close to the hand at selection is a Hand grab, " + + "everything further away a Distance grab.")] + [SerializeField] private float _nearGrabMargin = 0.05f; + + public event Action BeforeGrabbed; + public event Action Grabbed; + public event Action Released; + + private NearFarInteractor _interactor; + private VrGrabberKind _heldKind = VrGrabberKind.Hand; + private bool _isSubscribed; + + public NearFarInteractor Interactor + { + get + { + if (_interactor == null) + _interactor = GetComponent(); + return _interactor; + } + } + + public VrGrabberKind Kind => VrGrabberKind.Hand; + + public VrHandSide HandSide => Interactor.handedness == InteractorHandedness.Left + ? VrHandSide.Left + : VrHandSide.Right; + + public VrInteractable Held => Interactor.hasSelection + ? GetInteractable(Interactor.firstInteractableSelected) + : null; + + private void Awake() + { + Interactor.selectEntered.AddListener(OnSelectEntered); + Interactor.selectExited.AddListener(OnSelectExited); + _isSubscribed = true; + } + + private void OnDestroy() + { + if (!_isSubscribed || _interactor == null) + return; + + _interactor.selectEntered.RemoveListener(OnSelectEntered); + _interactor.selectExited.RemoveListener(OnSelectExited); + } + + public void ForceRelease() + { + if (Interactor.hasSelection && Interactor.interactionManager != null) + Interactor.interactionManager.CancelInteractorSelection((IXRSelectInteractor)Interactor); + } + + /// + /// Args of a selection that starts now. Remembers the kind (Hand or Distance) until the release. + /// + internal VrGrabArgs CreateSelectArgs(VrInteractable interactable, IXRInteractable xrInteractable) + { + _heldKind = ResolveKind(xrInteractable); + return CreateArgs(interactable, _heldKind); + } + + internal VrGrabArgs CreateHoverArgs(VrInteractable interactable, IXRInteractable xrInteractable) + { + return CreateArgs(interactable, ResolveKind(xrInteractable)); + } + + internal VrGrabArgs CreateHeldArgs(VrInteractable interactable) + { + return CreateArgs(interactable, _heldKind); + } + + internal void RaiseBeforeGrabbed(VrGrabArgs args) + { + BeforeGrabbed?.Invoke(args); + } + + private VrGrabArgs CreateArgs(VrInteractable interactable, VrGrabberKind kind) + { + return new VrGrabArgs(kind, HandSide, interactable, gameObject); + } + + /// + /// Near-Far's selectionRegion can't tell us: with InteractorFarAttachMode.Near, a far grab has no attach + /// offset and reports Near as well. Therefore, the distance between hand and target decides. + /// + private VrGrabberKind ResolveKind(IXRInteractable xrInteractable) + { + if (xrInteractable == null || !Interactor.enableNearCasting) + return VrGrabberKind.Distance; + + var nearRadius = Interactor.nearInteractionCaster is SphereInteractionCaster sphereCaster + ? sphereCaster.castRadius + : 0.1f; + var caster = Interactor.nearInteractionCaster; + var origin = caster != null && caster.effectiveCastOrigin != null + ? caster.effectiveCastOrigin + : Interactor.transform; + var maxDistance = nearRadius + _nearGrabMargin; + + if (!XRInteractableUtility.TryGetClosestPointOnCollider(xrInteractable, origin.position, + out var distanceInfo)) + return VrGrabberKind.Distance; + + return distanceInfo.distanceSqr <= maxDistance * maxDistance ? VrGrabberKind.Hand : VrGrabberKind.Distance; + } + + private void OnSelectEntered(SelectEnterEventArgs args) + { + var interactable = GetInteractable(args.interactableObject); + if (interactable != null) + Grabbed?.Invoke(CreateHeldArgs(interactable)); + } + + private void OnSelectExited(SelectExitEventArgs args) + { + var interactable = GetInteractable(args.interactableObject); + if (interactable != null) + Released?.Invoke(CreateHeldArgs(interactable)); + } + + private static VrInteractable GetInteractable(IXRInteractable xrInteractable) + { + return xrInteractable is Component component ? component.GetComponent() : null; + } + } +} diff --git a/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriGrabberBridge.cs.meta b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriGrabberBridge.cs.meta new file mode 100644 index 000000000..cbaf6c988 --- /dev/null +++ b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriGrabberBridge.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: dfa36fd411a0e614a83609318964c858 \ No newline at end of file diff --git a/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriInteractableBridge.cs b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriInteractableBridge.cs new file mode 100644 index 000000000..4a991a996 --- /dev/null +++ b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriInteractableBridge.cs @@ -0,0 +1,207 @@ +using System.Collections.Generic; +using Gothic.Core.Logging; +using Gothic.VR.Interaction.Components; +using Gothic.VR.Interaction.Models; +using Gothic.VR.Interaction.Ports; +using Reflex.Attributes; +using UnityEngine; +using UnityEngine.XR.Interaction.Toolkit; +using UnityEngine.XR.Interaction.Toolkit.Interactables; +using UnityEngine.XR.Interaction.Toolkit.Interactors; +using Logger = Gothic.Core.Logging.Logger; + +namespace Gothic.VR.Interaction.Backends.Xri +{ + /// + /// Sits next to an XRI interactable (GothicGrabInteractable for items) and its VrInteractable. Forwards XRI's + /// hover/select events synchronously to the VrInteractable and executes its commands on the interactable. + /// + /// Prefabs carry the components of both backends. The XRI interactable is disabled in the prefab and only this + /// bridge enables it, if XRI is the active backend. Otherwise, it stays disabled and never looks for (or + /// creates) an XRInteractionManager. + /// + public class XriInteractableBridge : MonoBehaviour, IVrInteractableBackend + { + [Inject] private readonly IVrBackend _vrBackend; + + private readonly Dictionary _selectArgs = new(); + private readonly HashSet _handHovers = new(); + private readonly List _colliderBuffer = new(); + + private XRBaseInteractable _xrInteractable; + private VrInteractable _interactable; + private bool _isSubscribed; + + public bool IsActive => _vrBackend is XriBackend; + public bool IsHeld => _xrInteractable != null && _xrInteractable.isSelected; + + public IReadOnlyList Colliders => _xrInteractable != null + ? _xrInteractable.colliders + : System.Array.Empty(); + + private void Awake() + { + if (!IsActive) + return; + + _interactable = GetComponent(); + _xrInteractable = GetComponent(); + if (_interactable == null || _xrInteractable == null) + { + Logger.LogError($"[XRI] {name} needs a VrInteractable and an XR interactable next to " + + $"{nameof(XriInteractableBridge)}.", LogCat.VR); + return; + } + + _xrInteractable.hoverEntered.AddListener(OnHoverEntered); + _xrInteractable.hoverExited.AddListener(OnHoverExited); + _xrInteractable.selectEntered.AddListener(OnSelectEntered); + _xrInteractable.selectExited.AddListener(OnSelectExited); + _isSubscribed = true; + } + + private void Start() + { + if (!_isSubscribed) + return; + + // Gothic meshes and their colliders are created at runtime, after XRI collected the colliders in Awake. + CollectColliders(); + _xrInteractable.enabled = true; + } + + private void OnDestroy() + { + if (!_isSubscribed || _xrInteractable == null) + return; + + _xrInteractable.hoverEntered.RemoveListener(OnHoverEntered); + _xrInteractable.hoverExited.RemoveListener(OnHoverExited); + _xrInteractable.selectEntered.RemoveListener(OnSelectEntered); + _xrInteractable.selectExited.RemoveListener(OnSelectExited); + } + + public void ForceRelease() + { + if (IsHeld && _xrInteractable.interactionManager != null) + _xrInteractable.interactionManager.CancelInteractableSelection((IXRSelectInteractable)_xrInteractable); + } + + /// + /// Re-collects the colliders. The interaction manager maps colliders to interactables on registration only, + /// therefore an enabled interactable is registered again (not while it's held or hovered). + /// + public void SetupColliders() + { + if (!_isSubscribed) + return; + + CollectColliders(); + + if (!_xrInteractable.isActiveAndEnabled || _xrInteractable.isSelected || _xrInteractable.isHovered) + return; + + _xrInteractable.enabled = false; + _xrInteractable.enabled = true; + } + + public void SetSocketSounds(AudioClip socketed, AudioClip unsocketed) + { + // TODO HVR phase 3: XRI sockets. + } + + /// + /// Called by GothicGrabInteractable before XRI moves the interactable (BeforeGrabbed of HVR). + /// + internal void OnSelectEntering(SelectEnterEventArgs args) + { + if (!_isSubscribed) + return; + + var grabArgs = CreateSelectArgs(args.interactorObject); + _selectArgs[args.interactorObject] = grabArgs; + + if (args.interactorObject is Component component && component.TryGetComponent(out XriGrabberBridge grabber)) + grabber.RaiseBeforeGrabbed(grabArgs); + + _interactable.RaiseBeforeGrabbed(grabArgs); + } + + private void CollectColliders() + { + GetComponentsInChildren(_colliderBuffer); + _xrInteractable.colliders.Clear(); + foreach (var itemCollider in _colliderBuffer) + { + // Same as XRI: triggers are usually snap volumes and don't count. + if (!itemCollider.isTrigger) + _xrInteractable.colliders.Add(itemCollider); + } + + _colliderBuffer.Clear(); + + if (_xrInteractable.colliders.Count == 0) + Logger.LogWarning($"[XRI] {name} has no colliders. It can't be grabbed or hovered.", LogCat.VR); + } + + private VrGrabArgs CreateSelectArgs(IXRInteractor interactor) + { + if (interactor is Component component && component.TryGetComponent(out XriGrabberBridge grabber)) + return grabber.CreateSelectArgs(_interactable, _xrInteractable); + + return CreateOtherArgs(interactor); + } + + private VrGrabArgs CreateOtherArgs(IXRInteractor interactor) + { + var kind = interactor is XRSocketInteractor ? VrGrabberKind.Socket : VrGrabberKind.Other; + var grabberGo = interactor is Component component ? component.gameObject : null; + return new VrGrabArgs(kind, VrHandSide.Left, _interactable, grabberGo); + } + + /// + /// Only hands hover (focus label, highlight). With both hands on one object, HoverEntered is raised for the + /// first and HoverExited for the last hand, so that the label doesn't vanish while one hand still hovers. + /// Near-Far hovers only its closest target, so overlapping objects don't flicker. + /// + private void OnHoverEntered(HoverEnterEventArgs args) + { + if (args.interactorObject is not Component component || + !component.TryGetComponent(out XriGrabberBridge grabber)) + return; + + if (_handHovers.Add(args.interactorObject) && _handHovers.Count == 1) + _interactable.RaiseHoverEntered(grabber.CreateHoverArgs(_interactable, _xrInteractable)); + } + + private void OnHoverExited(HoverExitEventArgs args) + { + if (args.interactorObject is not Component component || + !component.TryGetComponent(out XriGrabberBridge grabber)) + return; + + if (_handHovers.Remove(args.interactorObject) && _handHovers.Count == 0) + _interactable.RaiseHoverExited(grabber.CreateHoverArgs(_interactable, _xrInteractable)); + } + + private void OnSelectEntered(SelectEnterEventArgs args) + { + if (!_selectArgs.TryGetValue(args.interactorObject, out var grabArgs)) + { + // Interactables without GothicGrabInteractable (e.g. XRSimpleInteractable) have no OnSelectEntering. + grabArgs = CreateSelectArgs(args.interactorObject); + _selectArgs[args.interactorObject] = grabArgs; + } + + _interactable.RaiseGrabbed(grabArgs); + } + + private void OnSelectExited(SelectExitEventArgs args) + { + if (!_selectArgs.Remove(args.interactorObject, out var grabArgs)) + grabArgs = CreateOtherArgs(args.interactorObject); + + _interactable.RaiseReleased(grabArgs); + } + } +} diff --git a/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriInteractableBridge.cs.meta b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriInteractableBridge.cs.meta new file mode 100644 index 000000000..f6f537cb2 --- /dev/null +++ b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriInteractableBridge.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: d53defac19fbb474d81910e60e275fd7 \ No newline at end of file diff --git a/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriLineOfSightFilter.cs b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriLineOfSightFilter.cs new file mode 100644 index 000000000..a094ef69c --- /dev/null +++ b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriLineOfSightFilter.cs @@ -0,0 +1,80 @@ +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.XR.Interaction.Toolkit.Filtering; +using UnityEngine.XR.Interaction.Toolkit.Interactables; +using UnityEngine.XR.Interaction.Toolkit.Interactors; +using UnityEngine.XR.Interaction.Toolkit.Utilities; + +namespace Gothic.VR.Interaction.Backends.Xri +{ + /// + /// Target filter of the Near-Far interactors: an object can only be hovered and grabbed if nothing is between + /// the hand and the object (no distance grab through fences, walls or chests). + /// A ray from the hand to the closest point of the target must not hit any collider other than the target's own. + /// Targets touching the hand are always allowed, targets beyond the max distance never (the far ray is longer, as + /// it also points at UI). + /// + public class XriLineOfSightFilter : XRBaseTargetFilter + { + [Tooltip("Layers which block the line of sight.")] + [SerializeField] private LayerMask _blockingLayers = 1; + + [Tooltip("Targets further away (m) can't be hovered or grabbed.")] + [SerializeField] private float _maxDistance = 10f; + + [Tooltip("Targets closer to the hand (m) skip the check.")] + [SerializeField] private float _minCheckDistance = 0.15f; + + [Tooltip("The ray ends this far (m) in front of the target's closest point, as the point lies on its surface.")] + [SerializeField] private float _surfaceTolerance = 0.02f; + + private readonly RaycastHit[] _hits = new RaycastHit[16]; + + public override void Process(IXRInteractor interactor, List targets, + List results) + { + var origin = GetOrigin(interactor); + foreach (var target in targets) + { + if (IsInLineOfSight(origin, target)) + results.Add(target); + } + } + + private static Vector3 GetOrigin(IXRInteractor interactor) + { + if (interactor is NearFarInteractor nearFar && nearFar.nearInteractionCaster != null && + nearFar.nearInteractionCaster.effectiveCastOrigin != null) + return nearFar.nearInteractionCaster.effectiveCastOrigin.position; + + return interactor.transform.position; + } + + private bool IsInLineOfSight(Vector3 origin, IXRInteractable target) + { + if (!XRInteractableUtility.TryGetClosestPointOnCollider(target, origin, out var distanceInfo)) + return true; + + var toTarget = distanceInfo.point - origin; + var distance = toTarget.magnitude; + if (distance > _maxDistance) + return false; + + if (distance <= _minCheckDistance) + return true; + + var hitCount = Physics.RaycastNonAlloc(origin, toTarget / distance, _hits, distance - _surfaceTolerance, + _blockingLayers, QueryTriggerInteraction.Ignore); + + var targetColliders = (target as XRBaseInteractable)?.colliders; + for (var i = 0; i < hitCount; i++) + { + var hitCollider = _hits[i].collider; + if (targetColliders == null || !targetColliders.Contains(hitCollider)) + return false; + } + + return true; + } + } +} diff --git a/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriLineOfSightFilter.cs.meta b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriLineOfSightFilter.cs.meta new file mode 100644 index 000000000..17b11b932 --- /dev/null +++ b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriLineOfSightFilter.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 06d37e5228fbbc744a06dbbcbfa399a9 \ No newline at end of file diff --git a/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriRig.cs b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriRig.cs index a1f26e6e4..ea06a69bc 100644 --- a/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriRig.cs +++ b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriRig.cs @@ -34,6 +34,13 @@ public class XriRig : MonoBehaviour, IVrRig [SerializeField] private Transform _leftController; [SerializeField] private Transform _rightController; + [Header("Grabbing")] + [Tooltip("Near-Far interactor of the left hand (direct and distance grab, UI).")] + [SerializeField] private XriGrabberBridge _leftGrabber; + + [Tooltip("Near-Far interactor of the right hand (direct and distance grab, UI).")] + [SerializeField] private XriGrabberBridge _rightGrabber; + [Tooltip("Fade on the camera, driven by Fade(). WallFade on the camera uses it too.")] [SerializeField] private ScreenFade _screenFade; @@ -74,9 +81,8 @@ public class XriRig : MonoBehaviour, IVrRig [Tooltip("Below this HMD height (m), the Standing setting doesn't scale (no headset, not tracked yet).")] [SerializeField] private float _minCalibrationHeight = 0.5f; - private static readonly IReadOnlyList _noGrabbers = Array.Empty(); - private XriInput _xriInput; + private List _handGrabbers; private Transform _cameraOffset; private bool _turnEnabled = true; private bool _teleportEnabled = true; @@ -198,8 +204,22 @@ public float StepOffset public float FadeAlpha => _screenFade != null ? _screenFade.FadeAlpha : 0f; - // TODO HVR phase 2: Near-Far interactors. - public IReadOnlyList HandGrabbers => _noGrabbers; + /// + /// One Near-Far interactor per hand. Resolved lazily, as adapters on this GameObject ask in their Awake. + /// + public IReadOnlyList HandGrabbers + { + get + { + if (_handGrabbers != null) + return _handGrabbers; + + _handGrabbers = new List(); + AddGrabber(_leftGrabber, VrHandSide.Left); + AddGrabber(_rightGrabber, VrHandSide.Right); + return _handGrabbers; + } + } private Transform CameraOffset => _cameraOffset ??= _origin.CameraFloorOffsetObject.transform; @@ -385,9 +405,32 @@ private void OnTeleportLocomotionEnded(LocomotionProvider provider) Teleported?.Invoke(_teleportPosition); } + private void AddGrabber(XriGrabberBridge grabber, VrHandSide side) + { + if (grabber != null) + _handGrabbers.Add(grabber); + else + Logger.LogError($"[XRI] XriRig has no grabber for the {side} hand. Grabbing won't work.", LogCat.VR); + } + + /// + /// Grabbing and hovering (direct and distance) of both hands. UI pointing keeps working. + /// Objects already held stay in the hand. + /// public void SetGrabbingEnabled(bool isEnabled) { - // NOP until HVR phase 2 (interactors). + SetGrabbingEnabled(VrHandSide.Left, isEnabled); + SetGrabbingEnabled(VrHandSide.Right, isEnabled); + } + + public void SetGrabbingEnabled(VrHandSide side, bool isEnabled) + { + var grabber = side == VrHandSide.Left ? _leftGrabber : _rightGrabber; + if (grabber == null) + return; + + grabber.Interactor.allowSelect = isEnabled; + grabber.Interactor.allowHover = isEnabled; } public void Fade(float alpha, float speed) diff --git a/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriUiPointers.cs b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriUiPointers.cs index 854fa5886..229e58277 100644 --- a/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriUiPointers.cs +++ b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriUiPointers.cs @@ -10,7 +10,7 @@ namespace Gothic.VR.Interaction.Backends.Xri { /// - /// UI laser pointers of the XRI rig: one XRRayInteractor per controller (UI only, "UI Ray" on the player prefab) + /// UI laser pointers of the XRI rig: the far ray of each hand's NearFarInteractor (also used for distance grabs) /// and the XRUIInputModule on the player's EventSystem. A canvas is hit only once it has a /// TrackedDeviceGraphicRaycaster, which RegisterCanvas() adds. /// diff --git a/Assets/Gothic-VR/Scripts/Interaction/Components/VrInteractable.cs b/Assets/Gothic-VR/Scripts/Interaction/Components/VrInteractable.cs index 908a55e21..6c3afedca 100644 --- a/Assets/Gothic-VR/Scripts/Interaction/Components/VrInteractable.cs +++ b/Assets/Gothic-VR/Scripts/Interaction/Components/VrInteractable.cs @@ -36,11 +36,22 @@ private IVrInteractableBackend Backend get { if (_backend == null) - _backend = GetComponent(); + _backend = FindActiveBackend(); return _backend; } } + private IVrInteractableBackend FindActiveBackend() + { + foreach (var backend in GetComponents()) + { + if (backend.IsActive) + return backend; + } + + return null; + } + /// /// The VrInteractable on this GameObject or (if none) the first one below it. /// diff --git a/Assets/Gothic-VR/Scripts/Interaction/Models/VrGrabberKind.cs b/Assets/Gothic-VR/Scripts/Interaction/Models/VrGrabberKind.cs index 43bd2b592..c28bc906e 100644 --- a/Assets/Gothic-VR/Scripts/Interaction/Models/VrGrabberKind.cs +++ b/Assets/Gothic-VR/Scripts/Interaction/Models/VrGrabberKind.cs @@ -11,7 +11,8 @@ public enum VrGrabberKind Hand, /// - /// A hand pulling an object from a distance (remote grab). The same object is grabbed by the Hand afterwards. + /// A hand pulling an object from a distance (remote grab). On HVR, the same object is grabbed by the Hand + /// afterwards; on XRI, the distance grab is the only grab event. /// Distance, diff --git a/Assets/Gothic-VR/Scripts/Interaction/Ports/IVrInteractableBackend.cs b/Assets/Gothic-VR/Scripts/Interaction/Ports/IVrInteractableBackend.cs index b842a3684..b5ba731c2 100644 --- a/Assets/Gothic-VR/Scripts/Interaction/Ports/IVrInteractableBackend.cs +++ b/Assets/Gothic-VR/Scripts/Interaction/Ports/IVrInteractableBackend.cs @@ -6,9 +6,15 @@ namespace Gothic.VR.Interaction.Ports /// /// Implemented by the backend bridge next to a VrInteractable. Game code uses VrInteractable instead. /// The bridge also raises the VrInteractable events. + /// Prefabs carry the bridges of all backends; only the bridge of the active backend is used. /// public interface IVrInteractableBackend { + /// + /// Whether this bridge belongs to the active VR backend. + /// + bool IsActive { get; } + bool IsHeld { get; } IReadOnlyList Colliders { get; } void ForceRelease(); diff --git a/Docs/HVR-replacement/phase-2-grabbing.md b/Docs/HVR-replacement/phase-2-grabbing.md index e1db6de8c..ec33126a0 100644 --- a/Docs/HVR-replacement/phase-2-grabbing.md +++ b/Docs/HVR-replacement/phase-2-grabbing.md @@ -8,13 +8,45 @@ talking to or looting NPCs. ## Exit criteria -- [ ] Item pickup by hand and by distance grab adds to the inventory exactly once; two-hand grab doesn't double-count; - drop removes. +- [x] Item pickup by hand and by distance grab adds to the inventory exactly once; two-hand grab doesn't double-count; + drop removes. (2a. Note: world items have `Amount = 0` in the ZEN, so `VRPlayerService` adds 0 of them on both + backends; verified with `Amount = 1` set at runtime. Pre-existing, not fixed here.) - [ ] Melee: weapon velocity detection (`VrWeaponAttackDomain`) triggers hits with the same thresholds as on HVR. -- [ ] Hover shows the name label and highlight (`VRFocus`). +- [x] Hover shows the name label and highlight (`VRFocus`). (2a: items. Mobs/NPCs in 2b.) - [ ] Grab on NPC = talk / skip line; grab on a dead NPC = loot panel; grab on a mob = use it. -- [ ] Held/socketed items don't push the player's `CharacterController`. -- [ ] Swimming disables grabbing and hovering (`IVrRig.SetGrabbingEnabled(false)`). +- [x] Held/socketed items don't push the player's `CharacterController`. (2a: held items; XRI ignores the + CharacterController of the selecting rig on top of `VRPlayerService.IgnorePlayerCollision`. Sockets in phase 3.) +- [x] Swimming disables grabbing and hovering (`IVrRig.SetGrabbingEnabled(false)`). (2a; UI pointing stays.) + +## Split + +- **2a - items** (`engine/hvr-replacement-2a`): Near-Far per hand, `GothicGrabInteractable`, `XriInteractableBridge`, + `XriGrabberBridge`, `XriLineOfSightFilter`, `oCItem.prefab`, hover, swim toggle. +- **2b - mobs and NPCs**: `XRSimpleInteractable` + bridge on mobs/`oCNpc` (removes the `ForceRelease()` workaround in + `VRNpc.OnGrabbed`), melee velocity tuning, dig spots, `VRMouth` on the XRI camera. + +### 2a notes (where reality deviated) + +- `Kind` doesn't come from `selectionRegion`: with `farAttachMode = Near` (pull to the hand, like HVR's force grab) + a far grab has no attach offset, so Near-Far reports `Near` for it. `XriGrabberBridge` decides by the distance + hand → closest collider point at selection (near caster radius + 5 cm). Release events reuse the kind of the grab. +- `XriGrabberBridge.Kind` is always `Hand` (one interactor per hand does both); the per-event `VrGrabArgs.Kind` says + `Hand` or `Distance`. So `VRPlayerWeaponInteraction` (filters grabbers by `Kind == Hand`) also gets distance grabs, + which end in the hand on XRI. +- Prefabs carry both backends. `IVrInteractableBackend.IsActive` (bridges `[Inject] IVrBackend`) picks the bridge; + `VrInteractable` uses the active one. `GothicGrabInteractable` is **disabled in `oCItem.prefab`** and only + `XriInteractableBridge.Start` enables it on Xri (after collecting the runtime colliders), so the Hvr backend never + creates an `XRInteractionManager`. `SetupColliders()` re-collects and re-registers (disable/enable) when not held. +- `unparentTransformOnGrab = false`: `VRPlayerService` finds the item's `VobLoader` via `GetComponentInParent`. +- Hover: Near-Far only ever has one valid target (closest). The bridge forwards hovers of hands only and counts + them: `HoverEntered` for the first hand, `HoverExited` for the last. Near-Far stops hovering while it selects, + so the label goes away once the item is in the hand (same order as HVR: hover, grab, hover exit). +- Layer masks: near caster `VobItem, VobItemNoWorldCollision, VobNpcOrMonster, VobMovable, Grabbable`; far caster + the same + `Default, UI` (far ray also does UI, cast distance 30 m like the 1c UI ray); line of sight blocked by + `Default, VobItem, VobNpcOrMonster, VobMovable, Grabbable`, grab/hover range 10 m (`XriLineOfSightFilter`). +- Held items get `RigidbodyInterpolation.Interpolate` (restored on drop). Throw: XRI defaults (`throwOnDetach`, + `throwVelocityScale` 1.5), not tuned against HVR yet. +- Interim hand visual: a 4 cm sphere (`Hand Placeholder`, URP Lit, no collider) under each Near-Far interactor. ## Mapping