diff --git a/Assets/Gothic-VR/Resources/VR/Prefabs/Vobs/oCMobContainer.prefab b/Assets/Gothic-VR/Resources/VR/Prefabs/Vobs/oCMobContainer.prefab
index 2592d8fd0..fcabb65ab 100644
--- a/Assets/Gothic-VR/Resources/VR/Prefabs/Vobs/oCMobContainer.prefab
+++ b/Assets/Gothic-VR/Resources/VR/Prefabs/Vobs/oCMobContainer.prefab
@@ -754,6 +754,7 @@ Transform:
m_Children:
- {fileID: 7540743326042314200}
- {fileID: 5958767219285650984}
+ - {fileID: 4433186368314570406}
m_Father: {fileID: 2022050282646122291}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
--- !u!1 &3172860016353300812
@@ -1773,6 +1774,73 @@ AudioSource:
m_PreInfinity: 2
m_PostInfinity: 2
m_RotationOrder: 4
+--- !u!1 &4346627333414460749
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 8655296546618503778}
+ - component: {fileID: 6391945242380171386}
+ - component: {fileID: 7892604921471703786}
+ m_Layer: 1
+ m_Name: DropZone
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &8655296546618503778
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 4346627333414460749}
+ 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: 4433186368314570406}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!65 &6391945242380171386
+BoxCollider:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 4346627333414460749}
+ 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_Size: {x: 1, y: 0.3, z: 0.75}
+ m_Center: {x: 0, y: 0.1, z: 0}
+--- !u!114 &7892604921471703786
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 4346627333414460749}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: d7941123ebdc7d646a9e2268240bc009, type: 3}
+ m_Name:
+ m_EditorClassIdentifier: Gothic.VR::Gothic.VR.Interaction.Components.VrContainerDropZone
+ _containerGo: {fileID: 0}
--- !u!1 &4544068122292998800
GameObject:
m_ObjectHideFlags: 0
@@ -2152,6 +2220,9 @@ GameObject:
- component: {fileID: 172510743831141755}
- component: {fileID: 8269181727875358990}
- component: {fileID: 1469359342129423611}
+ - component: {fileID: 6745565813121138959}
+ - component: {fileID: 7611355444731811914}
+ - component: {fileID: 8346136834463750903}
m_Layer: 11
m_Name: BIP01 CHEST_.*_1
m_TagString: Untagged
@@ -2428,9 +2499,6 @@ MonoBehaviour:
PreviousClosed: 0
VerboseLogging: 0
Locked: 0
- _rootGo: {fileID: 6503575194566409312}
- _socketContainer: {fileID: 923689649037191229}
- _collectorCollider: {fileID: 9145350332021062103}
--- !u!114 &172510743831141755
MonoBehaviour:
m_ObjectHideFlags: 0
@@ -2467,6 +2535,106 @@ MonoBehaviour:
m_Script: {fileID: 11500000, guid: 9fca5660b7d87044b9f6309422813386, type: 3}
m_Name:
m_EditorClassIdentifier: Gothic.VR::Gothic.VR.Interaction.Backends.Hvr.HvrHingeBridge
+--- !u!114 &6745565813121138959
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 5980433150175133251}
+ 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 &7611355444731811914
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 5980433150175133251}
+ 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!114 &8346136834463750903
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 5980433150175133251}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 0ba712f1856779441b7ab647bc58f884, type: 3}
+ m_Name:
+ m_EditorClassIdentifier: Gothic.VR::Gothic.VR.Interaction.Components.VrChestLidToggle
+ _openAngle: 110
+ _swingTime: 0.4
--- !u!1 &6389233531767616918
GameObject:
m_ObjectHideFlags: 0
@@ -2568,6 +2736,7 @@ GameObject:
- component: {fileID: 2022050282646122291}
- component: {fileID: 3928131288078199320}
- component: {fileID: 7775892214903187319}
+ - component: {fileID: 98959399746428057}
m_Layer: 0
m_Name: oCMobContainer
m_TagString: GothicVob
@@ -2618,6 +2787,22 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier:
_injectionStrategy: 2
+--- !u!114 &98959399746428057
+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: 7038de71bad13264db57802c214cea67, type: 3}
+ m_Name:
+ m_EditorClassIdentifier: Gothic.VR::Gothic.VR.Interaction.Components.VrChestSlots
+ _inventories:
+ - {fileID: 3405583761693813258}
+ - {fileID: 6878871074265092263}
+ _silentAfterSpawnTime: 1
--- !u!1 &6624039968105045667
GameObject:
m_ObjectHideFlags: 0
@@ -3160,6 +3345,78 @@ MeshRenderer:
m_SortingOrder: 0
m_MaskInteraction: 0
m_AdditionalVertexStreams: {fileID: 0}
+--- !u!1 &6878871074265092263
+GameObject:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ serializedVersion: 6
+ m_Component:
+ - component: {fileID: 4433186368314570406}
+ - component: {fileID: 8693254405057511817}
+ - component: {fileID: 11089349496924240}
+ m_Layer: 0
+ m_Name: Inventory XRI
+ m_TagString: Untagged
+ m_Icon: {fileID: 0}
+ m_NavMeshLayer: 0
+ m_StaticEditorFlags: 0
+ m_IsActive: 1
+--- !u!4 &4433186368314570406
+Transform:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6878871074265092263}
+ 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: 8655296546618503778}
+ - {fileID: 4482608820626094088}
+ - {fileID: 3505978642530898950}
+ - {fileID: 4817701778405511749}
+ - {fileID: 1985322522373786713}
+ - {fileID: 5810689853334014054}
+ - {fileID: 670284975210572744}
+ - {fileID: 8078386763284985711}
+ - {fileID: 11478428076491956}
+ - {fileID: 2374912704674468940}
+ - {fileID: 5876822858495877538}
+ - {fileID: 9178993993575104986}
+ - {fileID: 358648452475629578}
+ m_Father: {fileID: 4265338153244332921}
+ m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
+--- !u!114 &8693254405057511817
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6878871074265092263}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: 94103fbff7b07d64fb8a87c5cc6e1a54, type: 3}
+ m_Name:
+ m_EditorClassIdentifier: Gothic.VR::Gothic.VR.Interaction.Components.VrSocketContainer
+ _slots: []
+--- !u!114 &11089349496924240
+MonoBehaviour:
+ m_ObjectHideFlags: 0
+ m_CorrespondingSourceObject: {fileID: 0}
+ m_PrefabInstance: {fileID: 0}
+ m_PrefabAsset: {fileID: 0}
+ m_GameObject: {fileID: 6878871074265092263}
+ m_Enabled: 1
+ m_EditorHideFlags: 0
+ m_Script: {fileID: 11500000, guid: d33b9b45f9124f6b8afdb52a10613db0, type: 3}
+ m_Name:
+ m_EditorClassIdentifier: Gothic.VR::Gothic.VR.Adapters.Vob.Container.VRVobContainerSocketInventory
+ _additionalSockets: []
--- !u!1 &7330976607743722592
GameObject:
m_ObjectHideFlags: 0
@@ -4088,95 +4345,173 @@ MeshRenderer:
m_SortingOrder: 0
m_MaskInteraction: 0
m_AdditionalVertexStreams: {fileID: 0}
---- !u!1001 &6500207459066028785
+--- !u!1001 &1400001637806226801
PrefabInstance:
m_ObjectHideFlags: 0
serializedVersion: 2
m_Modification:
serializedVersion: 3
- m_TransformParent: {fileID: 5958767219285650984}
+ m_TransformParent: {fileID: 4433186368314570406}
m_Modifications:
- - target: {fileID: 1590612086424736195, guid: 2e45e4d4621c88147b3ce7a589bc548c, type: 3}
+ - target: {fileID: 2951849760368368205, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_Radius
+ value: 0.1
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalScale.x
+ value: 1.33
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalScale.y
+ value: 1.33
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalScale.z
+ value: 1.33
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.w
+ value: 0.7071068
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.x
+ value: 0.7071068
+ objectReference: {fileID: 0}
+ - target: {fileID: 6523535316780004576, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: _size
+ value: 0.18
+ objectReference: {fileID: 0}
+ - target: {fileID: 7034454508457674463, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
propertyPath: m_Name
- value: NameCanvas
+ value: Slot (6)
objectReference: {fileID: 0}
- - target: {fileID: 9151279884836745816, guid: 2e45e4d4621c88147b3ce7a589bc548c, type: 3}
- propertyPath: m_Pivot.x
- value: 0.5
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalPosition.x
+ value: 0
objectReference: {fileID: 0}
- - target: {fileID: 9151279884836745816, guid: 2e45e4d4621c88147b3ce7a589bc548c, type: 3}
- propertyPath: m_Pivot.y
- value: 0.5
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalPosition.y
+ value: 0
objectReference: {fileID: 0}
- - target: {fileID: 9151279884836745816, guid: 2e45e4d4621c88147b3ce7a589bc548c, type: 3}
- propertyPath: m_AnchorMax.x
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalPosition.z
value: 0
objectReference: {fileID: 0}
- - target: {fileID: 9151279884836745816, guid: 2e45e4d4621c88147b3ce7a589bc548c, type: 3}
- propertyPath: m_AnchorMax.y
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.w
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.x
value: 0
objectReference: {fileID: 0}
- - target: {fileID: 9151279884836745816, guid: 2e45e4d4621c88147b3ce7a589bc548c, type: 3}
- propertyPath: m_AnchorMin.x
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.y
value: 0
objectReference: {fileID: 0}
- - target: {fileID: 9151279884836745816, guid: 2e45e4d4621c88147b3ce7a589bc548c, type: 3}
- propertyPath: m_AnchorMin.y
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.z
value: 0
objectReference: {fileID: 0}
- - target: {fileID: 9151279884836745816, guid: 2e45e4d4621c88147b3ce7a589bc548c, type: 3}
- propertyPath: m_SizeDelta.x
- value: 150
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.x
+ value: 0
objectReference: {fileID: 0}
- - target: {fileID: 9151279884836745816, guid: 2e45e4d4621c88147b3ce7a589bc548c, type: 3}
- propertyPath: m_SizeDelta.y
- value: 25
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.y
+ value: 0
objectReference: {fileID: 0}
- - target: {fileID: 9151279884836745816, guid: 2e45e4d4621c88147b3ce7a589bc548c, type: 3}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.z
+ value: 0
+ objectReference: {fileID: 0}
+ m_RemovedComponents: []
+ m_RemovedGameObjects: []
+ m_AddedGameObjects: []
+ m_AddedComponents: []
+ m_SourcePrefab: {fileID: 100100000, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+--- !u!4 &8078386763284985711 stripped
+Transform:
+ m_CorrespondingSourceObject: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ m_PrefabInstance: {fileID: 1400001637806226801}
+ m_PrefabAsset: {fileID: 0}
+--- !u!1001 &2023147025575119812
+PrefabInstance:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_Modification:
+ serializedVersion: 3
+ m_TransformParent: {fileID: 4433186368314570406}
+ m_Modifications:
+ - target: {fileID: 2951849760368368205, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_Radius
+ value: 0.1
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalScale.x
+ value: 1.33
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalScale.y
+ value: 1.33
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalScale.z
+ value: 1.33
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.w
+ value: 0.7071068
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.x
+ value: 0.7071068
+ objectReference: {fileID: 0}
+ - target: {fileID: 6523535316780004576, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: _size
+ value: 0.18
+ objectReference: {fileID: 0}
+ - target: {fileID: 7034454508457674463, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_Name
+ value: Slot (10)
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
propertyPath: m_LocalPosition.x
value: 0
objectReference: {fileID: 0}
- - target: {fileID: 9151279884836745816, guid: 2e45e4d4621c88147b3ce7a589bc548c, type: 3}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
propertyPath: m_LocalPosition.y
value: 0
objectReference: {fileID: 0}
- - target: {fileID: 9151279884836745816, guid: 2e45e4d4621c88147b3ce7a589bc548c, type: 3}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
propertyPath: m_LocalPosition.z
- value: 0
+ value: -0.2
objectReference: {fileID: 0}
- - target: {fileID: 9151279884836745816, guid: 2e45e4d4621c88147b3ce7a589bc548c, type: 3}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
propertyPath: m_LocalRotation.w
value: 1
objectReference: {fileID: 0}
- - target: {fileID: 9151279884836745816, guid: 2e45e4d4621c88147b3ce7a589bc548c, type: 3}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
propertyPath: m_LocalRotation.x
- value: -0
+ value: 0
objectReference: {fileID: 0}
- - target: {fileID: 9151279884836745816, guid: 2e45e4d4621c88147b3ce7a589bc548c, type: 3}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
propertyPath: m_LocalRotation.y
- value: -0
+ value: 0
objectReference: {fileID: 0}
- - target: {fileID: 9151279884836745816, guid: 2e45e4d4621c88147b3ce7a589bc548c, type: 3}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
propertyPath: m_LocalRotation.z
- value: -0
- objectReference: {fileID: 0}
- - target: {fileID: 9151279884836745816, guid: 2e45e4d4621c88147b3ce7a589bc548c, type: 3}
- propertyPath: m_AnchoredPosition.x
value: 0
objectReference: {fileID: 0}
- - target: {fileID: 9151279884836745816, guid: 2e45e4d4621c88147b3ce7a589bc548c, type: 3}
- propertyPath: m_AnchoredPosition.y
- value: 0.5
- objectReference: {fileID: 0}
- - target: {fileID: 9151279884836745816, guid: 2e45e4d4621c88147b3ce7a589bc548c, type: 3}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
propertyPath: m_LocalEulerAnglesHint.x
value: 0
objectReference: {fileID: 0}
- - target: {fileID: 9151279884836745816, guid: 2e45e4d4621c88147b3ce7a589bc548c, type: 3}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
propertyPath: m_LocalEulerAnglesHint.y
value: 0
objectReference: {fileID: 0}
- - target: {fileID: 9151279884836745816, guid: 2e45e4d4621c88147b3ce7a589bc548c, type: 3}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
propertyPath: m_LocalEulerAnglesHint.z
value: 0
objectReference: {fileID: 0}
@@ -4184,14 +4519,1016 @@ PrefabInstance:
m_RemovedGameObjects: []
m_AddedGameObjects: []
m_AddedComponents: []
- m_SourcePrefab: {fileID: 100100000, guid: 2e45e4d4621c88147b3ce7a589bc548c, type: 3}
---- !u!224 &2651072820911968425 stripped
-RectTransform:
+ m_SourcePrefab: {fileID: 100100000, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+--- !u!4 &9178993993575104986 stripped
+Transform:
+ m_CorrespondingSourceObject: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ m_PrefabInstance: {fileID: 2023147025575119812}
+ m_PrefabAsset: {fileID: 0}
+--- !u!1001 &2425775376582498395
+PrefabInstance:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_Modification:
+ serializedVersion: 3
+ m_TransformParent: {fileID: 4433186368314570406}
+ m_Modifications:
+ - target: {fileID: 2951849760368368205, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_Radius
+ value: 0.1
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalScale.x
+ value: 1.33
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalScale.y
+ value: 1.33
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalScale.z
+ value: 1.33
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.w
+ value: 0.7071068
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.x
+ value: 0.7071068
+ objectReference: {fileID: 0}
+ - target: {fileID: 6523535316780004576, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: _size
+ value: 0.18
+ objectReference: {fileID: 0}
+ - target: {fileID: 7034454508457674463, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_Name
+ value: Slot (2)
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalPosition.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalPosition.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalPosition.z
+ value: 0.2
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.w
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.z
+ value: 0
+ objectReference: {fileID: 0}
+ m_RemovedComponents: []
+ m_RemovedGameObjects: []
+ m_AddedGameObjects: []
+ m_AddedComponents: []
+ m_SourcePrefab: {fileID: 100100000, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+--- !u!4 &4817701778405511749 stripped
+Transform:
+ m_CorrespondingSourceObject: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ m_PrefabInstance: {fileID: 2425775376582498395}
+ m_PrefabAsset: {fileID: 0}
+--- !u!1001 &3674748899295030204
+PrefabInstance:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_Modification:
+ serializedVersion: 3
+ m_TransformParent: {fileID: 4433186368314570406}
+ m_Modifications:
+ - target: {fileID: 2951849760368368205, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_Radius
+ value: 0.1
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalScale.x
+ value: 1.33
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalScale.y
+ value: 1.33
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalScale.z
+ value: 1.33
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.w
+ value: 0.7071068
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.x
+ value: 0.7071068
+ objectReference: {fileID: 0}
+ - target: {fileID: 6523535316780004576, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: _size
+ value: 0.18
+ objectReference: {fileID: 0}
+ - target: {fileID: 7034454508457674463, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_Name
+ value: Slot (9)
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalPosition.x
+ value: -0.2
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalPosition.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalPosition.z
+ value: -0.2
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.w
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.z
+ value: 0
+ objectReference: {fileID: 0}
+ m_RemovedComponents: []
+ m_RemovedGameObjects: []
+ m_AddedGameObjects: []
+ m_AddedComponents: []
+ m_SourcePrefab: {fileID: 100100000, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+--- !u!4 &5876822858495877538 stripped
+Transform:
+ m_CorrespondingSourceObject: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ m_PrefabInstance: {fileID: 3674748899295030204}
+ m_PrefabAsset: {fileID: 0}
+--- !u!1001 &3734126502942786168
+PrefabInstance:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_Modification:
+ serializedVersion: 3
+ m_TransformParent: {fileID: 4433186368314570406}
+ m_Modifications:
+ - target: {fileID: 2951849760368368205, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_Radius
+ value: 0.1
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalScale.x
+ value: 1.33
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalScale.y
+ value: 1.33
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalScale.z
+ value: 1.33
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.w
+ value: 0.7071068
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.x
+ value: 0.7071068
+ objectReference: {fileID: 0}
+ - target: {fileID: 6523535316780004576, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: _size
+ value: 0.18
+ objectReference: {fileID: 0}
+ - target: {fileID: 7034454508457674463, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_Name
+ value: Slot (4)
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalPosition.x
+ value: -0.4
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalPosition.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalPosition.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.w
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.z
+ value: 0
+ objectReference: {fileID: 0}
+ m_RemovedComponents: []
+ m_RemovedGameObjects: []
+ m_AddedGameObjects: []
+ m_AddedComponents: []
+ m_SourcePrefab: {fileID: 100100000, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+--- !u!4 &5810689853334014054 stripped
+Transform:
+ m_CorrespondingSourceObject: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ m_PrefabInstance: {fileID: 3734126502942786168}
+ m_PrefabAsset: {fileID: 0}
+--- !u!1001 &4865186542019747410
+PrefabInstance:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_Modification:
+ serializedVersion: 3
+ m_TransformParent: {fileID: 4433186368314570406}
+ m_Modifications:
+ - target: {fileID: 2951849760368368205, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_Radius
+ value: 0.1
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalScale.x
+ value: 1.33
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalScale.y
+ value: 1.33
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalScale.z
+ value: 1.33
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.w
+ value: 0.7071068
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.x
+ value: 0.7071068
+ objectReference: {fileID: 0}
+ - target: {fileID: 6523535316780004576, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: _size
+ value: 0.18
+ objectReference: {fileID: 0}
+ - target: {fileID: 7034454508457674463, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_Name
+ value: Slot (8)
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalPosition.x
+ value: -0.4
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalPosition.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalPosition.z
+ value: -0.2
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.w
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.z
+ value: 0
+ objectReference: {fileID: 0}
+ m_RemovedComponents: []
+ m_RemovedGameObjects: []
+ m_AddedGameObjects: []
+ m_AddedComponents: []
+ m_SourcePrefab: {fileID: 100100000, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+--- !u!4 &2374912704674468940 stripped
+Transform:
+ m_CorrespondingSourceObject: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ m_PrefabInstance: {fileID: 4865186542019747410}
+ m_PrefabAsset: {fileID: 0}
+--- !u!1001 &6041089721858203160
+PrefabInstance:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_Modification:
+ serializedVersion: 3
+ m_TransformParent: {fileID: 4433186368314570406}
+ m_Modifications:
+ - target: {fileID: 2951849760368368205, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_Radius
+ value: 0.1
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalScale.x
+ value: 1.33
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalScale.y
+ value: 1.33
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalScale.z
+ value: 1.33
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.w
+ value: 0.7071068
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.x
+ value: 0.7071068
+ objectReference: {fileID: 0}
+ - target: {fileID: 6523535316780004576, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: _size
+ value: 0.18
+ objectReference: {fileID: 0}
+ - target: {fileID: 7034454508457674463, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_Name
+ value: Slot (1)
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalPosition.x
+ value: -0.2
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalPosition.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalPosition.z
+ value: 0.2
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.w
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.z
+ value: 0
+ objectReference: {fileID: 0}
+ m_RemovedComponents: []
+ m_RemovedGameObjects: []
+ m_AddedGameObjects: []
+ m_AddedComponents: []
+ m_SourcePrefab: {fileID: 100100000, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+--- !u!4 &3505978642530898950 stripped
+Transform:
+ m_CorrespondingSourceObject: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ m_PrefabInstance: {fileID: 6041089721858203160}
+ m_PrefabAsset: {fileID: 0}
+--- !u!1001 &6500207459066028785
+PrefabInstance:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_Modification:
+ serializedVersion: 3
+ m_TransformParent: {fileID: 5958767219285650984}
+ m_Modifications:
+ - target: {fileID: 1590612086424736195, guid: 2e45e4d4621c88147b3ce7a589bc548c, type: 3}
+ propertyPath: m_Name
+ value: NameCanvas
+ objectReference: {fileID: 0}
+ - target: {fileID: 9151279884836745816, guid: 2e45e4d4621c88147b3ce7a589bc548c, type: 3}
+ propertyPath: m_Pivot.x
+ value: 0.5
+ objectReference: {fileID: 0}
+ - target: {fileID: 9151279884836745816, guid: 2e45e4d4621c88147b3ce7a589bc548c, type: 3}
+ propertyPath: m_Pivot.y
+ value: 0.5
+ objectReference: {fileID: 0}
+ - target: {fileID: 9151279884836745816, guid: 2e45e4d4621c88147b3ce7a589bc548c, type: 3}
+ propertyPath: m_AnchorMax.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 9151279884836745816, guid: 2e45e4d4621c88147b3ce7a589bc548c, type: 3}
+ propertyPath: m_AnchorMax.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 9151279884836745816, guid: 2e45e4d4621c88147b3ce7a589bc548c, type: 3}
+ propertyPath: m_AnchorMin.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 9151279884836745816, guid: 2e45e4d4621c88147b3ce7a589bc548c, type: 3}
+ propertyPath: m_AnchorMin.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 9151279884836745816, guid: 2e45e4d4621c88147b3ce7a589bc548c, type: 3}
+ propertyPath: m_SizeDelta.x
+ value: 150
+ objectReference: {fileID: 0}
+ - target: {fileID: 9151279884836745816, guid: 2e45e4d4621c88147b3ce7a589bc548c, type: 3}
+ propertyPath: m_SizeDelta.y
+ value: 25
+ objectReference: {fileID: 0}
+ - target: {fileID: 9151279884836745816, guid: 2e45e4d4621c88147b3ce7a589bc548c, type: 3}
+ propertyPath: m_LocalPosition.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 9151279884836745816, guid: 2e45e4d4621c88147b3ce7a589bc548c, type: 3}
+ propertyPath: m_LocalPosition.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 9151279884836745816, guid: 2e45e4d4621c88147b3ce7a589bc548c, type: 3}
+ propertyPath: m_LocalPosition.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 9151279884836745816, guid: 2e45e4d4621c88147b3ce7a589bc548c, type: 3}
+ propertyPath: m_LocalRotation.w
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 9151279884836745816, guid: 2e45e4d4621c88147b3ce7a589bc548c, type: 3}
+ propertyPath: m_LocalRotation.x
+ value: -0
+ objectReference: {fileID: 0}
+ - target: {fileID: 9151279884836745816, guid: 2e45e4d4621c88147b3ce7a589bc548c, type: 3}
+ propertyPath: m_LocalRotation.y
+ value: -0
+ objectReference: {fileID: 0}
+ - target: {fileID: 9151279884836745816, guid: 2e45e4d4621c88147b3ce7a589bc548c, type: 3}
+ propertyPath: m_LocalRotation.z
+ value: -0
+ objectReference: {fileID: 0}
+ - target: {fileID: 9151279884836745816, guid: 2e45e4d4621c88147b3ce7a589bc548c, type: 3}
+ propertyPath: m_AnchoredPosition.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 9151279884836745816, guid: 2e45e4d4621c88147b3ce7a589bc548c, type: 3}
+ propertyPath: m_AnchoredPosition.y
+ value: 0.5
+ objectReference: {fileID: 0}
+ - target: {fileID: 9151279884836745816, guid: 2e45e4d4621c88147b3ce7a589bc548c, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 9151279884836745816, guid: 2e45e4d4621c88147b3ce7a589bc548c, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 9151279884836745816, guid: 2e45e4d4621c88147b3ce7a589bc548c, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.z
+ value: 0
+ objectReference: {fileID: 0}
+ m_RemovedComponents: []
+ m_RemovedGameObjects: []
+ m_AddedGameObjects: []
+ m_AddedComponents: []
+ m_SourcePrefab: {fileID: 100100000, guid: 2e45e4d4621c88147b3ce7a589bc548c, type: 3}
+--- !u!224 &2651072820911968425 stripped
+RectTransform:
m_CorrespondingSourceObject: {fileID: 9151279884836745816, guid: 2e45e4d4621c88147b3ce7a589bc548c, type: 3}
m_PrefabInstance: {fileID: 6500207459066028785}
m_PrefabAsset: {fileID: 0}
---- !u!1 &5487527833069925170 stripped
-GameObject:
- m_CorrespondingSourceObject: {fileID: 1590612086424736195, guid: 2e45e4d4621c88147b3ce7a589bc548c, type: 3}
- m_PrefabInstance: {fileID: 6500207459066028785}
+--- !u!1 &5487527833069925170 stripped
+GameObject:
+ m_CorrespondingSourceObject: {fileID: 1590612086424736195, guid: 2e45e4d4621c88147b3ce7a589bc548c, type: 3}
+ m_PrefabInstance: {fileID: 6500207459066028785}
+ m_PrefabAsset: {fileID: 0}
+--- !u!1001 &6720658306400350742
+PrefabInstance:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_Modification:
+ serializedVersion: 3
+ m_TransformParent: {fileID: 4433186368314570406}
+ m_Modifications:
+ - target: {fileID: 2951849760368368205, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_Radius
+ value: 0.1
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalScale.x
+ value: 1.33
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalScale.y
+ value: 1.33
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalScale.z
+ value: 1.33
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.w
+ value: 0.7071068
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.x
+ value: 0.7071068
+ objectReference: {fileID: 0}
+ - target: {fileID: 6523535316780004576, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: _size
+ value: 0.18
+ objectReference: {fileID: 0}
+ - target: {fileID: 7034454508457674463, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_Name
+ value: Slot (0)
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalPosition.x
+ value: -0.4
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalPosition.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalPosition.z
+ value: 0.2
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.w
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.z
+ value: 0
+ objectReference: {fileID: 0}
+ m_RemovedComponents: []
+ m_RemovedGameObjects: []
+ m_AddedGameObjects: []
+ m_AddedComponents: []
+ m_SourcePrefab: {fileID: 100100000, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+--- !u!4 &4482608820626094088 stripped
+Transform:
+ m_CorrespondingSourceObject: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ m_PrefabInstance: {fileID: 6720658306400350742}
+ m_PrefabAsset: {fileID: 0}
+--- !u!1001 &7158815164180090538
+PrefabInstance:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_Modification:
+ serializedVersion: 3
+ m_TransformParent: {fileID: 4433186368314570406}
+ m_Modifications:
+ - target: {fileID: 2951849760368368205, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_Radius
+ value: 0.1
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalScale.x
+ value: 1.33
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalScale.y
+ value: 1.33
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalScale.z
+ value: 1.33
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.w
+ value: 0.7071068
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.x
+ value: 0.7071068
+ objectReference: {fileID: 0}
+ - target: {fileID: 6523535316780004576, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: _size
+ value: 0.18
+ objectReference: {fileID: 0}
+ - target: {fileID: 7034454508457674463, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_Name
+ value: Slot (7)
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalPosition.x
+ value: 0.2
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalPosition.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalPosition.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.w
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.z
+ value: 0
+ objectReference: {fileID: 0}
+ m_RemovedComponents: []
+ m_RemovedGameObjects: []
+ m_AddedGameObjects: []
+ m_AddedComponents: []
+ m_SourcePrefab: {fileID: 100100000, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+--- !u!4 &11478428076491956 stripped
+Transform:
+ m_CorrespondingSourceObject: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ m_PrefabInstance: {fileID: 7158815164180090538}
+ m_PrefabAsset: {fileID: 0}
+--- !u!1001 &7461289452602374676
+PrefabInstance:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_Modification:
+ serializedVersion: 3
+ m_TransformParent: {fileID: 4433186368314570406}
+ m_Modifications:
+ - target: {fileID: 2951849760368368205, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_Radius
+ value: 0.1
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalScale.x
+ value: 1.33
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalScale.y
+ value: 1.33
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalScale.z
+ value: 1.33
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.w
+ value: 0.7071068
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.x
+ value: 0.7071068
+ objectReference: {fileID: 0}
+ - target: {fileID: 6523535316780004576, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: _size
+ value: 0.18
+ objectReference: {fileID: 0}
+ - target: {fileID: 7034454508457674463, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_Name
+ value: Slot (11)
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalPosition.x
+ value: 0.2
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalPosition.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalPosition.z
+ value: -0.2
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.w
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.z
+ value: 0
+ objectReference: {fileID: 0}
+ m_RemovedComponents: []
+ m_RemovedGameObjects: []
+ m_AddedGameObjects: []
+ m_AddedComponents: []
+ m_SourcePrefab: {fileID: 100100000, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+--- !u!4 &358648452475629578 stripped
+Transform:
+ m_CorrespondingSourceObject: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ m_PrefabInstance: {fileID: 7461289452602374676}
+ m_PrefabAsset: {fileID: 0}
+--- !u!1001 &7655181781611782614
+PrefabInstance:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_Modification:
+ serializedVersion: 3
+ m_TransformParent: {fileID: 4433186368314570406}
+ m_Modifications:
+ - target: {fileID: 2951849760368368205, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_Radius
+ value: 0.1
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalScale.x
+ value: 1.33
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalScale.y
+ value: 1.33
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalScale.z
+ value: 1.33
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.w
+ value: 0.7071068
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.x
+ value: 0.7071068
+ objectReference: {fileID: 0}
+ - target: {fileID: 6523535316780004576, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: _size
+ value: 0.18
+ objectReference: {fileID: 0}
+ - target: {fileID: 7034454508457674463, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_Name
+ value: Slot (5)
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalPosition.x
+ value: -0.2
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalPosition.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalPosition.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.w
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.z
+ value: 0
+ objectReference: {fileID: 0}
+ m_RemovedComponents: []
+ m_RemovedGameObjects: []
+ m_AddedGameObjects: []
+ m_AddedComponents: []
+ m_SourcePrefab: {fileID: 100100000, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+--- !u!4 &670284975210572744 stripped
+Transform:
+ m_CorrespondingSourceObject: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ m_PrefabInstance: {fileID: 7655181781611782614}
+ m_PrefabAsset: {fileID: 0}
+--- !u!1001 &8718044975475590727
+PrefabInstance:
+ m_ObjectHideFlags: 0
+ serializedVersion: 2
+ m_Modification:
+ serializedVersion: 3
+ m_TransformParent: {fileID: 4433186368314570406}
+ m_Modifications:
+ - target: {fileID: 2951849760368368205, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_Radius
+ value: 0.1
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalScale.x
+ value: 1.33
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalScale.y
+ value: 1.33
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalScale.z
+ value: 1.33
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.w
+ value: 0.7071068
+ objectReference: {fileID: 0}
+ - target: {fileID: 6494516477512632141, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.x
+ value: 0.7071068
+ objectReference: {fileID: 0}
+ - target: {fileID: 6523535316780004576, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: _size
+ value: 0.18
+ objectReference: {fileID: 0}
+ - target: {fileID: 7034454508457674463, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_Name
+ value: Slot (3)
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalPosition.x
+ value: 0.2
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalPosition.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalPosition.z
+ value: 0.2
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.w
+ value: 1
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalRotation.z
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.x
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.y
+ value: 0
+ objectReference: {fileID: 0}
+ - target: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ propertyPath: m_LocalEulerAnglesHint.z
+ value: 0
+ objectReference: {fileID: 0}
+ m_RemovedComponents: []
+ m_RemovedGameObjects: []
+ m_AddedGameObjects: []
+ m_AddedComponents: []
+ m_SourcePrefab: {fileID: 100100000, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+--- !u!4 &1985322522373786713 stripped
+Transform:
+ m_CorrespondingSourceObject: {fileID: 7165789852774304286, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
+ m_PrefabInstance: {fileID: 8718044975475590727}
m_PrefabAsset: {fileID: 0}
diff --git a/Assets/Gothic-VR/Resources/VR/Prefabs/Vobs/oCNpc.prefab b/Assets/Gothic-VR/Resources/VR/Prefabs/Vobs/oCNpc.prefab
index c6c9198ea..6f72a9c72 100644
--- a/Assets/Gothic-VR/Resources/VR/Prefabs/Vobs/oCNpc.prefab
+++ b/Assets/Gothic-VR/Resources/VR/Prefabs/Vobs/oCNpc.prefab
@@ -163,6 +163,7 @@ MonoBehaviour:
m_Name:
m_EditorClassIdentifier: Gothic.VR::Gothic.VR.Adapters.VRNpcLoot
_socketPrefab: {fileID: 5861164055357080340, guid: 2dd29fe4a7e819740af535267b7cc113, type: 3}
+ _slotPrefab: {fileID: 7034454508457674463, guid: e970795bd5895ed4d8a7686f050c5832, type: 3}
--- !u!1 &2815092147823170342
GameObject:
m_ObjectHideFlags: 0
diff --git a/Assets/Gothic-VR/Scripts/Adapters/VRNpcLoot.cs b/Assets/Gothic-VR/Scripts/Adapters/VRNpcLoot.cs
index 9f62cb045..fe5f10401 100644
--- a/Assets/Gothic-VR/Scripts/Adapters/VRNpcLoot.cs
+++ b/Assets/Gothic-VR/Scripts/Adapters/VRNpcLoot.cs
@@ -8,6 +8,7 @@
using Gothic.Core.Extensions;
using Gothic.Core.Manager;
using Gothic.Core.Models.Container;
+using Gothic.Core.Models.Context;
using Gothic.Core.Models.Vm;
using Gothic.Core.Models.Vob;
using Gothic.Core.Services;
@@ -33,8 +34,14 @@ public class VRNpcLoot : MonoBehaviour
private const float SocketHeight = 0.8f;
private const float SocketSpacing = 0.22f;
+ [Tooltip("Loot slot on the HVR backend (HVR socket).")]
[SerializeField] private GameObject _socketPrefab;
+ [Tooltip("Loot slot on the other backends (VrSocketSlot, e.g. \"VR Socket Slot.prefab\" for XRI).")]
+ [SerializeField] private GameObject _slotPrefab;
+
+ [Inject] private readonly IVrBackend _vrBackend;
+
[Inject] private readonly NpcInventoryService _npcInventoryService;
[Inject] private readonly VobService _vobService;
[Inject] private readonly AudioService _audioService;
@@ -108,10 +115,13 @@ private void PlayOpenSound()
private void CreateSockets()
{
var totalWidth = (MaxVisibleSlots - 1) * SocketSpacing;
+ var prefab = _vrBackend == null || _vrBackend.Kind == VrInteractionBackend.Hvr
+ ? _socketPrefab
+ : _slotPrefab;
for (var i = 0; i < MaxVisibleSlots; i++)
{
- var socketGo = Instantiate(_socketPrefab, transform);
+ var socketGo = Instantiate(prefab, transform);
var xOffset = -totalWidth / 2f + i * SocketSpacing;
socketGo.transform.localPosition = new Vector3(xOffset, SocketHeight, 0f);
socketGo.transform.localRotation = Quaternion.identity;
diff --git a/Assets/Gothic-VR/Scripts/Adapters/Vob/Container/VRVobContainerSocketInventory.cs b/Assets/Gothic-VR/Scripts/Adapters/Vob/Container/VRVobContainerSocketInventory.cs
index 5b021549f..274c5bef2 100644
--- a/Assets/Gothic-VR/Scripts/Adapters/Vob/Container/VRVobContainerSocketInventory.cs
+++ b/Assets/Gothic-VR/Scripts/Adapters/Vob/Container/VRVobContainerSocketInventory.cs
@@ -13,6 +13,8 @@ namespace Gothic.VR.Adapters.Vob.Container
///
/// Handle Socket-events for a whole Container (e.g., chest) and its corresponding sockets (rings where we put items into).
/// Plays the weapon (un)draw sound when a weapon is put into or taken out of a socket.
+ /// No sound is played while the IVrSocketContainer on this GameObject (if any) is silent, e.g. while a chest
+ /// spawns its content.
///
public class VRVobContainerSocketInventory : MonoBehaviour
{
@@ -23,9 +25,11 @@ public class VRVobContainerSocketInventory : MonoBehaviour
[SerializeField] private GameObject[] _additionalSockets;
private readonly List _sockets = new();
+ private IVrSocketContainer _container;
private void Awake()
{
+ _container = GetComponent();
_sockets.AddRange(GetComponentsInChildren(true));
foreach (var socketGo in _additionalSockets)
{
@@ -51,7 +55,7 @@ private void OnDestroy()
private void OnBeforeGrabbed(VrGrabArgs args)
{
- if (args.Interactable == null)
+ if (args.Interactable == null || IsSilent)
return;
var container = args.Interactable.GetComponentInParent()?.Container;
@@ -62,7 +66,7 @@ private void OnBeforeGrabbed(VrGrabArgs args)
private void OnReleased(VrGrabArgs args)
{
- if (args.Interactable == null)
+ if (args.Interactable == null || IsSilent)
return;
var container = args.Interactable.GetComponentInParent()?.Container;
@@ -71,6 +75,8 @@ private void OnReleased(VrGrabArgs args)
_vrWeaponService.PlayDrawSound(container);
}
+ private bool IsSilent => _container != null && _container.IsSilent;
+
private bool IsWeapon(VobContainer container)
{
var itemInstance = container?.GetItemInstance();
diff --git a/Assets/Gothic-VR/Scripts/Adapters/Vob/LockPicking/VRContainerDoorPickingInteraction.cs b/Assets/Gothic-VR/Scripts/Adapters/Vob/LockPicking/VRContainerDoorPickingInteraction.cs
index 495250201..857ffd190 100644
--- a/Assets/Gothic-VR/Scripts/Adapters/Vob/LockPicking/VRContainerDoorPickingInteraction.cs
+++ b/Assets/Gothic-VR/Scripts/Adapters/Vob/LockPicking/VRContainerDoorPickingInteraction.cs
@@ -8,6 +8,7 @@
using Gothic.Core.Services.Vm;
using Gothic.VR.Services;
using Gothic.VR.Adapters.Vob.VobItem;
+using Gothic.VR.Interaction.Components;
using Gothic.VR.Interaction.Models;
using Gothic.VR.Interaction.Ports;
using Reflex.Attributes;
@@ -52,8 +53,8 @@ private void Start()
{
var vobLoader = GetComponentInParent();
_lockable = vobLoader.Container;
- // Every door and chest has exactly one hinge (the door wing or the chest lid).
- _hinge = vobLoader.GetComponentInChildren(true);
+ // Every door and chest has one hinge (the door wing or the chest lid) per backend which supports it.
+ _hinge = VrHinges.FindActive(vobLoader);
switch (_lockable.Vob)
{
case IDoor door:
@@ -86,7 +87,7 @@ private IEnumerator StartDelayed()
yield return null;
// Deactivate rotation
- _hinge.Lock();
+ _hinge?.Lock();
}
private void OnTriggerEnter(Collider other)
@@ -235,6 +236,12 @@ private void TryUnlockWithKey(Collider other)
private void UnlockAndPushOpen()
{
// Reactivate rotation
+ if (_hinge == null)
+ {
+ gameObject.SetActive(false);
+ return;
+ }
+
_hinge.Unlock();
// Apply force in the door's forward direction (world space)
diff --git a/Assets/Gothic-VR/Scripts/Adapters/Vob/VRVobContainer.cs b/Assets/Gothic-VR/Scripts/Adapters/Vob/VRVobContainer.cs
index e617d160d..e96a5a0ae 100644
--- a/Assets/Gothic-VR/Scripts/Adapters/Vob/VRVobContainer.cs
+++ b/Assets/Gothic-VR/Scripts/Adapters/Vob/VRVobContainer.cs
@@ -7,7 +7,7 @@
using Gothic.Core.Logging;
using Gothic.Core.Manager;
using Gothic.Core.Services.Caches;
-using Gothic.VR.Interaction.Ports;
+using Gothic.VR.Interaction.Components;
using Reflex.Attributes;
using UnityEngine;
using UnityEngine.SceneManagement;
@@ -74,8 +74,8 @@ private void PrepareSounds(IContainer vobContainer)
}
// We leverage the same "door" script for containers (As it's also just an object to be rotated.
- var hinge = GetComponentInChildren();
- hinge.SetSounds(_containerOpenedClips[mdsName.ToLower()], _containerClosedClips[mdsName.ToLower()]);
+ var hinge = VrHinges.FindActive(this);
+ hinge?.SetSounds(_containerOpenedClips[mdsName.ToLower()], _containerClosedClips[mdsName.ToLower()]);
}
}
}
diff --git a/Assets/Gothic-VR/Scripts/Adapters/Vob/VRVobDoor.cs b/Assets/Gothic-VR/Scripts/Adapters/Vob/VRVobDoor.cs
index a7a33f233..e5e8d8973 100644
--- a/Assets/Gothic-VR/Scripts/Adapters/Vob/VRVobDoor.cs
+++ b/Assets/Gothic-VR/Scripts/Adapters/Vob/VRVobDoor.cs
@@ -5,7 +5,7 @@
using Gothic.Core.Services.Caches;
using Gothic.Core;
using Gothic.Core.Extensions;
-using Gothic.VR.Interaction.Ports;
+using Gothic.VR.Interaction.Components;
using Reflex.Attributes;
using UnityEngine;
using ZenKit.Vobs;
@@ -64,8 +64,8 @@ private void PrepareSounds(IDoor props)
_doorClosedClips.Add(mdsName.ToLower(), _audioService.GetRandomSoundClip(closeSoundEffect));
}
- var hinge = GetComponentInChildren();
- hinge.SetSounds(_doorOpenedClips[mdsName.ToLower()], _doorClosedClips[mdsName.ToLower()]);
+ var hinge = VrHinges.FindActive(this);
+ hinge?.SetSounds(_doorOpenedClips[mdsName.ToLower()], _doorClosedClips[mdsName.ToLower()]);
}
}
}
diff --git a/Assets/Gothic-VR/Scripts/Interaction/Backends/Hvr/HvrBackend.cs b/Assets/Gothic-VR/Scripts/Interaction/Backends/Hvr/HvrBackend.cs
index 35bc8c9ef..dbd0eab26 100644
--- a/Assets/Gothic-VR/Scripts/Interaction/Backends/Hvr/HvrBackend.cs
+++ b/Assets/Gothic-VR/Scripts/Interaction/Backends/Hvr/HvrBackend.cs
@@ -1,4 +1,5 @@
#if GOTHIC_HVR_INSTALLED
+using Gothic.Core.Models.Context;
using Gothic.VR.Interaction.Ports;
using Reflex.Core;
@@ -7,6 +8,7 @@ namespace Gothic.VR.Interaction.Backends.Hvr
public class HvrBackend : IVrBackend
{
public string Name => "HurricaneVR";
+ public VrInteractionBackend Kind => VrInteractionBackend.Hvr;
public void InstallBindings(ContainerBuilder containerBuilder)
{
diff --git a/Assets/Gothic-VR/Scripts/Interaction/Backends/Hvr/HvrHingeBridge.cs b/Assets/Gothic-VR/Scripts/Interaction/Backends/Hvr/HvrHingeBridge.cs
index e0d4d3c87..a144ed501 100644
--- a/Assets/Gothic-VR/Scripts/Interaction/Backends/Hvr/HvrHingeBridge.cs
+++ b/Assets/Gothic-VR/Scripts/Interaction/Backends/Hvr/HvrHingeBridge.cs
@@ -1,6 +1,7 @@
#if GOTHIC_HVR_INSTALLED
using Gothic.VR.Interaction.Ports;
using HurricaneVR.Framework.Components;
+using Reflex.Attributes;
using UnityEngine;
namespace Gothic.VR.Interaction.Backends.Hvr
@@ -10,6 +11,8 @@ namespace Gothic.VR.Interaction.Backends.Hvr
///
public class HvrHingeBridge : MonoBehaviour, IVrHinge
{
+ [Inject] private readonly IVrBackend _vrBackend;
+
private HVRPhysicsDoor _door;
private HVRPhysicsDoor Door
@@ -22,6 +25,7 @@ private HVRPhysicsDoor Door
}
}
+ public bool IsActive => _vrBackend == null || _vrBackend is HvrBackend;
public Transform Transform => transform;
public Rigidbody Rigidbody => GetComponent();
diff --git a/Assets/Gothic-VR/Scripts/Interaction/Backends/Hvr/HvrPhysicsChest.cs b/Assets/Gothic-VR/Scripts/Interaction/Backends/Hvr/HvrPhysicsChest.cs
index 183b9f351..ab6becfa1 100644
--- a/Assets/Gothic-VR/Scripts/Interaction/Backends/Hvr/HvrPhysicsChest.cs
+++ b/Assets/Gothic-VR/Scripts/Interaction/Backends/Hvr/HvrPhysicsChest.cs
@@ -1,83 +1,45 @@
#if GOTHIC_HVR_INSTALLED
-using System;
-using System.Collections;
-using System.Collections.Generic;
-using System.Linq;
-using Gothic.Core.Adapters.Vob;
-using Gothic.Core;
-using Gothic.Core.Extensions;
using Gothic.Core.Logging;
-using Gothic.Core.Models.Caches;
-using Gothic.Core.Models.Container;
-using Gothic.Core.Services.Caches;
-using Gothic.Core.Services.Meshes;
-using Gothic.Core.Services.Vobs;
using Gothic.VR.Interaction.Components;
using Gothic.VR.Interaction.Ports;
using HurricaneVR.Framework.Components;
-using HurricaneVR.Framework.Core;
-using HurricaneVR.Framework.Core.Sockets;
-using MyBox;
using Reflex.Attributes;
-using UnityEngine;
-using ZenKit.Daedalus;
-using ZenKit.Vobs;
using Logger = Gothic.Core.Logging.Logger;
namespace Gothic.VR.Interaction.Backends.Hvr
{
///
- /// Chest lid (HVR physics door) which fills the chest's sockets with its content when opened for the first time.
- /// Temporarily in the HVR backend as it subclasses HVRPhysicsDoor. The sockets are used via IVrSocketContainer.
+ /// Chest lid (HVR physics door). Opening it shows the chest's slots (VrChestSlots, which spawns the content on
+ /// the first open), closing it hides them.
+ /// Temporarily in the HVR backend as it subclasses HVRPhysicsDoor (VrHinge in Phase 4). On other backends it
+ /// switches itself off before the door is set up (VrChestLidToggle is the lid there).
///
public class HvrPhysicsChest : HVRPhysicsDoor
{
- [Inject] private readonly MeshService _meshService;
- [Inject] private readonly VobService _vobService;
- [Inject] private readonly ResourceCacheService _resourceCacheService;
+ [Inject] private readonly IVrBackend _vrBackend;
-
- private readonly char[] _itemNameSeparators = { ';', ',' };
- private readonly char[] _itemCountSeparators = { ':', '.' };
-
- // Need to be updated if ocMobContainer.prefab is changed.
- private const int _socketRows = 3;
- private const int _socketsPerRow = 4;
- private const float _socketRadius = 0.1f;
- private const float _socketCollectionMargin = _socketRadius / 2;
-
- [Separator("Gothic - Settings")]
- [SerializeField] private GameObject _rootGo;
- [SerializeField] private HVRSocketContainer _socketContainer;
- [SerializeField] private BoxCollider _collectorCollider;
- private IContainer _vobContainer;
- private IVrSocketContainer _sockets;
+ private VrChestSlots _chestSlots;
// Flags to ensure we always call On*() once, everytime open/close status changes.
- private bool _openingForTheFirstTime = true;
private bool _onOpenedHandled;
private bool _onClosedHandled;
-
-
- [Serializable]
- [Obsolete("Moved to Gothic.Core.Data.Vobs.ContentItem")]
- public struct ContentItem
- {
- public string Name;
- public int Amount;
- }
-
-
+
+
public override void Start()
{
+ if (_vrBackend != null && _vrBackend is not HvrBackend)
+ {
+ enabled = false;
+ return;
+ }
+
base.Start();
- _sockets = _socketContainer.GetComponent();
- _socketContainer.gameObject.SetActive(false);
-
- _vobContainer = _rootGo.GetComponentInParent().Container.VobAs();
+ _chestSlots = GetComponentInParent();
+ if (_chestSlots == null)
+ Logger.LogError($"[HVR] Chest lid {name} has no VrChestSlots in its parents.", LogCat.VR);
}
-
+
protected override void Update()
{
base.Update();
@@ -92,238 +54,24 @@ protected override void Update()
OnClosed();
}
}
-
+
private void OnOpened()
{
- if (_openingForTheFirstTime)
- {
- AlignSockets();
- StartCoroutine(InitializeContent());
- _openingForTheFirstTime = false;
- }
-
- // Render items if opened for the first time.
- _socketContainer.gameObject.SetActive(true);
-
+ if (_chestSlots != null)
+ _chestSlots.Open();
+
_onOpenedHandled = true;
_onClosedHandled = false;
}
-
+
private void OnClosed()
{
- _socketContainer.gameObject.SetActive(false);
-
+ if (_chestSlots != null)
+ _chestSlots.Close();
+
_onOpenedHandled = false;
_onClosedHandled = true;
}
-
- ///
- /// Containers have different sizes. Re-align the prefab's HVR sockets to match their actual sizes.
- ///
- private void AlignSockets()
- {
- var sockets = _sockets.Sockets;
-
- // We need to dynamically fetch the bounding box of main mesh as some chests have the correct one inside BIP01 "CHEST_*_0" and others inside "ZM_CHEST*"
- var meshFilters = _rootGo
- .GetComponentsInChildren() // Find all meshes
- .Where(i => !i.TryGetComponent(typeof(HVRGrabbable), out _)) // Filter out meshe, which is the lid
- .Where(i => i.gameObject.name.StartsWithIgnoreCase("ZM_") || i.gameObject.name.StartsWithIgnoreCase("BIP01")) // Use Gothic elements only. Ignore elements like HVR sockets.
- .Where(i => !i.gameObject.name.ContainsIgnoreCase("LOCK")) // Ignore lock element
- .ToArray();
-
- MeshFilter usedMesh;
- if (meshFilters.IsEmpty())
- {
- Logger.LogError($"No suitable mesh found for HVR Socket size calculation in {_rootGo.name}. Skipping...", LogCat.VR);
- return;
- }
- else if (meshFilters.Length >= 2)
- {
- Logger.LogWarning($"More than one feasible MeshFilter for HVR Socket size calculation found in {_rootGo.name}. Leveraging first (1)ZM_* or (2)BIP01 one.", LogCat.VR);
-
- // Based on mesh check of all containers in G1, the highest priority for the right mesh is a ZM_* GO if existing.
- var zmMesh = meshFilters.FirstOrDefault(i => i.gameObject.name.StartsWithIgnoreCase("ZM_"));
- usedMesh = zmMesh ?? meshFilters.First();
- }
- else
- {
- usedMesh = meshFilters.First();
- }
-
- var mainMeshBounds = usedMesh!.sharedMesh.bounds;
-
- // Set collectorCollider's size to perfectly align with container.
- _collectorCollider.size = new Vector3(mainMeshBounds.size.x, _collectorCollider.size.y, mainMeshBounds.size.z);
-
- // Move all Slots nearly towards height of container (*1,5 == 75% close to top).
- _socketContainer.transform.localPosition = new (0, mainMeshBounds.center.y * 1.5f, 0);
-
- var centeredMainBound = new Bounds(Vector3.zero, mainMeshBounds.size);
-
- // Align all sockets in row+column based on actual sizes.
- var rowWidth = (centeredMainBound.size.x - 2*_socketCollectionMargin) / _socketsPerRow;
- var rowDepth = (centeredMainBound.size.z - 2*_socketCollectionMargin) / _socketRows;
-
- // Calculate center of a grid-element for a socket ring entry.
- var middleAlignmentX = (rowWidth - _socketRadius * 2) / 2;
- var middleAlignmentZ = (rowDepth - _socketRadius * 2) / 2;
-
- // Loop variables
- var currentRow = 0;
- var currentColumn = 0;
-
- foreach (var socket in sockets)
- {
- // Calculation
- // _socketCollectionMargin - Left aligned margin for the whole collection
- // _socketRadius - Location is based on a 50% shift into the desired area as the drawing of a circle starts centered
- // middleAlignment* - Centered location within a grid for an element
- // min.x - Start point to calculate from left top
- socket.Transform.localPosition = new (
- _socketCollectionMargin + _socketRadius + middleAlignmentX + centeredMainBound.min.x + rowWidth * currentColumn,
- 0,
- _socketCollectionMargin + _socketRadius + middleAlignmentZ + centeredMainBound.min.z + rowDepth * currentRow
- );
-
- currentColumn++;
- if (currentColumn >= _socketsPerRow)
- {
- currentColumn = 0;
- currentRow++;
- }
- }
- }
-
- private IEnumerator InitializeContent()
- {
- var contents = _vobContainer.Contents;
-
- if (string.IsNullOrEmpty(contents))
- {
- yield break;
- }
-
- var contentItems = ParseContent(contents);
-
- PreSpawnContent(out AudioClip grabAudio, out AudioClip releaseAudio);
- yield return SpawnContent(contentItems);
- yield return PostSpawnContent(grabAudio, releaseAudio);
- }
-
- private List ParseContent(string contents)
- {
- List result = new();
-
- var items = contents.Split(_itemNameSeparators);
-
- foreach (var item in items)
- {
- var count = 1;
- var nameCountSplit = item.Split(_itemCountSeparators);
-
- if (nameCountSplit.Length != 1)
- {
- count = int.Parse(nameCountSplit[1]);
- }
-
- result.Add(new ContentItem
- {
- Name = nameCountSplit[0],
- Amount = count
- });
- }
-
- return result;
- }
-
-
- ///
- /// When we spawn items later, they will be automatically collected by the HVR Collector. It will put their meshes
- /// into place. But it will also play an audio file. We will temporarily remove this file until we're done adding the items.
- ///
- private void PreSpawnContent(out AudioClip grabAudio, out AudioClip releaseAudio)
- {
- // We assume that all Slots have the same sound. Therefore fetching first only.
- var firstSocket = _sockets.Sockets.First();
- grabAudio = firstSocket.PlacedSoundFallback;
- releaseAudio = firstSocket.RemovedSoundFallback;
-
- foreach (var socket in _sockets.Sockets)
- {
- socket.PlacedSoundFallback = null;
- socket.RemovedSoundFallback = null;
- }
- }
-
- private IEnumerator SpawnContent(List contentItems)
- {
- var sockets = _sockets.Sockets;
-
- if (contentItems.Count > sockets.Count)
- {
- Logger.LogError("There are more items in a container than HVRSockets available. Please implement pagination to ensure everything is visible and can be grabbed!", LogCat.VR);
- }
-
- for (var i = 0; i < Math.Min(contentItems.Count, sockets.Count); i++)
- {
- var currentItem = contentItems[i];
-
- var zkVob = new Item
- {
- Name = currentItem.Name,
- Amount = currentItem.Amount,
- Visual = new VisualMesh
- {
- Name = currentItem.Name
- }
- };
-
- var vobContainer = _vobService.CreateItem(zkVob);
-
- // Wait 1 frame to ensure our mesh bounds can be calculated by HVR Socket.
- yield return null;
-
- PlaceObjectIntoContainer(vobContainer);
- }
- }
-
- private void PlaceObjectIntoContainer(VobContainer vobContainer)
- {
- var interactable = vobContainer.Go.GetComponentInChildren(true);
- if (_sockets.TryFindFree(interactable, out var socket))
- {
- socket.TryPlace(interactable, true);
- // We need to reset position as the element won't be placed inside it's parent in the chest.
- vobContainer.Go.transform.localPosition = Vector3.zero;
- }
- }
-
- private IEnumerator PostSpawnContent(AudioClip grabAudio, AudioClip releaseAudio)
- {
- // We wait for some time to ensure the objects are automatically snapped into place.
- yield return new WaitForSeconds(1f);
-
- foreach (var socket in _sockets.Sockets)
- {
- socket.PlacedSoundFallback = grabAudio;
- socket.RemovedSoundFallback = releaseAudio;
- }
- }
-
- ///
- /// FIXME - Only temporary function. In the future we need to create a new Item to use it (e.g.) for saving later.
- /// FIXME - For now we stick with the mesh without properties only.
- /// 1. Create a new ZenKit.Vob.Item object
- /// 2. Call VobCreator.CreateItem(vob, ...)
- ///
- private GameObject TempCreateItem(ItemInstance itemInstance)
- {
- var go = _resourceCacheService.TryGetPrefabObject(PrefabType.VobItem);
-
- var mrm = _resourceCacheService.TryGetMultiResolutionMesh(itemInstance.Visual);
- return _meshService.CreateVob(itemInstance.Name, mrm, default, default, true, rootGo: go, useTextureArray: false);
- }
}
}
#endif
diff --git a/Assets/Gothic-VR/Scripts/Interaction/Backends/Hvr/HvrSocketContainerBridge.cs b/Assets/Gothic-VR/Scripts/Interaction/Backends/Hvr/HvrSocketContainerBridge.cs
index ab571cff9..26c5cebaf 100644
--- a/Assets/Gothic-VR/Scripts/Interaction/Backends/Hvr/HvrSocketContainerBridge.cs
+++ b/Assets/Gothic-VR/Scripts/Interaction/Backends/Hvr/HvrSocketContainerBridge.cs
@@ -5,6 +5,7 @@
using Gothic.VR.Interaction.Ports;
using HurricaneVR.Framework.Core;
using HurricaneVR.Framework.Core.Sockets;
+using Reflex.Attributes;
using UnityEngine;
using Logger = Gothic.Core.Logging.Logger;
@@ -15,6 +16,8 @@ namespace Gothic.VR.Interaction.Backends.Hvr
///
public class HvrSocketContainerBridge : MonoBehaviour, IVrSocketContainer
{
+ [Inject] private readonly IVrBackend _vrBackend;
+
private HVRSocketContainer _container;
private readonly Dictionary _savedSounds = new();
private bool _isSilent;
@@ -29,6 +32,9 @@ private HVRSocketContainer Container
}
}
+ public bool IsActive => _vrBackend == null || _vrBackend is HvrBackend;
+ public bool IsSilent => _isSilent;
+
public IReadOnlyList Sockets
{
get
diff --git a/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriBackend.cs b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriBackend.cs
index 7efb2f32d..dde1666ea 100644
--- a/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriBackend.cs
+++ b/Assets/Gothic-VR/Scripts/Interaction/Backends/Xri/XriBackend.cs
@@ -1,4 +1,5 @@
using Gothic.Core.Logging;
+using Gothic.Core.Models.Context;
using Gothic.VR.Interaction.Ports;
using Reflex.Core;
using Logger = Gothic.Core.Logging.Logger;
@@ -11,19 +12,21 @@ namespace Gothic.VR.Interaction.Backends.Xri
/// with ScreenFade/WallFade on its camera), the XR Interaction Simulator and item grabbing (Near-Far interactor
/// per hand, GothicGrabInteractable + XriInteractableBridge on oCItem), using mobs/NPCs and the socket core
/// (VrSocketSlot + XriSocketBridge, "VR Socket Slot.prefab"), the backpack ("BackPack XRI.prefab") on the
- /// shoulder and the hip/shoulder holsters (VrBodyAnchor "Shoulders"/"Waist" on the rig).
- /// Missing: chests/NPC loot (3c), doors/chests/ladders (4) and hands (5).
+ /// shoulder and the hip/shoulder holsters (VrBodyAnchor "Shoulders"/"Waist" on the rig), chest slots
+ /// (VrChestSlots, lid opened by using it: VrChestLidToggle) and NPC loot slots.
+ /// Missing: physical doors/chest lids/ladders (4) and hands (5).
///
public class XriBackend : IVrBackend
{
public string Name => "XR Interaction Toolkit";
+ public VrInteractionBackend Kind => VrInteractionBackend.Xri;
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, grabbing (items, mobs, NPCs), the " +
- "backpack and holsters work. Chests/NPC loot (phase 3c), doors/chests/ladders (4) and " +
- "hands (5) are missing.", LogCat.VR);
+ "backpack, holsters, chest slots (lid opens by using it) and NPC loot work. " +
+ "Physical doors/chest lids/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/Components/VrChestLidToggle.cs b/Assets/Gothic-VR/Scripts/Interaction/Components/VrChestLidToggle.cs
new file mode 100644
index 000000000..5a0e0dfbf
--- /dev/null
+++ b/Assets/Gothic-VR/Scripts/Interaction/Components/VrChestLidToggle.cs
@@ -0,0 +1,162 @@
+using System.Collections;
+using Gothic.Core.Logging;
+using Gothic.Core.Models.Context;
+using Gothic.VR.Interaction.Models;
+using Gothic.VR.Interaction.Ports;
+using Reflex.Attributes;
+using UnityEngine;
+using Logger = Gothic.Core.Logging.Logger;
+
+namespace Gothic.VR.Interaction.Components
+{
+ ///
+ /// Interim chest lid for the XRI backend until Phase 4 (VrHinge): using the lid (select-only grab, like a mob)
+ /// swings it open and shows the chest's slots (VrChestSlots), using it again closes it. The lid is kinematic,
+ /// there is no physical pushing/pulling yet. Respects Lock()/Unlock() of the lock picking and plays the
+ /// open/close sounds of VRVobContainer.
+ /// Inactive on HVR, where HvrPhysicsChest (HVR physics door) is the lid.
+ ///
+ public class VrChestLidToggle : MonoBehaviour, IVrHinge
+ {
+ [Tooltip("Rotation around the lid's local X axis when open (degrees).")]
+ [SerializeField] private float _openAngle = 110f;
+
+ [Tooltip("Seconds the lid needs to swing open or closed.")]
+ [SerializeField] private float _swingTime = 0.4f;
+
+ [Inject] private readonly IVrBackend _vrBackend;
+ [Inject] private readonly IVrSfxPlayer _sfxPlayer;
+
+ private VrInteractable _interactable;
+ private VrChestSlots _chestSlots;
+ private Rigidbody _rigidbody;
+ private Quaternion _closedRotation;
+ private AudioClip _openedClip;
+ private AudioClip _closedClip;
+ private Coroutine _swingRoutine;
+ private bool _isSubscribed;
+ private bool _isLocked;
+ private bool _isOpen;
+
+ public bool IsActive => _vrBackend != null && _vrBackend.Kind == VrInteractionBackend.Xri;
+ public bool IsOpen => _isOpen;
+ public bool IsLocked => _isLocked;
+ public Transform Transform => transform;
+ public Rigidbody Rigidbody => GetComponent();
+
+ private void Start()
+ {
+ if (!IsActive)
+ {
+ enabled = false;
+ return;
+ }
+
+ // No joint holds the lid (HvrPhysicsChest doesn't set up its door on XRI).
+ _rigidbody = GetComponent();
+ if (_rigidbody != null)
+ _rigidbody.isKinematic = true;
+
+ _closedRotation = transform.localRotation;
+ _chestSlots = GetComponentInParent();
+ _interactable = GetComponent();
+ if (_interactable == null || _chestSlots == null)
+ {
+ Logger.LogError($"[Chest] {name} needs a VrInteractable and a VrChestSlots in its parents.",
+ LogCat.VR);
+ return;
+ }
+
+ _interactable.Grabbed += OnGrabbed;
+ _isSubscribed = true;
+ }
+
+ private void OnDestroy()
+ {
+ if (_isSubscribed && _interactable != null)
+ _interactable.Grabbed -= OnGrabbed;
+ }
+
+ public void Lock()
+ {
+ _isLocked = true;
+ }
+
+ public void Unlock()
+ {
+ _isLocked = false;
+ }
+
+ public void SetSounds(AudioClip opened, AudioClip closed)
+ {
+ _openedClip = opened;
+ _closedClip = closed;
+ }
+
+ public void Toggle()
+ {
+ if (_isOpen)
+ Close();
+ else
+ Open();
+ }
+
+ public void Open()
+ {
+ if (_isOpen || !isActiveAndEnabled)
+ return;
+
+ if (_isLocked)
+ {
+ Logger.Log($"[Chest] {name} is locked.", LogCat.VR);
+ return;
+ }
+
+ _isOpen = true;
+ Swing(_closedRotation * Quaternion.Euler(_openAngle, 0, 0), _openedClip);
+ _chestSlots.Open();
+ }
+
+ public void Close()
+ {
+ if (!_isOpen || !isActiveAndEnabled)
+ return;
+
+ _isOpen = false;
+ _chestSlots.Close();
+ Swing(_closedRotation, _closedClip);
+ }
+
+ private void OnGrabbed(VrGrabArgs args)
+ {
+ // Hands "use" the lid (XRSimpleInteractable). Sockets never hold it.
+ if (!args.IsHandOrDistance)
+ return;
+
+ Toggle();
+ }
+
+ private void Swing(Quaternion target, AudioClip clipAtEnd)
+ {
+ if (_swingRoutine != null)
+ StopCoroutine(_swingRoutine);
+ _swingRoutine = StartCoroutine(SwingTo(target, clipAtEnd));
+ }
+
+ private IEnumerator SwingTo(Quaternion target, AudioClip clipAtEnd)
+ {
+ var start = transform.localRotation;
+ for (var time = 0f; time < _swingTime; time += Time.deltaTime)
+ {
+ transform.localRotation = Quaternion.Slerp(start, target, time / _swingTime);
+ yield return null;
+ }
+
+ transform.localRotation = target;
+ _swingRoutine = null;
+
+ if (clipAtEnd != null && _sfxPlayer != null)
+ _sfxPlayer.Play(clipAtEnd, transform.position);
+ }
+ }
+}
diff --git a/Assets/Gothic-VR/Scripts/Interaction/Components/VrChestLidToggle.cs.meta b/Assets/Gothic-VR/Scripts/Interaction/Components/VrChestLidToggle.cs.meta
new file mode 100644
index 000000000..dfa3b4965
--- /dev/null
+++ b/Assets/Gothic-VR/Scripts/Interaction/Components/VrChestLidToggle.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 0ba712f1856779441b7ab647bc58f884
\ No newline at end of file
diff --git a/Assets/Gothic-VR/Scripts/Interaction/Components/VrChestSlots.cs b/Assets/Gothic-VR/Scripts/Interaction/Components/VrChestSlots.cs
new file mode 100644
index 000000000..3a5bd6c55
--- /dev/null
+++ b/Assets/Gothic-VR/Scripts/Interaction/Components/VrChestSlots.cs
@@ -0,0 +1,275 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Linq;
+using Gothic.Core.Adapters.Vob;
+using Gothic.Core.Extensions;
+using Gothic.Core.Logging;
+using Gothic.Core.Models.Container;
+using Gothic.Core.Models.Vob;
+using Gothic.Core.Services.Vobs;
+using Gothic.VR.Interaction.Ports;
+using Reflex.Attributes;
+using UnityEngine;
+using ZenKit.Vobs;
+using Logger = Gothic.Core.Logging.Logger;
+
+namespace Gothic.VR.Interaction.Components
+{
+ ///
+ /// Content of a chest (oCMobContainer), independent of the lid: the lid (HvrPhysicsChest on HVR,
+ /// VrChestLidToggle on XRI until VrHinge in Phase 4) calls Open()/Close().
+ /// - The prefab carries one slot inventory (IVrSocketContainer) per VR backend. The active one is used, the
+ /// others stay hidden.
+ /// - First open: the slots are laid out to the size of the chest mesh and the content (IContainer.Contents) is
+ /// spawned into them, without socket sounds.
+ /// - Closing hides the slots (and the items inside).
+ ///
+ public class VrChestSlots : MonoBehaviour
+ {
+ // Need to be updated if oCMobContainer.prefab is changed.
+ private const int SlotRows = 3;
+ private const int SlotsPerRow = 4;
+ private const float SlotRadius = 0.1f;
+ private const float SlotCollectionMargin = SlotRadius / 2;
+
+ [Tooltip("Slot inventories (with an IVrSocketContainer), one per VR backend. The first active one is used. " +
+ "A BoxCollider below it (drop zone / collector) is resized to the chest.")]
+ [SerializeField] private List _inventories = new();
+
+ [Tooltip("Seconds after spawning the content until socket sounds play again (HVR snaps items in later).")]
+ [SerializeField] private float _silentAfterSpawnTime = 1f;
+
+ [Inject] private readonly VobService _vobService;
+
+ private GameObject _inventoryGo;
+ private IVrSocketContainer _container;
+ private BoxCollider _collector;
+ private bool _isResolved;
+ private bool _isContentSpawned;
+ private bool _isSpawning;
+ private bool _isOpen;
+
+ public bool IsOpen => _isOpen;
+
+ ///
+ /// Slots of the active backend. Null if the chest has no active inventory.
+ ///
+ public IVrSocketContainer Container
+ {
+ get
+ {
+ Resolve();
+ return _container;
+ }
+ }
+
+ private void Start()
+ {
+ Resolve();
+ if (!_isOpen && _inventoryGo != null)
+ _inventoryGo.SetActive(false);
+ }
+
+ public void Open()
+ {
+ Resolve();
+ if (_inventoryGo == null)
+ return;
+
+ _isOpen = true;
+ _inventoryGo.SetActive(true);
+
+ if (_isContentSpawned)
+ return;
+
+ _isContentSpawned = true;
+ AlignSlots();
+ StartCoroutine(SpawnContent());
+ }
+
+ public void Close()
+ {
+ _isOpen = false;
+
+ // Items are put into active slots only. The inventory is hidden once the spawning is done.
+ if (_inventoryGo != null && !_isSpawning)
+ _inventoryGo.SetActive(false);
+ }
+
+ private void Resolve()
+ {
+ if (_isResolved)
+ return;
+
+ _isResolved = true;
+ foreach (var inventory in _inventories)
+ {
+ if (inventory == null)
+ continue;
+
+ var container = inventory.GetComponent();
+ if (_container == null && container != null && container.IsActive)
+ {
+ _container = container;
+ _inventoryGo = inventory;
+ _collector = inventory.GetComponentInChildren(true);
+ continue;
+ }
+
+ inventory.SetActive(false);
+ }
+
+ if (_container == null)
+ Logger.LogWarning($"[Chest] {name} has no slot inventory for the active VR backend.", LogCat.VR);
+ }
+
+ ///
+ /// Containers have different sizes. Re-align the prefab's slots to match their actual sizes.
+ ///
+ private void AlignSlots()
+ {
+ // We need to dynamically fetch the bounding box of main mesh as some chests have the correct one inside
+ // BIP01 "CHEST_*_0" and others inside "ZM_CHEST*".
+ var meshFilters = GetComponentsInChildren()
+ .Where(i => i.GetComponentInParent() == null) // Not the lid, not items inside.
+ .Where(i => i.gameObject.name.StartsWithIgnoreCase("ZM_") ||
+ i.gameObject.name.StartsWithIgnoreCase("BIP01")) // Gothic meshes only, no slot rings.
+ .Where(i => !i.gameObject.name.ContainsIgnoreCase("LOCK")) // Ignore lock element
+ .ToArray();
+
+ MeshFilter usedMesh;
+ if (meshFilters.Length == 0)
+ {
+ Logger.LogError($"No suitable mesh found for chest slot size calculation in {name}. Skipping...",
+ LogCat.VR);
+ return;
+ }
+ else if (meshFilters.Length >= 2)
+ {
+ Logger.LogWarning($"More than one feasible MeshFilter for chest slot size calculation found in " +
+ $"{name}. Leveraging first (1)ZM_* or (2)BIP01 one.", LogCat.VR);
+
+ // Based on mesh check of all containers in G1, the highest priority for the right mesh is a ZM_* GO
+ // if existing.
+ var zmMesh = meshFilters.FirstOrDefault(i => i.gameObject.name.StartsWithIgnoreCase("ZM_"));
+ usedMesh = zmMesh ?? meshFilters.First();
+ }
+ else
+ {
+ usedMesh = meshFilters.First();
+ }
+
+ var mainMeshBounds = usedMesh!.sharedMesh.bounds;
+
+ // Set the collector's/drop zone's size to perfectly align with container.
+ if (_collector != null)
+ _collector.size = new Vector3(mainMeshBounds.size.x, _collector.size.y, mainMeshBounds.size.z);
+
+ // Move all Slots nearly towards height of container (*1,5 == 75% close to top).
+ _inventoryGo.transform.localPosition = new(0, mainMeshBounds.center.y * 1.5f, 0);
+
+ var centeredMainBound = new Bounds(Vector3.zero, mainMeshBounds.size);
+
+ // Align all slots in row+column based on actual sizes.
+ var rowWidth = (centeredMainBound.size.x - 2 * SlotCollectionMargin) / SlotsPerRow;
+ var rowDepth = (centeredMainBound.size.z - 2 * SlotCollectionMargin) / SlotRows;
+
+ // Calculate center of a grid-element for a slot ring entry.
+ var middleAlignmentX = (rowWidth - SlotRadius * 2) / 2;
+ var middleAlignmentZ = (rowDepth - SlotRadius * 2) / 2;
+
+ var currentRow = 0;
+ var currentColumn = 0;
+
+ foreach (var socket in _container.Sockets)
+ {
+ // SlotCollectionMargin - Left aligned margin for the whole collection
+ // SlotRadius - Location is based on a 50% shift into the desired area as the drawing of a circle
+ // starts centered
+ // middleAlignment* - Centered location within a grid for an element
+ // min.x - Start point to calculate from left top
+ socket.Transform.localPosition = new(
+ SlotCollectionMargin + SlotRadius + middleAlignmentX + centeredMainBound.min.x +
+ rowWidth * currentColumn,
+ 0,
+ SlotCollectionMargin + SlotRadius + middleAlignmentZ + centeredMainBound.min.z +
+ rowDepth * currentRow
+ );
+
+ currentColumn++;
+ if (currentColumn >= SlotsPerRow)
+ {
+ currentColumn = 0;
+ currentRow++;
+ }
+ }
+ }
+
+ private IEnumerator SpawnContent()
+ {
+ var vobContainer = GetComponentInParent()?.Container?.VobAs();
+ var contentItems = _vobService.UnpackItems(vobContainer?.Contents);
+ if (contentItems.Count == 0)
+ yield break;
+
+ _isSpawning = true;
+ _container.SetSilent(true);
+
+ var sockets = _container.Sockets;
+ if (contentItems.Count > sockets.Count)
+ {
+ Logger.LogError("There are more items in a container than slots available. Please implement " +
+ "pagination to ensure everything is visible and can be grabbed!", LogCat.VR);
+ }
+
+ for (var i = 0; i < Math.Min(contentItems.Count, sockets.Count); i++)
+ {
+ var item = SpawnItem(contentItems[i]);
+
+ // Wait 1 frame to ensure our mesh bounds can be calculated by the slot.
+ yield return null;
+
+ PlaceIntoSlot(item);
+ }
+
+ // HVR snaps the items into place a bit later. They stay silent until then.
+ yield return new WaitForSeconds(_silentAfterSpawnTime);
+
+ _container.SetSilent(false);
+ _isSpawning = false;
+ if (!_isOpen)
+ _inventoryGo.SetActive(false);
+ }
+
+ private VobContainer SpawnItem(ContentItem contentItem)
+ {
+ var zkVob = new Item
+ {
+ Name = contentItem.Name,
+ Amount = contentItem.Amount,
+ Visual = new VisualMesh
+ {
+ Name = contentItem.Name
+ }
+ };
+
+ return _vobService.CreateItem(zkVob);
+ }
+
+ private void PlaceIntoSlot(VobContainer vobContainer)
+ {
+ var interactable = vobContainer?.Go.GetComponentInChildren(true);
+ if (interactable == null || !_container.TryFindFree(interactable, out var socket) ||
+ !socket.TryPlace(interactable, true))
+ {
+ Logger.LogWarning($"[Chest] Couldn't put {vobContainer?.Go.name} into a slot of {name}.", LogCat.VR);
+ return;
+ }
+
+ // HVR sockets don't put the VobLoader at the slot's origin. VrSocketSlot centers the item itself.
+ if (socket is not VrSocketSlot)
+ vobContainer.Go.transform.localPosition = Vector3.zero;
+ }
+ }
+}
diff --git a/Assets/Gothic-VR/Scripts/Interaction/Components/VrChestSlots.cs.meta b/Assets/Gothic-VR/Scripts/Interaction/Components/VrChestSlots.cs.meta
new file mode 100644
index 000000000..5f8bf215d
--- /dev/null
+++ b/Assets/Gothic-VR/Scripts/Interaction/Components/VrChestSlots.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: 7038de71bad13264db57802c214cea67
\ No newline at end of file
diff --git a/Assets/Gothic-VR/Scripts/Interaction/Components/VrHinges.cs b/Assets/Gothic-VR/Scripts/Interaction/Components/VrHinges.cs
new file mode 100644
index 000000000..32347bbe0
--- /dev/null
+++ b/Assets/Gothic-VR/Scripts/Interaction/Components/VrHinges.cs
@@ -0,0 +1,29 @@
+using Gothic.VR.Interaction.Ports;
+using UnityEngine;
+
+namespace Gothic.VR.Interaction.Components
+{
+ ///
+ /// Finds the hinge (door wing, chest lid) of the active VR backend. Shared prefabs may carry one per backend.
+ ///
+ public static class VrHinges
+ {
+ ///
+ /// The first active IVrHinge on or below the component. Null if none of them is active (e.g. a door on a
+ /// backend without hinges yet).
+ ///
+ public static IVrHinge FindActive(Component root)
+ {
+ if (root == null)
+ return null;
+
+ foreach (var hinge in root.GetComponentsInChildren(true))
+ {
+ if (hinge.IsActive)
+ return hinge;
+ }
+
+ return null;
+ }
+ }
+}
diff --git a/Assets/Gothic-VR/Scripts/Interaction/Components/VrHinges.cs.meta b/Assets/Gothic-VR/Scripts/Interaction/Components/VrHinges.cs.meta
new file mode 100644
index 000000000..70d01df2e
--- /dev/null
+++ b/Assets/Gothic-VR/Scripts/Interaction/Components/VrHinges.cs.meta
@@ -0,0 +1,2 @@
+fileFormatVersion: 2
+guid: e32b5ce0da1d32f44b6b8b1f3dd722f2
\ No newline at end of file
diff --git a/Assets/Gothic-VR/Scripts/Interaction/Components/VrSocketContainer.cs b/Assets/Gothic-VR/Scripts/Interaction/Components/VrSocketContainer.cs
index ea15b5287..91671225c 100644
--- a/Assets/Gothic-VR/Scripts/Interaction/Components/VrSocketContainer.cs
+++ b/Assets/Gothic-VR/Scripts/Interaction/Components/VrSocketContainer.cs
@@ -27,6 +27,25 @@ public IReadOnlyList Sockets
}
}
+ ///
+ /// True if one of the slots has a backend part of the active VR backend (e.g. XriSocketBridge on XRI).
+ ///
+ public bool IsActive
+ {
+ get
+ {
+ foreach (var slot in Slots)
+ {
+ if (slot != null && slot.HasActiveBackend)
+ return true;
+ }
+
+ return false;
+ }
+ }
+
+ public bool IsSilent => _isSilent;
+
public IReadOnlyList Slots
{
get
diff --git a/Assets/Gothic-VR/Scripts/Interaction/Components/VrSocketSlot.cs b/Assets/Gothic-VR/Scripts/Interaction/Components/VrSocketSlot.cs
index 239c37cef..890304116 100644
--- a/Assets/Gothic-VR/Scripts/Interaction/Components/VrSocketSlot.cs
+++ b/Assets/Gothic-VR/Scripts/Interaction/Components/VrSocketSlot.cs
@@ -94,6 +94,7 @@ public class VrSocketSlot : MonoBehaviour, IVrSocket
private Rigidbody _heldRigidbody;
private bool _wasKinematic;
private bool _isPlacedEventRaised;
+ private bool _isReselectNeeded;
private Coroutine _fitRoutine;
public VrGrabberKind Kind => VrGrabberKind.Socket;
@@ -106,6 +107,11 @@ public class VrSocketSlot : MonoBehaviour, IVrSocket
public bool IsHovered => _hovered.Count > 0;
public Transform AttachPoint => _attachPoint != null ? _attachPoint : transform;
+ ///
+ /// True if a backend part of the active VR backend sits next to this slot (it detects items).
+ ///
+ public bool HasActiveBackend => Backend != null;
+
public float Size
{
get => _size;
@@ -190,6 +196,19 @@ private void Awake()
_ = Backend;
}
+ private void OnEnable()
+ {
+ if (!_isReselectNeeded)
+ return;
+
+ _isReselectNeeded = false;
+ if (_held == null || Backend == null || Backend.TryPlace(_held))
+ return;
+
+ Logger.LogWarning($"[Socket] Backend couldn't hold {_held.name} in {name} again. Taken out.", LogCat.VR);
+ Remove(true);
+ }
+
private void OnDisable()
{
// Hover exits of a disabled backend may not arrive anymore.
@@ -319,6 +338,14 @@ internal void OnBackendRemoved(VrInteractable interactable)
if (interactable == null || interactable != _held)
return;
+ // The slot is being deactivated (e.g. a chest is closed): the backend lets go of everything, but the item
+ // stays inside (and hidden with the slot). The backend holds it again once the slot is enabled.
+ if (!gameObject.activeInHierarchy)
+ {
+ _isReselectNeeded = true;
+ return;
+ }
+
Remove(false);
}
@@ -429,6 +456,7 @@ private void Detach(Transform root)
var previousParent = _previousParent;
var previousScale = _previousScale;
+ _isReselectNeeded = false;
_held = null;
_heldRoot = null;
_heldRigidbody = null;
diff --git a/Assets/Gothic-VR/Scripts/Interaction/Ports/IVrBackend.cs b/Assets/Gothic-VR/Scripts/Interaction/Ports/IVrBackend.cs
index bd7c4dc4c..d9a310e20 100644
--- a/Assets/Gothic-VR/Scripts/Interaction/Ports/IVrBackend.cs
+++ b/Assets/Gothic-VR/Scripts/Interaction/Ports/IVrBackend.cs
@@ -1,3 +1,4 @@
+using Gothic.Core.Models.Context;
using Reflex.Core;
namespace Gothic.VR.Interaction.Ports
@@ -10,6 +11,11 @@ public interface IVrBackend
{
string Name { get; }
+ ///
+ /// Which DeveloperConfig.VrInteractionBackend this is.
+ ///
+ VrInteractionBackend Kind { get; }
+
///
/// Registers the backend's implementations of IVrInput, IVrHaptics, IVrUiPointers and IVrSfxPlayer.
/// IVrRig isn't registered here, as it lives on the player prefab.
diff --git a/Assets/Gothic-VR/Scripts/Interaction/Ports/IVrHinge.cs b/Assets/Gothic-VR/Scripts/Interaction/Ports/IVrHinge.cs
index db138b212..100e8500f 100644
--- a/Assets/Gothic-VR/Scripts/Interaction/Ports/IVrHinge.cs
+++ b/Assets/Gothic-VR/Scripts/Interaction/Ports/IVrHinge.cs
@@ -4,9 +4,15 @@ namespace Gothic.VR.Interaction.Ports
{
///
/// A physically rotating door or chest lid.
+ /// Shared prefabs may carry one hinge per backend: use the active one (VrHinges.FindActive).
///
public interface IVrHinge
{
+ ///
+ /// Whether this hinge belongs to the active VR backend.
+ ///
+ bool IsActive { get; }
+
Transform Transform { get; }
Rigidbody Rigidbody { get; }
diff --git a/Assets/Gothic-VR/Scripts/Interaction/Ports/IVrSocketContainer.cs b/Assets/Gothic-VR/Scripts/Interaction/Ports/IVrSocketContainer.cs
index 44b24a4b2..d166b1274 100644
--- a/Assets/Gothic-VR/Scripts/Interaction/Ports/IVrSocketContainer.cs
+++ b/Assets/Gothic-VR/Scripts/Interaction/Ports/IVrSocketContainer.cs
@@ -10,6 +10,17 @@ public interface IVrSocketContainer
{
IReadOnlyList Sockets { get; }
+ ///
+ /// Whether this container belongs to the active VR backend. Shared prefabs (e.g. chests) carry one container
+ /// per backend.
+ ///
+ bool IsActive { get; }
+
+ ///
+ /// See SetSilent.
+ ///
+ bool IsSilent { get; }
+
///
/// Finds the first free socket which accepts the interactable.
///
diff --git a/Docs/HVR-replacement/found-bugs.md b/Docs/HVR-replacement/found-bugs.md
index 38824178e..888e6e717 100644
--- a/Docs/HVR-replacement/found-bugs.md
+++ b/Docs/HVR-replacement/found-bugs.md
@@ -53,3 +53,5 @@ Move them to GitHub issues when the branch is merged, if they are still open.
- Backpack grab point is too small. Hard to grab it. Should be aligned with the size on how HVR handled it.
- Rotation of long backack-slot at the bottom is wrong. Should be like before.
- Simulator: Very complex to traverse. Why not having it like the one from https://github.com/AdrielHercules/hvr-simulator (aka Controller handling etc.)
+- Rotation + Scaling of objects inside Slots is broken
+- Lockpicking - finalizing the minigame should open the door directly. Currently: Nothing.
diff --git a/Docs/HVR-replacement/phase-3-sockets-inventory.md b/Docs/HVR-replacement/phase-3-sockets-inventory.md
index 53dc36e26..2b24aa4b2 100644
--- a/Docs/HVR-replacement/phase-3-sockets-inventory.md
+++ b/Docs/HVR-replacement/phase-3-sockets-inventory.md
@@ -17,12 +17,21 @@ PlayMode test), **3b** backpack + shoulder socket + hip holsters + HeadRelativeI
flip), save → load.)
- [x] Hip/back holsters keep weapons; drawing and holstering updates the inventory as today. (3b; holster, teleport
while holstered, draw played on Xri with an item. Not played: swimming, walking with real tracking.)
-- [ ] Chests: the content spawns into slots (scaled down), items can be taken and put back; dropping an item into the
- open chest stores it.
-- [ ] NPC loot: equipped and inventory items appear in loot slots, taking one moves it to the player.
-- [ ] Hover feedback on slots (scale and valid/invalid material) is equivalent to HVR.
-- [ ] Socket sounds: Gothic `InvOpen`/`InvClose` for the backpack, socket fallback sounds for slots, silent bulk
- spawning.
+- [x] Chests: the content spawns into slots (scaled down), items can be taken and put back; dropping an item into the
+ open chest stores it. (3c; played on Xri with a G1 chest near the start: open → 5 items in slots laid out to
+ the chest mesh, take one by hand, release over the chest → back into a free slot (drop zone, also with slot
+ detection off), close → hidden, reopen → same items, nothing spawned twice. The lid is not physical on Xri
+ until Phase 4: using it (grab = use, like a mob) swings it open/closed, see `VrChestLidToggle`. Hvr: lid
+ opened by physics → HVR sockets filled as before.)
+- [x] NPC loot: equipped and inventory items appear in loot slots, taking one moves it to the player. (3c; played on
+ Xri: Orry's sword and crossbow with `[E]`, bolts, apple, nugget; taking the nugget removes it from his
+ inventory and refills the slots, taking the sword removes it from `EquippedItems` and the mesh from
+ `ZS_SWORD`; closing destroys the slots. Opened via `VRNpcLoot.Open`, not via a kill.)
+- [x] Hover feedback on slots (scale and valid/invalid material) is equivalent to HVR. (3a/3b; the invalid material
+ over a full slot was not played.)
+- [x] Socket sounds: Gothic `InvOpen`/`InvClose` for the backpack, socket fallback sounds for slots, silent bulk
+ spawning. (3b backpack; 3c chests spawn with `SetSilent(true)`, also no weapon draw sounds of
+ `VRVobContainerSocketInventory` while silent - on HVR too. Sounds were not listened to, only the code path.)
## What HVR does for us today (behaviour spec, write new code from this, not from HVR source)
@@ -139,14 +148,35 @@ as HVR's head-relative inventory). `VRBackpack.OnItemPutIntoHolster/OutOfHolster
it doesn't move socketed items. Teleporting with a holstered item and a held backpack keeps both in place.
- `VR Socket Slot.prefab` is on layer `TransparentFX` (1) now, like the mouth: its trigger meets held items
(layers 6 and 7, which don't collide with Default), but neither the player nor hands' raycasts.
-- [ ] `VRVobContainerPhysicsChest`: split into `VrChestLid` (Phase 4) + `VrChestSlots` (this phase: resize slots to the
+- [x] `VRVobContainerPhysicsChest`: split into `VrChestLid` (Phase 4) + `VrChestSlots` (this phase: resize slots to the
chest mesh, as today's `AlignSockets` logic, bulk spawn silently, pagination still TODO as logged today).
-- [ ] `VRNpcLoot`: create `VrSocketSlot`s at runtime instead of `HVRSocket`s; `Removed` → `OnItemTakenFromLoot`.
-- [ ] `VRVobContainerSocketInventory`: subscribe to container events.
+ (3c: `HvrPhysicsChest` is only the HVR lid now and calls `VrChestSlots.Open()/Close()`; on other backends it
+ switches itself off before the HVR door sets up its joint. `VrChestSlots` sits on the `oCMobContainer` root,
+ lists one inventory per backend (`Inventory` = HVR, `Inventory XRI`) and uses the first whose
+ `IVrSocketContainer.IsActive`; the others are deactivated. Layout = old `AlignSockets`, content via
+ `VobService.UnpackItems`, one frame per item, silent until 1 s after the spawn; a chest closed while spawning
+ hides its slots when the spawn is done. Interim lid on Xri: `VrChestLidToggle` (implements `IVrHinge`, so
+ lock picking locks/unlocks it and `VRVobContainer` gives it the open/close sounds; kinematic, swings to
+ 110°). Phase 4 replaces it with `VrHinge`. Callers now take the active hinge (`VrHinges.FindActive`, new
+ `IVrHinge.IsActive`) and are null-safe (no hinge on Xri doors yet).)
+- [x] `VRNpcLoot`: create `VrSocketSlot`s at runtime instead of `HVRSocket`s; `Removed` → `OnItemTakenFromLoot`.
+ (3c: new `_slotPrefab` = `VR Socket Slot.prefab`, used when `IVrBackend.Kind` isn't Hvr (new property);
+ `_socketPrefab` stays the HVR slot. `Released` → `OnItemTakenFromLoot` unchanged.)
+- [x] `VRVobContainerSocketInventory`: subscribe to container events. (3c: still subscribes to the sockets below it;
+ new: no weapon (un)draw sound while the `IVrSocketContainer` next to it is silent. `IVrSocketContainer` got
+ `IsActive` and `IsSilent`.)
+- [x] Slots keep their items while deactivated (3c, found while testing): XRI releases a socket's selection when the
+ socket is disabled (closing a chest), and `VrSocketSlot` tried to re-parent the item during the deactivation.
+ Now the slot keeps the item and re-selects it in the backend on enable.
- [ ] **Assets (UnityMCP):** (3a done: `Resources/VR/Prefabs/Player-Elements/VR Socket Slot.prefab` - slot,
XriSocketBridge, sphere trigger r=0.07, hover feedback, GameObjectSelfInjector; `Gothic-VR/Meshes/SocketRing.asset`
procedural torus; `Gothic-VR/Materials/SocketRing(-Valid/-Invalid).mat` URP Unlit transparent. 3b: backpack
- prefab and rig anchors, see above. Rest: 3c)
+ prefab and rig anchors, see above. 3c: `oCMobContainer.prefab` got `VrChestSlots` on the root,
+ `BIP01 CHEST_.*_0/Inventory XRI` (`VrSocketContainer`, `VRVobContainerSocketInventory`, 12 `VR Socket Slot`
+ instances "Slot (0..11)" with Size 0.18, sphere r 0.1, ring flat and 1.33x like HVR's chest ring, and
+ `DropZone` = trigger box on layer TransparentFX with `VrContainerDropZone`, resized to the chest like HVR's
+ collector, 0.3 m high); the lid got `XRSimpleInteractable` (disabled) + `XriInteractableBridge` +
+ `VrChestLidToggle`. `oCNpc.prefab`: `VRNpcLoot._slotPrefab`.)
new `VR Socket Slot.prefab` (replaces `VRBackpack(Large)InventorySlot` + HVR's
`LargeInventorySlot` / `SocketOval`), ring mesh (simple torus, our own) + `SocketRing/Valid/Invalid` URP materials,
add slots to `oCMobContainer.prefab` and the backpack prefab, shoulder + hip anchors on the XRI rig.
@@ -155,6 +185,11 @@ as HVR's head-relative inventory). `VRBackpack.OnItemPutIntoHolster/OutOfHolster
## Test plan
+Status after 3c (Xri + simulator, programmatic input via MCP): 1-3 played in 3b (no save → load), 4 partly (no
+swimming), 5 and 6 played (G1 chest with 5 items; the "no sound burst" not listened to), 7 played without killing
+(loot opened directly), 8 not played. Hvr: boots, chest opens via physics and fills its HVR sockets, NPC loot uses
+the HVR slots. Not played on a headset.
+
1. New game: backpack on the shoulder; grab it off → slots show the current category; flip pages/categories; put it
back on the shoulder → `InvClose` sound.
2. Pick up an apple, put it into the backpack → inventory +1, the vob disappears from the world (save → load: not in
diff --git a/Docs/HVR-replacement/phase-4-doors-chests-ladders.md b/Docs/HVR-replacement/phase-4-doors-chests-ladders.md
index 1f0fddb4c..d00abf11a 100644
--- a/Docs/HVR-replacement/phase-4-doors-chests-ladders.md
+++ b/Docs/HVR-replacement/phase-4-doors-chests-ladders.md
@@ -77,6 +77,8 @@ as a code reference.)
- [ ] `VrHinge` (+ `IVrHinge` implementation), `VrLadderExit`.
- [ ] `VRVobContainerPhysicsChest` → `VrChestSlots` (logic) + `VrHinge` (lid); delete the subclassing on the Xri path.
+ (3c: `VrChestSlots` exists and has `Open()`/`Close()`; `HvrPhysicsChest` is only the HVR lid. On Xri the lid is
+ the interim `VrChestLidToggle` (use = swing open/closed, kinematic, `IVrHinge`) - replace it with `VrHinge`.)
- [ ] **Prefabs (UnityMCP):** `oCMobDoor.prefab` (VrHinge + grab interactable + bridge), `oCMobContainer.prefab`
(lid), `oCMobLadder.prefab` (ClimbInteractable + bridge).
- [ ] `VRContextInteractionService.KeepPlayerWithin` uses `IVrRig.IsClimbing`; verify with a dialog at a ladder.