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 2a7708b59..fc4c67aa0 100644 --- a/Assets/Gothic-VR/Resources/VR/Prefabs/VR - Player XRI.prefab +++ b/Assets/Gothic-VR/Resources/VR/Prefabs/VR - Player XRI.prefab @@ -1,5 +1,170 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: +--- !u!1 &267875144165424739 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2965337406212723256} + - component: {fileID: 5660352581662651130} + - component: {fileID: 8915653104549045023} + - component: {fileID: 5731880512578072988} + m_Layer: 1 + m_Name: Mouth + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2965337406212723256 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 267875144165424739} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: -0.049999952, z: 0.1} + m_LocalScale: {x: 0.049999997, y: 0, z: 0} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 3795310480892305868} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &5660352581662651130 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 267875144165424739} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 82dbe1ef915b4a95bdc6bfd60cffca36, type: 3} + m_Name: + m_EditorClassIdentifier: + _mouthAudio: {fileID: 5731880512578072988} +--- !u!135 &8915653104549045023 +SphereCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 267875144165424739} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 1 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Radius: 2 + m_Center: {x: 0, y: 0, z: 0} +--- !u!82 &5731880512578072988 +AudioSource: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 267875144165424739} + m_Enabled: 1 + serializedVersion: 4 + OutputAudioMixerGroup: {fileID: 0} + m_audioClip: {fileID: 0} + m_Resource: {fileID: 0} + m_PlayOnAwake: 0 + m_Volume: 1 + m_Pitch: 1 + Loop: 0 + Mute: 0 + Spatialize: 0 + SpatializePostEffects: 0 + Priority: 128 + DopplerLevel: 1 + MinDistance: 1 + MaxDistance: 500 + Pan2D: 0 + rolloffMode: 0 + BypassEffects: 0 + BypassListenerEffects: 0 + BypassReverbZones: 0 + rolloffCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 1 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + - serializedVersion: 3 + time: 1 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + panLevelCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + spreadCustomCurve: + serializedVersion: 2 + m_Curve: + - serializedVersion: 3 + time: 0 + value: 0 + inSlope: 0 + outSlope: 0 + tangentMode: 0 + weightedMode: 0 + inWeight: 0.33333334 + outWeight: 0.33333334 + m_PreInfinity: 2 + m_PostInfinity: 2 + m_RotationOrder: 4 + reverbZoneMixCustomCurve: + 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 --- !u!1 &778145573255517820 GameObject: m_ObjectHideFlags: 0 @@ -636,6 +801,7 @@ Transform: - {fileID: 2282471573976460531} - {fileID: 307772356793477108} - {fileID: 4950858812719782323} + - {fileID: 2965337406212723256} m_Father: {fileID: 7905090655299301591} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!20 &7212599541473323004 diff --git a/Assets/Gothic-VR/Resources/VR/Prefabs/Vobs/oCMobBed.prefab b/Assets/Gothic-VR/Resources/VR/Prefabs/Vobs/oCMobBed.prefab index 26c42099d..671fe159b 100644 --- a/Assets/Gothic-VR/Resources/VR/Prefabs/Vobs/oCMobBed.prefab +++ b/Assets/Gothic-VR/Resources/VR/Prefabs/Vobs/oCMobBed.prefab @@ -15,6 +15,8 @@ GameObject: - component: {fileID: 2225125317086924068} - component: {fileID: 6622844009418538601} - component: {fileID: 2985694541242234038} + - component: {fileID: 8641488167423033334} + - component: {fileID: 2670920612905196285} m_Layer: 6 m_Name: BIP01.*|ZM.* m_TagString: Untagged @@ -226,6 +228,92 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 594f5e7857d0629419c1bef807639a86, type: 3} m_Name: m_EditorClassIdentifier: Gothic.VR::Gothic.VR.Interaction.Backends.Hvr.HvrInteractableBridge +--- !u!114 &8641488167423033334 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5926234300762413270} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 8a35f6cfbfba9b548aaa00d52cfe8a50, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.XR.Interaction.Toolkit::UnityEngine.XR.Interaction.Toolkit.Interactables.XRSimpleInteractable + m_InteractionManager: {fileID: 0} + m_Colliders: [] + m_InteractionLayers: + m_Bits: 1 + m_DistanceCalculationMode: 1 + m_SelectMode: 0 + 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} +--- !u!114 &2670920612905196285 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5926234300762413270} + 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!1 &6503575194566409312 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/Gothic-VR/Resources/VR/Prefabs/Vobs/oCMobFire.prefab b/Assets/Gothic-VR/Resources/VR/Prefabs/Vobs/oCMobFire.prefab index 4d5cc6937..81a0883bf 100644 --- a/Assets/Gothic-VR/Resources/VR/Prefabs/Vobs/oCMobFire.prefab +++ b/Assets/Gothic-VR/Resources/VR/Prefabs/Vobs/oCMobFire.prefab @@ -15,6 +15,8 @@ GameObject: - component: {fileID: 2520659641626351288} - component: {fileID: 7062935307805374239} - component: {fileID: 8587772998141430396} + - component: {fileID: 6735155269358756213} + - component: {fileID: 7519700859229872273} m_Layer: 6 m_Name: ZM_.*LIGHTER m_TagString: Untagged @@ -226,6 +228,92 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 594f5e7857d0629419c1bef807639a86, type: 3} m_Name: m_EditorClassIdentifier: Gothic.VR::Gothic.VR.Interaction.Backends.Hvr.HvrInteractableBridge +--- !u!114 &6735155269358756213 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5926234300762413270} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 8a35f6cfbfba9b548aaa00d52cfe8a50, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.XR.Interaction.Toolkit::UnityEngine.XR.Interaction.Toolkit.Interactables.XRSimpleInteractable + m_InteractionManager: {fileID: 0} + m_Colliders: [] + m_InteractionLayers: + m_Bits: 1 + m_DistanceCalculationMode: 1 + m_SelectMode: 0 + 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} +--- !u!114 &7519700859229872273 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5926234300762413270} + 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!1 &6503575194566409312 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/Gothic-VR/Resources/VR/Prefabs/Vobs/oCMobInter.prefab b/Assets/Gothic-VR/Resources/VR/Prefabs/Vobs/oCMobInter.prefab index 1cf05cd15..139152000 100644 --- a/Assets/Gothic-VR/Resources/VR/Prefabs/Vobs/oCMobInter.prefab +++ b/Assets/Gothic-VR/Resources/VR/Prefabs/Vobs/oCMobInter.prefab @@ -15,6 +15,8 @@ GameObject: - component: {fileID: 3676752456108531535} - component: {fileID: 3911890553226910476} - component: {fileID: 3096177028477653256} + - component: {fileID: 4574355318508319972} + - component: {fileID: 3671749759728242631} m_Layer: 6 m_Name: BIP01.*|ZM.* m_TagString: Untagged @@ -226,6 +228,92 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 594f5e7857d0629419c1bef807639a86, type: 3} m_Name: m_EditorClassIdentifier: Gothic.VR::Gothic.VR.Interaction.Backends.Hvr.HvrInteractableBridge +--- !u!114 &4574355318508319972 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5926234300762413270} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 8a35f6cfbfba9b548aaa00d52cfe8a50, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.XR.Interaction.Toolkit::UnityEngine.XR.Interaction.Toolkit.Interactables.XRSimpleInteractable + m_InteractionManager: {fileID: 0} + m_Colliders: [] + m_InteractionLayers: + m_Bits: 1 + m_DistanceCalculationMode: 1 + m_SelectMode: 0 + 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} +--- !u!114 &3671749759728242631 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5926234300762413270} + 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!1 &6503575194566409312 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/Gothic-VR/Resources/VR/Prefabs/Vobs/oCMobSwitch.prefab b/Assets/Gothic-VR/Resources/VR/Prefabs/Vobs/oCMobSwitch.prefab index 970b6a006..40402d3b8 100644 --- a/Assets/Gothic-VR/Resources/VR/Prefabs/Vobs/oCMobSwitch.prefab +++ b/Assets/Gothic-VR/Resources/VR/Prefabs/Vobs/oCMobSwitch.prefab @@ -93,6 +93,8 @@ GameObject: - component: {fileID: 6762376611792587169} - component: {fileID: 5867362459497893582} - component: {fileID: 7548610693852835858} + - component: {fileID: 2141752524981874939} + - component: {fileID: 8981695852211441513} m_Layer: 6 m_Name: BIP01.* m_TagString: Untagged @@ -304,6 +306,92 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 594f5e7857d0629419c1bef807639a86, type: 3} m_Name: m_EditorClassIdentifier: Gothic.VR::Gothic.VR.Interaction.Backends.Hvr.HvrInteractableBridge +--- !u!114 &2141752524981874939 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8788472130516112289} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 8a35f6cfbfba9b548aaa00d52cfe8a50, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.XR.Interaction.Toolkit::UnityEngine.XR.Interaction.Toolkit.Interactables.XRSimpleInteractable + m_InteractionManager: {fileID: 0} + m_Colliders: [] + m_InteractionLayers: + m_Bits: 1 + m_DistanceCalculationMode: 1 + m_SelectMode: 0 + 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} +--- !u!114 &8981695852211441513 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8788472130516112289} + 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 &7374455095753343057 PrefabInstance: m_ObjectHideFlags: 0 diff --git a/Assets/Gothic-VR/Resources/VR/Prefabs/Vobs/oCMobWheel.prefab b/Assets/Gothic-VR/Resources/VR/Prefabs/Vobs/oCMobWheel.prefab index 86bbe44de..502b4b06f 100644 --- a/Assets/Gothic-VR/Resources/VR/Prefabs/Vobs/oCMobWheel.prefab +++ b/Assets/Gothic-VR/Resources/VR/Prefabs/Vobs/oCMobWheel.prefab @@ -15,6 +15,8 @@ GameObject: - component: {fileID: 8384191140399634538} - component: {fileID: 5498683309141561368} - component: {fileID: 3429509007387962835} + - component: {fileID: 8173670485315067673} + - component: {fileID: 7365498040035335343} m_Layer: 6 m_Name: .* m_TagString: Untagged @@ -226,6 +228,92 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 594f5e7857d0629419c1bef807639a86, type: 3} m_Name: m_EditorClassIdentifier: Gothic.VR::Gothic.VR.Interaction.Backends.Hvr.HvrInteractableBridge +--- !u!114 &8173670485315067673 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5926234300762413270} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 8a35f6cfbfba9b548aaa00d52cfe8a50, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.XR.Interaction.Toolkit::UnityEngine.XR.Interaction.Toolkit.Interactables.XRSimpleInteractable + m_InteractionManager: {fileID: 0} + m_Colliders: [] + m_InteractionLayers: + m_Bits: 1 + m_DistanceCalculationMode: 1 + m_SelectMode: 0 + 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} +--- !u!114 &7365498040035335343 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5926234300762413270} + 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!1 &6503575194566409312 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/Gothic-VR/Resources/VR/Prefabs/Vobs/oCNpc.prefab b/Assets/Gothic-VR/Resources/VR/Prefabs/Vobs/oCNpc.prefab index 302eae8b5..c6c9198ea 100644 --- a/Assets/Gothic-VR/Resources/VR/Prefabs/Vobs/oCNpc.prefab +++ b/Assets/Gothic-VR/Resources/VR/Prefabs/Vobs/oCNpc.prefab @@ -312,6 +312,8 @@ GameObject: - component: {fileID: 8095166574519349901} - component: {fileID: 8068816277696156100} - component: {fileID: 7853705596767096919} + - component: {fileID: 5140815438130786265} + - component: {fileID: 5430918229934868786} m_Layer: 10 m_Name: RootMotionCollider m_TagString: Untagged @@ -538,6 +540,92 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 594f5e7857d0629419c1bef807639a86, type: 3} m_Name: m_EditorClassIdentifier: Gothic.VR::Gothic.VR.Interaction.Backends.Hvr.HvrInteractableBridge +--- !u!114 &5140815438130786265 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3647559741746323219} + m_Enabled: 0 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 8a35f6cfbfba9b548aaa00d52cfe8a50, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.XR.Interaction.Toolkit::UnityEngine.XR.Interaction.Toolkit.Interactables.XRSimpleInteractable + m_InteractionManager: {fileID: 0} + m_Colliders: [] + m_InteractionLayers: + m_Bits: 1 + m_DistanceCalculationMode: 1 + m_SelectMode: 0 + 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} +--- !u!114 &5430918229934868786 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3647559741746323219} + 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!1 &3748409399599174953 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/Gothic-VR/Scripts/Adapters/VRNpc.cs b/Assets/Gothic-VR/Scripts/Adapters/VRNpc.cs index 4fc4df670..2d99b3f63 100644 --- a/Assets/Gothic-VR/Scripts/Adapters/VRNpc.cs +++ b/Assets/Gothic-VR/Scripts/Adapters/VRNpc.cs @@ -74,9 +74,14 @@ private void OnGrabbed(VrGrabArgs args) if (isDead && _configService.Dev.EnableNpcLooting && _npcLoot != null) { _npcLoot.Toggle(_npcData); - // Grabbing turns physics on (VRPlayerItemAdapter); release immediately and freeze the corpse - args.Interactable.ForceRelease(); - _physicsService.DisablePhysicsForNpc(_npcData.PrefabProps); + // Grabbing turns physics on (VRPlayerItemAdapter); release immediately and freeze the corpse. + // Select-only interactables (XRI) neither move the NPC nor turn its physics on. + if (!args.Interactable.IsSelectOnly) + { + args.Interactable.ForceRelease(); + _physicsService.DisablePhysicsForNpc(_npcData.PrefabProps); + } + return; } @@ -91,6 +96,10 @@ private void OnGrabbed(VrGrabArgs args) } // Talking is a click, not a grab: release (grabbing turns physics on) and keep a seated NPC kinematic. + // Select-only interactables (XRI) don't move the NPC, so there's nothing to undo. + if (args.Interactable.IsSelectOnly) + return; + args.Interactable.ForceRelease(); if (_npcData.IsUsingMob()) _physicsService.DisablePhysicsForNpc(_npcData.PrefabProps); diff --git a/Assets/Gothic-VR/Scripts/Interaction/Backends/Hvr/HvrInteractableBridge.cs b/Assets/Gothic-VR/Scripts/Interaction/Backends/Hvr/HvrInteractableBridge.cs index a0f55c62d..0af2636d5 100644 --- a/Assets/Gothic-VR/Scripts/Interaction/Backends/Hvr/HvrInteractableBridge.cs +++ b/Assets/Gothic-VR/Scripts/Interaction/Backends/Hvr/HvrInteractableBridge.cs @@ -39,6 +39,7 @@ private HVRGrabbable Grabbable public bool IsActive => _vrBackend == null || _vrBackend is HvrBackend; public bool IsHeld => Grabbable.IsBeingHeld; + public bool IsSelectOnly => false; public IReadOnlyList Colliders => Grabbable.Colliders; private void Awake() diff --git a/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriBackend.cs b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriBackend.cs index a68b61c92..7c946ed56 100644 --- a/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriBackend.cs +++ b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriBackend.cs @@ -19,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, 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); + "screen fades, the XR Interaction Simulator and grabbing (items, mobs, NPCs) work. " + + "Sockets (phase 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/XriColliderUtility.cs b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriColliderUtility.cs new file mode 100644 index 000000000..42c69c137 --- /dev/null +++ b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriColliderUtility.cs @@ -0,0 +1,41 @@ +using UnityEngine; +using UnityEngine.XR.Interaction.Toolkit.Interactables; + +namespace Gothic.VR.Interaction.Backends.Xri +{ + /// + /// Like XRInteractableUtility.TryGetClosestPointOnCollider, but without Physics.ClosestPoint on non-convex + /// MeshColliders (mobs), which Unity doesn't support (it logs a warning on every call). Their bounds are used + /// instead. + /// + public static class XriColliderUtility + { + public static bool TryGetClosestPoint(IXRInteractable xrInteractable, Vector3 position, out Vector3 point, + out float distanceSqr) + { + point = position; + distanceSqr = float.MaxValue; + if (xrInteractable is not XRBaseInteractable baseInteractable) + return false; + + foreach (var interactableCollider in baseInteractable.colliders) + { + if (interactableCollider == null || !interactableCollider.enabled || + !interactableCollider.gameObject.activeInHierarchy) + continue; + + var colliderPoint = interactableCollider is MeshCollider { convex: false } + ? interactableCollider.ClosestPointOnBounds(position) + : interactableCollider.ClosestPoint(position); + var colliderDistanceSqr = (colliderPoint - position).sqrMagnitude; + if (colliderDistanceSqr >= distanceSqr) + continue; + + point = colliderPoint; + distanceSqr = colliderDistanceSqr; + } + + return distanceSqr < float.MaxValue; + } + } +} diff --git a/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriColliderUtility.cs.meta b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriColliderUtility.cs.meta new file mode 100644 index 000000000..c5b721336 --- /dev/null +++ b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriColliderUtility.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: c6a29eeb46b1f2040ab47caf27b5d85b \ No newline at end of file diff --git a/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriGrabberBridge.cs b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriGrabberBridge.cs index 051eea660..3ed8e2daa 100644 --- a/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriGrabberBridge.cs +++ b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriGrabberBridge.cs @@ -7,7 +7,6 @@ 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 { @@ -121,11 +120,10 @@ private VrGrabberKind ResolveKind(IXRInteractable xrInteractable) : Interactor.transform; var maxDistance = nearRadius + _nearGrabMargin; - if (!XRInteractableUtility.TryGetClosestPointOnCollider(xrInteractable, origin.position, - out var distanceInfo)) + if (!XriColliderUtility.TryGetClosestPoint(xrInteractable, origin.position, out _, out var distanceSqr)) return VrGrabberKind.Distance; - return distanceInfo.distanceSqr <= maxDistance * maxDistance ? VrGrabberKind.Hand : VrGrabberKind.Distance; + return distanceSqr <= maxDistance * maxDistance ? VrGrabberKind.Hand : VrGrabberKind.Distance; } private void OnSelectEntered(SelectEnterEventArgs args) diff --git a/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriInteractableBridge.cs b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriInteractableBridge.cs index 4a991a996..92d76630f 100644 --- a/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriInteractableBridge.cs +++ b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriInteractableBridge.cs @@ -13,8 +13,9 @@ 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. + /// Sits next to an XRI interactable (GothicGrabInteractable for items, XRSimpleInteractable for mobs and NPCs) + /// 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 @@ -35,6 +36,11 @@ public class XriInteractableBridge : MonoBehaviour, IVrInteractableBackend public bool IsActive => _vrBackend is XriBackend; public bool IsHeld => _xrInteractable != null && _xrInteractable.isSelected; + /// + /// Mobs and NPCs carry an XRSimpleInteractable (select = use/talk), items a GothicGrabInteractable. + /// + public bool IsSelectOnly => _xrInteractable != null && _xrInteractable is not XRGrabInteractable; + public IReadOnlyList Colliders => _xrInteractable != null ? _xrInteractable.colliders : System.Array.Empty(); diff --git a/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriLineOfSightFilter.cs b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriLineOfSightFilter.cs index a094ef69c..b1b57917d 100644 --- a/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriLineOfSightFilter.cs +++ b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriLineOfSightFilter.cs @@ -3,7 +3,6 @@ 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 { @@ -52,10 +51,10 @@ private static Vector3 GetOrigin(IXRInteractor interactor) private bool IsInLineOfSight(Vector3 origin, IXRInteractable target) { - if (!XRInteractableUtility.TryGetClosestPointOnCollider(target, origin, out var distanceInfo)) + if (!XriColliderUtility.TryGetClosestPoint(target, origin, out var closestPoint, out _)) return true; - var toTarget = distanceInfo.point - origin; + var toTarget = closestPoint - origin; var distance = toTarget.magnitude; if (distance > _maxDistance) return false; diff --git a/Assets/Gothic-VR/Scripts/Interaction/Components/VrInteractable.cs b/Assets/Gothic-VR/Scripts/Interaction/Components/VrInteractable.cs index 6c3afedca..083458333 100644 --- a/Assets/Gothic-VR/Scripts/Interaction/Components/VrInteractable.cs +++ b/Assets/Gothic-VR/Scripts/Interaction/Components/VrInteractable.cs @@ -29,6 +29,12 @@ public class VrInteractable : MonoBehaviour /// public bool IsHeld => Backend != null && Backend.IsHeld; + /// + /// A grab only "uses" the object (talk, use a mob) and doesn't hold it. + /// See IVrInteractableBackend.IsSelectOnly. + /// + public bool IsSelectOnly => Backend != null && Backend.IsSelectOnly; + public IReadOnlyList Colliders => Backend != null ? Backend.Colliders : Array.Empty(); private IVrInteractableBackend Backend diff --git a/Assets/Gothic-VR/Scripts/Interaction/Ports/IVrInteractableBackend.cs b/Assets/Gothic-VR/Scripts/Interaction/Ports/IVrInteractableBackend.cs index b5ba731c2..6e960c0ae 100644 --- a/Assets/Gothic-VR/Scripts/Interaction/Ports/IVrInteractableBackend.cs +++ b/Assets/Gothic-VR/Scripts/Interaction/Ports/IVrInteractableBackend.cs @@ -16,6 +16,14 @@ public interface IVrInteractableBackend bool IsActive { get; } bool IsHeld { get; } + + /// + /// True if a grab only "uses" the object (talk to an NPC, use a mob): nothing moves, nothing follows the hand + /// and no BeforeGrabbed is raised. False if the grab holds the object like an item (HVR grabs NPCs and mobs + /// that way, so their adapters release them again). + /// + bool IsSelectOnly { get; } + IReadOnlyList Colliders { get; } void ForceRelease(); void SetupColliders(); diff --git a/Docs/HVR-replacement/phase-2-grabbing.md b/Docs/HVR-replacement/phase-2-grabbing.md index ec33126a0..1fdcc31cc 100644 --- a/Docs/HVR-replacement/phase-2-grabbing.md +++ b/Docs/HVR-replacement/phase-2-grabbing.md @@ -11,9 +11,16 @@ talking to or looting NPCs. - [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. -- [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. +- [x] Melee: weapon velocity detection (`VrWeaponAttackDomain`) triggers hits with the same thresholds as on HVR. + (2b: thresholds unchanged, no per-backend value. XRI's VelocityTracking with `velocityDamping = 1`, + `velocityScale = 1` and no velocity limit sets the Rigidbody's velocity to (target - position) / fixedDeltaTime + every physics step, so the measured speed is the hand speed at the item's pivot, without the lag of HVR's + jointed physics hand. A swing reaches 2 m/s at least as easily as on HVR. Hand side verified (`_handlesRightHand` + for the right Near-Far). Feel and false positives from tracking jitter still need a headset playtest.) +- [x] Hover shows the name label and highlight (`VRFocus`). (2a: items. 2b: mobs; NPCs show their health bar.) +- [x] Grab on NPC = talk / skip line; grab on a dead NPC = loot panel; grab on a mob = use it. + (2b: verified with the simulator: Diego talks, the loot panel toggles on a dead NPC, fire and wheel are used. + Skipping a line goes through the same branch (`IsInDialog`), but no line was spoken while testing.) - [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.) @@ -48,6 +55,29 @@ talking to or looting NPCs. `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. +### 2b notes (where reality deviated) + +- Mobs (`oCMobBed/Fire/Inter/Switch/Wheel`, so also the `oCMobInter/Seat` and `DigSpot` variants) and `oCNpc` + (`BIP01/RootMotionCollider`) got `XRSimpleInteractable` (disabled in the prefab, default settings, select mode + Single) + `XriInteractableBridge` next to `HVRGrabbable`/`HvrInteractableBridge`. Doors, chests and ladders + (phase 4) have no XRI bridge yet: their `VrInteractable` has no active backend on Xri. +- `IVrInteractableBackend.IsSelectOnly` / `VrInteractable.IsSelectOnly`: true for XRI simple interactables (select = + use/talk, nothing moves, no `BeforeGrabbed`), false on HVR. `VRNpc` only does the `ForceRelease()` + + `DisablePhysicsForNpc()` workaround when it's false, so HVR behaves as before. On XRI the selection lasts while + the grip is held; the next grip press talks again or skips a line. Mobs keep the selection while held on both + backends (`VRMobInteraction` resets on release). +- `XriColliderUtility.TryGetClosestPoint` replaces `XRInteractableUtility.TryGetClosestPointOnCollider` in + `XriGrabberBridge` and `XriLineOfSightFilter`: Unity's `Collider.ClosestPoint` doesn't support non-convex + `MeshCollider`s (mobs) and logged a warning per frame while pointing at one. Non-convex colliders use their bounds. +- Dig spots: no change. `VRDigSpot` reads `VRPlayerService.GrabbedItemLeft/Right`, filled from + `VrGrabArgs.HandSide` = the Near-Far's `handedness` (`XriGrabberBridge.HandSide`). +- `VRMouth`: the `Mouth` GameObject (VRMouth, trigger SphereCollider r = 2 at scale 0.05 -> 10 cm, AudioSource, + layer TransparentFX) is copied from the HVR rig's camera to `Main Camera` of `VR - Player XRI.prefab`. It's + backend neutral (trigger + held item's Rigidbody). Verified: berries held to the mouth are eaten. +- Not caused by XRI (the code path is backend neutral), not fixed: an item eaten while held throws a `MissingReferenceException` in + `VobMeshCullingDomain.StopTrackVobPositionUpdatesDelayed` (the release starts a delayed coroutine on the + destroyed item). + ## Mapping | Today (HVR) | Xri |