From d72d44d16e0a7d287bb225476ee21bf493a63e51 Mon Sep 17 00:00:00 2001 From: rowan Date: Sun, 20 Jul 2025 18:46:40 -0400 Subject: [PATCH] fixes #10 and #14 --- .../AddressableAssetSettings.asset | 10 +- Assets/Canto URP Renderer.asset | 23 + Assets/Prefabs/WorldSpaceDoc.prefab | 126 +++ Assets/Prefabs/WorldSpaceDoc.prefab.meta | 7 + Assets/Resources/Materials/Outline.mat | 138 +++ Assets/Resources/Materials/Outline.mat.meta | 8 + Assets/SOAP/SelectedObject.asset | 17 + Assets/SOAP/SelectedObject.asset.meta | 8 + Assets/SOAP/UI/Fade In.asset | 4 +- Assets/SOAP/UI/Fade Out.asset | 4 +- Assets/Scenes/SampleScene.unity | 799 +++++++++++++++++- .../PropertyDrawers/DurationPropertyDrawer.cs | 71 +- Assets/Scripts/Extension/Observable.cs | 5 + Assets/Scripts/Interaction/IInteractable.cs | 4 +- Assets/Scripts/Interaction/Interactable.cs | 16 +- Assets/Scripts/Interaction/Interactor.cs | 166 ++-- .../Interaction/SelectedObjectHandler.cs | 74 ++ .../Interaction/SelectedObjectHandler.cs.meta | 2 + Assets/Scripts/SOAP/ReactiveValue.cs | 2 +- Assets/Scripts/SOAP/Value/GameObjectValue.cs | 13 + .../SOAP/Value/GameObjectValue.cs.meta | 2 + Assets/Scripts/System/Duration.cs | 31 +- Assets/Scripts/UI/Elements/ModalElement.cs | 45 + Assets/Scripts/UI/TestThing.cs | 20 +- Assets/UI/Modal.uxml | 6 +- ProjectSettings/ProjectSettings.asset | 5 +- ProjectSettings/TagManager.asset | 2 +- 27 files changed, 1427 insertions(+), 181 deletions(-) create mode 100644 Assets/Prefabs/WorldSpaceDoc.prefab create mode 100644 Assets/Prefabs/WorldSpaceDoc.prefab.meta create mode 100644 Assets/Resources/Materials/Outline.mat create mode 100644 Assets/Resources/Materials/Outline.mat.meta create mode 100644 Assets/SOAP/SelectedObject.asset create mode 100644 Assets/SOAP/SelectedObject.asset.meta create mode 100644 Assets/Scripts/Interaction/SelectedObjectHandler.cs create mode 100644 Assets/Scripts/Interaction/SelectedObjectHandler.cs.meta create mode 100644 Assets/Scripts/SOAP/Value/GameObjectValue.cs create mode 100644 Assets/Scripts/SOAP/Value/GameObjectValue.cs.meta diff --git a/Assets/AddressableAssetsData/AddressableAssetSettings.asset b/Assets/AddressableAssetsData/AddressableAssetSettings.asset index a29bb5d..bda4234 100644 --- a/Assets/AddressableAssetsData/AddressableAssetSettings.asset +++ b/Assets/AddressableAssetsData/AddressableAssetSettings.asset @@ -15,7 +15,7 @@ MonoBehaviour: m_DefaultGroup: 0d3c75cab4cd488feac7a41a80e154b9 m_currentHash: serializedVersion: 2 - Hash: 00000000000000000000000000000000 + Hash: ff68922cb6caa814cb2fd13a7ecdef11 m_OptimizeCatalogSize: 0 m_BuildRemoteCatalog: 0 m_CatalogRequestsTimeout: 0 @@ -24,11 +24,11 @@ MonoBehaviour: m_InternalBundleIdMode: 1 m_AssetLoadMode: 0 m_BundledAssetProviderType: - m_AssemblyName: - m_ClassName: + m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.BundledAssetProvider m_AssetBundleProviderType: - m_AssemblyName: - m_ClassName: + m_AssemblyName: Unity.ResourceManager, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null + m_ClassName: UnityEngine.ResourceManagement.ResourceProviders.AssetBundleProvider m_IgnoreUnsupportedFilesInBuild: 0 m_UniqueBundleIds: 0 m_EnableJsonCatalog: 0 diff --git a/Assets/Canto URP Renderer.asset b/Assets/Canto URP Renderer.asset index 76a3f0b..9423695 100644 --- a/Assets/Canto URP Renderer.asset +++ b/Assets/Canto URP Renderer.asset @@ -164,3 +164,26 @@ MonoBehaviour: restoreCamera: 1 offset: {x: 0, y: 0, z: 0, w: 0} cameraFieldOfView: 60 +--- !u!114 &8150197663254742350 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 32876a5b2ac88c51ab9c4076cf2973ac, type: 3} + m_Name: JFAOutlineRenderFeature + m_EditorClassIdentifier: + m_Active: 1 + settings: + renderPassEvent: 600 + initialSeedShader: {fileID: -6465566751694194690, guid: a6d2894c91d3da33ea437dbabdca1f0c, type: 3} + jfaIterationShader: {fileID: -6465566751694194690, guid: fccb9c640416b1c249d41104b8dc7b43, type: 3} + finalOutlineShader: {fileID: -6465566751694194690, guid: e9afb92d4ba90cb509dc4630736ad45b, type: 3} + outlineColor: {r: 1, g: 0, b: 0, a: 1} + outlineThickness: 0.02 + blurAmount: 0 + resolution: 1 + debugDisplay: 1 diff --git a/Assets/Prefabs/WorldSpaceDoc.prefab b/Assets/Prefabs/WorldSpaceDoc.prefab new file mode 100644 index 0000000..680ee7d --- /dev/null +++ b/Assets/Prefabs/WorldSpaceDoc.prefab @@ -0,0 +1,126 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &3360622849527809930 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1213922315803973788} + - component: {fileID: 1646178092638057926} + - component: {fileID: 3857942058976422217} + - component: {fileID: 1219276780990905499} + - component: {fileID: 5906514020780888610} + m_Layer: 0 + m_Name: WorldSpaceDoc + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1213922315803973788 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3360622849527809930} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1646178092638057926 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3360622849527809930} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 19102, guid: 0000000000000000e000000000000000, type: 0} + m_Name: + m_EditorClassIdentifier: + m_PanelSettings: {fileID: 11400000, guid: 2bc58aab5867867e5b0feeae2df42fd0, type: 2} + m_ParentUI: {fileID: 0} + sourceAsset: {fileID: 0} + m_SortingOrder: 0 + m_WorldSpaceSizeMode: 0 + m_WorldSpaceWidth: 1920 + m_WorldSpaceHeight: 1080 +--- !u!114 &3857942058976422217 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3360622849527809930} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: e7e9e49bc72f0c26598faa7e0d34036e, type: 3} + m_Name: + m_EditorClassIdentifier: +--- !u!114 &1219276780990905499 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3360622849527809930} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 8f7e084f3ed7b4e5babd039bbd888b29, type: 3} + m_Name: + m_EditorClassIdentifier: + Document: {fileID: 1646178092638057926} + PooledObject: {fileID: 3857942058976422217} +--- !u!1931382933 &5906514020780888610 +UIRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3360622849527809930} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 0 + m_ReflectionProbeUsage: 0 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 diff --git a/Assets/Prefabs/WorldSpaceDoc.prefab.meta b/Assets/Prefabs/WorldSpaceDoc.prefab.meta new file mode 100644 index 0000000..dea2514 --- /dev/null +++ b/Assets/Prefabs/WorldSpaceDoc.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: f0629fe523f37f1bf8a8f72ee3f1c716 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Materials/Outline.mat b/Assets/Resources/Materials/Outline.mat new file mode 100644 index 0000000..9a8dd9c --- /dev/null +++ b/Assets/Resources/Materials/Outline.mat @@ -0,0 +1,138 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &-6052410920342045092 +MonoBehaviour: + m_ObjectHideFlags: 11 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: d0353a89b1f911e48b9e16bdc9f2e058, type: 3} + m_Name: + m_EditorClassIdentifier: + version: 10 +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Outline + m_Shader: {fileID: 4800000, guid: 933532a4fcc9baf4fa0491de14d08ed7, type: 3} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: + - _SPECULAR_SETUP + m_InvalidKeywords: [] + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: + RenderType: Opaque + disabledShaderPasses: + - MOTIONVECTORS + m_LockedProperties: + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: + - _BaseMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _BumpMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailAlbedoMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailMask: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _DetailNormalMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _EmissionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MainTex: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _MetallicGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _OcclusionMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _ParallaxMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - _SpecGlossMap: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_Lightmaps: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_LightmapsInd: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + - unity_ShadowMasks: + m_Texture: {fileID: 0} + m_Scale: {x: 1, y: 1} + m_Offset: {x: 0, y: 0} + m_Ints: [] + m_Floats: + - _AddPrecomputedVelocity: 0 + - _AlphaClip: 0 + - _AlphaToMask: 0 + - _Blend: 0 + - _BlendModePreserveSpecular: 1 + - _BumpScale: 1 + - _ClearCoatMask: 0 + - _ClearCoatSmoothness: 0 + - _Cull: 2 + - _Cutoff: 0.5 + - _DetailAlbedoMapScale: 1 + - _DetailNormalMapScale: 1 + - _DstBlend: 0 + - _DstBlendAlpha: 0 + - _EnvironmentReflections: 1 + - _GlossMapScale: 0 + - _Glossiness: 0 + - _GlossyReflections: 0 + - _Metallic: 0 + - _OcclusionStrength: 1 + - _Parallax: 0.005 + - _QueueOffset: 0 + - _ReceiveShadows: 1 + - _Smoothness: 0.5 + - _SmoothnessTextureChannel: 0 + - _SpecularHighlights: 1 + - _SrcBlend: 1 + - _SrcBlendAlpha: 1 + - _Surface: 0 + - _WorkflowMode: 0 + - _XRMotionVectorsPass: 1 + - _ZWrite: 1 + m_Colors: + - _BaseColor: {r: 1, g: 1, b: 1, a: 1} + - _Color: {r: 1, g: 1, b: 1, a: 1} + - _EmissionColor: {r: 0, g: 0, b: 0, a: 1} + - _SpecColor: {r: 0.19999996, g: 0.19999996, b: 0.19999996, a: 1} + m_BuildTextureStacks: [] + m_AllowLocking: 1 diff --git a/Assets/Resources/Materials/Outline.mat.meta b/Assets/Resources/Materials/Outline.mat.meta new file mode 100644 index 0000000..9e74bb9 --- /dev/null +++ b/Assets/Resources/Materials/Outline.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 2c10a7be728bef4cdb73aee5650329de +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SOAP/SelectedObject.asset b/Assets/SOAP/SelectedObject.asset new file mode 100644 index 0000000..7b52bc3 --- /dev/null +++ b/Assets/SOAP/SelectedObject.asset @@ -0,0 +1,17 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!114 &11400000 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 0} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c3b21f732f40c4e4cb96718b2e8e33bb, type: 3} + m_Name: SelectedObject + m_EditorClassIdentifier: + Description: + value: + value: {fileID: 0} diff --git a/Assets/SOAP/SelectedObject.asset.meta b/Assets/SOAP/SelectedObject.asset.meta new file mode 100644 index 0000000..517aa1b --- /dev/null +++ b/Assets/SOAP/SelectedObject.asset.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: b030215acaabb18a58d812e296e6e99f +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 11400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/SOAP/UI/Fade In.asset b/Assets/SOAP/UI/Fade In.asset index 4e9e487..d3179ac 100644 --- a/Assets/SOAP/UI/Fade In.asset +++ b/Assets/SOAP/UI/Fade In.asset @@ -15,11 +15,11 @@ MonoBehaviour: addTransition: 1 propertyName: opacity duration: - duration: 1 + value: 5000000 unit: 2 easing: 3 delay: - duration: 1 + value: 2500000 unit: 2 from: 0 to: 1 diff --git a/Assets/SOAP/UI/Fade Out.asset b/Assets/SOAP/UI/Fade Out.asset index a4e04bf..e33d781 100644 --- a/Assets/SOAP/UI/Fade Out.asset +++ b/Assets/SOAP/UI/Fade Out.asset @@ -15,11 +15,11 @@ MonoBehaviour: addTransition: 1 propertyName: opacity duration: - duration: 1 + value: 3300000 unit: 2 easing: 3 delay: - duration: 1 + value: 2500000 unit: 2 from: 1 to: 0 diff --git a/Assets/Scenes/SampleScene.unity b/Assets/Scenes/SampleScene.unity index 195c0e6..85d2cd5 100644 --- a/Assets/Scenes/SampleScene.unity +++ b/Assets/Scenes/SampleScene.unity @@ -119,6 +119,222 @@ NavMeshSettings: debug: m_Flags: 0 m_NavMeshData: {fileID: 0} +--- !u!1 &79264407 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 79264408} + - component: {fileID: 79264411} + - component: {fileID: 79264410} + - component: {fileID: 79264409} + m_Layer: 0 + m_Name: Leg + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &79264408 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 79264407} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.25, y: -0.5, z: -0.55} + m_LocalScale: {x: 0.1, y: 1, z: 0.1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1028304588} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &79264409 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 79264407} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &79264410 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 79264407} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &79264411 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 79264407} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} +--- !u!1 &196218278 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 196218279} + - component: {fileID: 196218282} + - component: {fileID: 196218281} + - component: {fileID: 196218280} + m_Layer: 0 + m_Name: Cube + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &196218279 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 196218278} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 3, y: 0.1, z: 1.5} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1028304588} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &196218280 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 196218278} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &196218281 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 196218278} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &196218282 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 196218278} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} --- !u!1 &230761402 GameObject: m_ObjectHideFlags: 0 @@ -800,6 +1016,114 @@ Transform: m_Children: [] m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &893033283 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 893033284} + - component: {fileID: 893033287} + - component: {fileID: 893033286} + - component: {fileID: 893033285} + m_Layer: 0 + m_Name: Leg (2) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &893033284 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 893033283} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1.25, y: -0.5, z: -0.55} + m_LocalScale: {x: 0.1, y: 1, z: 0.1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1028304588} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &893033285 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 893033283} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &893033286 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 893033283} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &893033287 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 893033283} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} --- !u!1 &983805437 GameObject: m_ObjectHideFlags: 0 @@ -813,7 +1137,7 @@ GameObject: - component: {fileID: 983805439} - component: {fileID: 983805438} - component: {fileID: 983805442} - m_Layer: 0 + m_Layer: 7 m_Name: Sphere m_TagString: Untagged m_Icon: {fileID: 0} @@ -922,12 +1246,51 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: oneTimeUse: 0 - onTarget: + onSelected: + m_PersistentCalls: + m_Calls: [] + onDeselected: m_PersistentCalls: m_Calls: [] onInteracted: m_PersistentCalls: m_Calls: [] +--- !u!1 &1028304587 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1028304588} + m_Layer: 0 + m_Name: TABLE + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1028304588 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1028304587} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 1, y: 1, z: 3} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 196218279} + - {fileID: 79264408} + - {fileID: 1500704132} + - {fileID: 893033284} + - {fileID: 2044644166} + m_Father: {fileID: 1790144273} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1190731365 GameObject: m_ObjectHideFlags: 0 @@ -1229,10 +1592,10 @@ MonoBehaviour: orchestrator: {fileID: 11400000, guid: 994ab04db2c2004abb8272830cb16b26, type: 2} root: {fileID: 1281046468} panelSettings: {fileID: 11400000, guid: 2bc58aab5867867e5b0feeae2df42fd0, type: 2} - despawnTimeout: - duration: 60 + globalTimeout: + value: 100000000 unit: 2 - prefab: {fileID: 0} + prefab: {fileID: 3360622849527809930, guid: f0629fe523f37f1bf8a8f72ee3f1c716, type: 3} --- !u!1 &1363717994 GameObject: m_ObjectHideFlags: 0 @@ -1622,13 +1985,119 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: root: {fileID: 1363717994} - collider: {fileID: 1915136996} + collider: {fileID: 1363717996} + selectedObject: {fileID: 11400000, guid: b030215acaabb18a58d812e296e6e99f, type: 2} interactSource: {fileID: 11400000, guid: 8ad6b00b0192bc3d4b39b6f91de2447f, type: 2} updateFrequency: 7 minimumChangeDelta: 0.1 - outlineColor: {r: 1, g: 0.2705882, b: 0, a: 1} - outlineWidth: 3 - outlineMode: 0 +--- !u!1 &1500704131 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1500704132} + - component: {fileID: 1500704135} + - component: {fileID: 1500704134} + - component: {fileID: 1500704133} + m_Layer: 0 + m_Name: Leg (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1500704132 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1500704131} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 1.25, y: -0.5, z: 0.65} + m_LocalScale: {x: 0.1, y: 1, z: 0.1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1028304588} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &1500704133 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1500704131} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &1500704134 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1500704131} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &1500704135 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1500704131} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} --- !u!1 &1504087844 GameObject: m_ObjectHideFlags: 0 @@ -2106,6 +2575,39 @@ Transform: - {fileID: 1190731366} m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1699158560 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1699158561} + m_Layer: 0 + m_Name: 'why''d you leave your ' + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1699158561 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1699158560} + 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: 1740748269} + - {fileID: 1790144273} + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1740748256 stripped GameObject: m_CorrespondingSourceObject: {fileID: 2892703864492016621, guid: 51202e3c62c3d3e1c9bb0ff9c09a608f, type: 3} @@ -2125,6 +2627,14 @@ MonoBehaviour: m_EditorClassIdentifier: orchestrator: {fileID: 11400000, guid: 994ab04db2c2004abb8272830cb16b26, type: 2} modal: {fileID: 11400000, guid: 71a6f29fae4392a4f97870a52b6adf1e, type: 2} + hasTitle: 0 + title: + content: Keycard +--- !u!4 &1740748269 stripped +Transform: + m_CorrespondingSourceObject: {fileID: 2368094401510200604, guid: 51202e3c62c3d3e1c9bb0ff9c09a608f, type: 3} + m_PrefabInstance: {fileID: 7547016027398857338} + m_PrefabAsset: {fileID: 0} --- !u!1 &1782112144 stripped GameObject: m_CorrespondingSourceObject: {fileID: 919132149155446097, guid: 39499efe4f068c9f1aa32d2ea7e17fa9, type: 3} @@ -2152,6 +2662,86 @@ Animator: m_AllowConstantClipSamplingOptimization: 1 m_KeepAnimatorStateOnDisable: 0 m_WriteDefaultValuesOnDisable: 0 +--- !u!1 &1790144272 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1790144273} + m_Layer: 0 + m_Name: upon the + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1790144273 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1790144272} + 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: 1028304588} + m_Father: {fileID: 1699158561} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1914178465 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1914178467} + - component: {fileID: 1914178466} + m_Layer: 0 + m_Name: Selected Object + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1914178466 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1914178465} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 982ec8c450193224282e5b6e15ed3f18, type: 3} + m_Name: + m_EditorClassIdentifier: + selectedObject: {fileID: 11400000, guid: b030215acaabb18a58d812e296e6e99f, type: 2} + color: {r: 1, g: 0.2705882, b: 0, a: 1} + width: 3 + mode: 0 +--- !u!4 &1914178467 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1914178465} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &1915136994 GameObject: m_ObjectHideFlags: 0 @@ -2316,14 +2906,126 @@ Transform: m_Children: [] m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &2044644165 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 2044644166} + - component: {fileID: 2044644169} + - component: {fileID: 2044644168} + - component: {fileID: 2044644167} + m_Layer: 0 + m_Name: Leg (3) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &2044644166 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2044644165} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -1.25, y: -0.5, z: 0.65} + m_LocalScale: {x: 0.1, y: 1, z: 0.1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 1028304588} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!65 &2044644167 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2044644165} + m_Material: {fileID: 0} + m_IncludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_ExcludeLayers: + serializedVersion: 2 + m_Bits: 0 + m_LayerOverridePriority: 0 + m_IsTrigger: 0 + m_ProvidesContacts: 0 + m_Enabled: 1 + serializedVersion: 3 + m_Size: {x: 1, y: 1, z: 1} + m_Center: {x: 0, y: 0, z: 0} +--- !u!23 &2044644168 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2044644165} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 2 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 31321ba15b8f8eb4c954353edc038b1d, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_AdditionalVertexStreams: {fileID: 0} +--- !u!33 &2044644169 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2044644165} + m_Mesh: {fileID: 10202, guid: 0000000000000000e000000000000000, type: 0} --- !u!1001 &7547016027398857338 PrefabInstance: m_ObjectHideFlags: 0 serializedVersion: 2 m_Modification: serializedVersion: 3 - m_TransformParent: {fileID: 0} + m_TransformParent: {fileID: 1699158561} m_Modifications: + - target: {fileID: 2022912019066975223, guid: 51202e3c62c3d3e1c9bb0ff9c09a608f, type: 3} + propertyPath: addOutline + value: 1 + objectReference: {fileID: 0} - target: {fileID: 2022912019066975223, guid: 51202e3c62c3d3e1c9bb0ff9c09a608f, type: 3} propertyPath: oneTimeUse value: 1 @@ -2332,41 +3034,105 @@ PrefabInstance: propertyPath: onTarget.m_PersistentCalls.m_Calls.Array.size value: 1 objectReference: {fileID: 0} + - target: {fileID: 2022912019066975223, guid: 51202e3c62c3d3e1c9bb0ff9c09a608f, type: 3} + propertyPath: onSelected.m_PersistentCalls.m_Calls.Array.size + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 2022912019066975223, guid: 51202e3c62c3d3e1c9bb0ff9c09a608f, type: 3} + propertyPath: onDeselected.m_PersistentCalls.m_Calls.Array.size + value: 1 + objectReference: {fileID: 0} - target: {fileID: 2022912019066975223, guid: 51202e3c62c3d3e1c9bb0ff9c09a608f, type: 3} propertyPath: onTarget.m_PersistentCalls.m_Calls.Array.data[0].m_Mode value: 1 objectReference: {fileID: 0} + - target: {fileID: 2022912019066975223, guid: 51202e3c62c3d3e1c9bb0ff9c09a608f, type: 3} + propertyPath: onSelected.m_PersistentCalls.m_Calls.Array.data[0].m_Mode + value: 1 + objectReference: {fileID: 0} - target: {fileID: 2022912019066975223, guid: 51202e3c62c3d3e1c9bb0ff9c09a608f, type: 3} propertyPath: onTarget.m_PersistentCalls.m_Calls.Array.data[0].m_Target value: objectReference: {fileID: 1740748263} + - target: {fileID: 2022912019066975223, guid: 51202e3c62c3d3e1c9bb0ff9c09a608f, type: 3} + propertyPath: onDeselected.m_PersistentCalls.m_Calls.Array.data[0].m_Mode + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 2022912019066975223, guid: 51202e3c62c3d3e1c9bb0ff9c09a608f, type: 3} + propertyPath: onSelected.m_PersistentCalls.m_Calls.Array.data[0].m_Target + value: + objectReference: {fileID: 1740748263} - target: {fileID: 2022912019066975223, guid: 51202e3c62c3d3e1c9bb0ff9c09a608f, type: 3} propertyPath: onTarget.m_PersistentCalls.m_Calls.Array.data[0].m_CallState value: 2 objectReference: {fileID: 0} + - target: {fileID: 2022912019066975223, guid: 51202e3c62c3d3e1c9bb0ff9c09a608f, type: 3} + propertyPath: onDeselected.m_PersistentCalls.m_Calls.Array.data[0].m_Target + value: + objectReference: {fileID: 1740748263} - target: {fileID: 2022912019066975223, guid: 51202e3c62c3d3e1c9bb0ff9c09a608f, type: 3} propertyPath: onTarget.m_PersistentCalls.m_Calls.Array.data[0].m_MethodName value: Toggle objectReference: {fileID: 0} + - target: {fileID: 2022912019066975223, guid: 51202e3c62c3d3e1c9bb0ff9c09a608f, type: 3} + propertyPath: onSelected.m_PersistentCalls.m_Calls.Array.data[0].m_CallState + value: 2 + objectReference: {fileID: 0} + - target: {fileID: 2022912019066975223, guid: 51202e3c62c3d3e1c9bb0ff9c09a608f, type: 3} + propertyPath: onSelected.m_PersistentCalls.m_Calls.Array.data[0].m_MethodName + value: Open + objectReference: {fileID: 0} + - target: {fileID: 2022912019066975223, guid: 51202e3c62c3d3e1c9bb0ff9c09a608f, type: 3} + propertyPath: onDeselected.m_PersistentCalls.m_Calls.Array.data[0].m_CallState + value: 2 + objectReference: {fileID: 0} + - target: {fileID: 2022912019066975223, guid: 51202e3c62c3d3e1c9bb0ff9c09a608f, type: 3} + propertyPath: onDeselected.m_PersistentCalls.m_Calls.Array.data[0].m_MethodName + value: Close + objectReference: {fileID: 0} - target: {fileID: 2022912019066975223, guid: 51202e3c62c3d3e1c9bb0ff9c09a608f, type: 3} propertyPath: onTarget.m_PersistentCalls.m_Calls.Array.data[0].m_TargetAssemblyTypeName value: KitsuneCafe.UI.TestThing, Assembly-CSharp objectReference: {fileID: 0} + - target: {fileID: 2022912019066975223, guid: 51202e3c62c3d3e1c9bb0ff9c09a608f, type: 3} + propertyPath: onSelected.m_PersistentCalls.m_Calls.Array.data[0].m_TargetAssemblyTypeName + value: KitsuneCafe.UI.TestThing, Assembly-CSharp + objectReference: {fileID: 0} + - target: {fileID: 2022912019066975223, guid: 51202e3c62c3d3e1c9bb0ff9c09a608f, type: 3} + propertyPath: onDeselected.m_PersistentCalls.m_Calls.Array.data[0].m_TargetAssemblyTypeName + value: KitsuneCafe.UI.TestThing, Assembly-CSharp + objectReference: {fileID: 0} - target: {fileID: 2022912019066975223, guid: 51202e3c62c3d3e1c9bb0ff9c09a608f, type: 3} propertyPath: onTarget.m_PersistentCalls.m_Calls.Array.data[0].m_Arguments.m_ObjectArgumentAssemblyTypeName value: UnityEngine.Object, UnityEngine objectReference: {fileID: 0} + - target: {fileID: 2022912019066975223, guid: 51202e3c62c3d3e1c9bb0ff9c09a608f, type: 3} + propertyPath: onSelected.m_PersistentCalls.m_Calls.Array.data[0].m_Arguments.m_ObjectArgumentAssemblyTypeName + value: UnityEngine.Object, UnityEngine + objectReference: {fileID: 0} + - target: {fileID: 2022912019066975223, guid: 51202e3c62c3d3e1c9bb0ff9c09a608f, type: 3} + propertyPath: onDeselected.m_PersistentCalls.m_Calls.Array.data[0].m_Arguments.m_ObjectArgumentAssemblyTypeName + value: UnityEngine.Object, UnityEngine + objectReference: {fileID: 0} + - target: {fileID: 2368094401510200604, guid: 51202e3c62c3d3e1c9bb0ff9c09a608f, type: 3} + propertyPath: m_LocalScale.x + value: 0.40000004 + objectReference: {fileID: 0} + - target: {fileID: 2368094401510200604, guid: 51202e3c62c3d3e1c9bb0ff9c09a608f, type: 3} + propertyPath: m_LocalScale.z + value: 0.20000002 + objectReference: {fileID: 0} - target: {fileID: 2368094401510200604, guid: 51202e3c62c3d3e1c9bb0ff9c09a608f, type: 3} propertyPath: m_LocalPosition.x - value: -2 + value: 0 objectReference: {fileID: 0} - target: {fileID: 2368094401510200604, guid: 51202e3c62c3d3e1c9bb0ff9c09a608f, type: 3} propertyPath: m_LocalPosition.y - value: 0.005 + value: 1.053 objectReference: {fileID: 0} - target: {fileID: 2368094401510200604, guid: 51202e3c62c3d3e1c9bb0ff9c09a608f, type: 3} propertyPath: m_LocalPosition.z - value: 0 + value: 3 objectReference: {fileID: 0} - target: {fileID: 2368094401510200604, guid: 51202e3c62c3d3e1c9bb0ff9c09a608f, type: 3} propertyPath: m_LocalRotation.w @@ -2374,7 +3140,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 2368094401510200604, guid: 51202e3c62c3d3e1c9bb0ff9c09a608f, type: 3} propertyPath: m_LocalRotation.x - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 2368094401510200604, guid: 51202e3c62c3d3e1c9bb0ff9c09a608f, type: 3} propertyPath: m_LocalRotation.y @@ -2382,7 +3148,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 2368094401510200604, guid: 51202e3c62c3d3e1c9bb0ff9c09a608f, type: 3} propertyPath: m_LocalRotation.z - value: 0 + value: -0 objectReference: {fileID: 0} - target: {fileID: 2368094401510200604, guid: 51202e3c62c3d3e1c9bb0ff9c09a608f, type: 3} propertyPath: m_LocalEulerAnglesHint.x @@ -2423,5 +3189,6 @@ SceneRoots: - {fileID: 518677617} - {fileID: 584591836} - {fileID: 1632951288} - - {fileID: 7547016027398857338} - {fileID: 1281046468} + - {fileID: 1914178467} + - {fileID: 1699158561} diff --git a/Assets/Scripts/Editor/PropertyDrawers/DurationPropertyDrawer.cs b/Assets/Scripts/Editor/PropertyDrawers/DurationPropertyDrawer.cs index 094388a..f9e9d37 100644 --- a/Assets/Scripts/Editor/PropertyDrawers/DurationPropertyDrawer.cs +++ b/Assets/Scripts/Editor/PropertyDrawers/DurationPropertyDrawer.cs @@ -1,34 +1,73 @@ +using System; using KitsuneCafe.System; using UnityEditor; -using UnityEditor.UIElements; using UnityEngine.UIElements; +using TimeUnit = KitsuneCafe.System.TimeUnit; [CustomPropertyDrawer(typeof(Duration))] public class DurationPropertyDrawer : PropertyDrawer { public override VisualElement CreatePropertyGUI(SerializedProperty property) { - var container = new VisualElement(); - container.style.flexDirection = FlexDirection.Row; + return new DurationField(property); + } - var duration = new PropertyField( - property.FindPropertyRelative("displayValue"), - ObjectNames.NicifyVariableName(property.name) - ); + public class DurationField : VisualElement + { + public readonly SerializedProperty Property; + private readonly SerializedObject serializedObject; + private readonly SerializedProperty value; + private readonly SerializedProperty unit; + private readonly DoubleField durationField; - duration.style.flexGrow = 1; - - var unit = new EnumField + public DurationField(SerializedProperty property, string label = null) { - bindingPath = "unit" - }; + label ??= ObjectNames.NicifyVariableName(property.name); + style.flexDirection = FlexDirection.Row; - unit.style.flexGrow = 0; + Property = property; + serializedObject = property.serializedObject; + value = property.FindPropertyRelative("value"); + unit = property.FindPropertyRelative("unit"); - container.Add(duration); - container.Add(unit); + durationField = new DoubleField( + label + ) + { + value = Duration.ToDisplayValue(value.longValue, (TimeUnit)unit.intValue) + }; + + durationField.style.flexGrow = 1; + + var unitField = new EnumField + { + bindingPath = "unit" + }; + + unitField.style.flexGrow = 0; + + Add(durationField); + Add(unitField); + + AddToClassList(BaseField.ussClassName); + durationField.AddToClassList(BaseField.alignedFieldUssClassName); + + durationField.RegisterValueChangedCallback(OnValueChanged); + } + + private void OnValueChanged(ChangeEvent evt) + { + value.longValue = Duration.FromDisplayValue(evt.newValue, (TimeUnit)unit.intValue); + serializedObject.ApplyModifiedProperties(); + serializedObject.Update(); + } + + public new void RemoveFromHierarchy() + { + base.RemoveFromHierarchy(); + durationField.UnregisterCallback>(OnValueChanged); + } - return container; } } diff --git a/Assets/Scripts/Extension/Observable.cs b/Assets/Scripts/Extension/Observable.cs index aeff464..37c4eba 100644 --- a/Assets/Scripts/Extension/Observable.cs +++ b/Assets/Scripts/Extension/Observable.cs @@ -201,6 +201,11 @@ namespace KitsuneCafe.Extension { return component.ObserveBool(c => c.didStart); } + + public static Observable SelectOrDefault(this Observable source, Func selector) + { + return source.Select(value => EqualityComparer.Default.Equals(value, default) ? default : selector(value)); + } } } diff --git a/Assets/Scripts/Interaction/IInteractable.cs b/Assets/Scripts/Interaction/IInteractable.cs index 9bb83aa..9ea05ce 100644 --- a/Assets/Scripts/Interaction/IInteractable.cs +++ b/Assets/Scripts/Interaction/IInteractable.cs @@ -81,7 +81,9 @@ namespace KitsuneCafe.Interaction bool IsInteractable { get; } - virtual void Target(IInteractor interactor) { } + void Select(IInteractor interactor) { } + void Deselect(IInteractor interactor) { } + IResult Interact(IInteractor interactor); } } \ No newline at end of file diff --git a/Assets/Scripts/Interaction/Interactable.cs b/Assets/Scripts/Interaction/Interactable.cs index 47e1d7d..1609234 100644 --- a/Assets/Scripts/Interaction/Interactable.cs +++ b/Assets/Scripts/Interaction/Interactable.cs @@ -10,7 +10,10 @@ namespace KitsuneCafe.Interaction private bool oneTimeUse = false; [SerializeField] - private UnityEvent onTarget = default; + private UnityEvent onSelected = default; + + [SerializeField] + private UnityEvent onDeselected = default; [SerializeField] private UnityEvent onInteracted = default; @@ -19,12 +22,17 @@ namespace KitsuneCafe.Interaction public bool IsInteractable => isInteractable; - - void IInteractable.Target(IInteractor interactor) + void IInteractable.Select(IInteractor interactor) { - onTarget.Invoke(interactor); + onSelected.Invoke(interactor); } + void IInteractable.Deselect(IInteractor interactor) + { + onDeselected.Invoke(interactor); + } + + public IResult Interact(IInteractor interactor) { onInteracted.Invoke(interactor); diff --git a/Assets/Scripts/Interaction/Interactor.cs b/Assets/Scripts/Interaction/Interactor.cs index 2f027b7..7ab1f0f 100644 --- a/Assets/Scripts/Interaction/Interactor.cs +++ b/Assets/Scripts/Interaction/Interactor.cs @@ -20,6 +20,9 @@ namespace KitsuneCafe.Player [SerializeField] private new Collider collider; + [SerializeField] + private ReactiveValue selectedObject; + [SerializeField] private ReactiveEvent interactSource; @@ -30,21 +33,6 @@ namespace KitsuneCafe.Player private float minimumChangeDelta = 0.1f; private float sqrtMovementDelta; - - [SerializeField] - private Color outlineColor = Color.orangeRed; - - [SerializeField] - private int outlineWidth = 3; - - [SerializeField] - private Outline.Mode outlineMode = Outline.Mode.OutlineAll; - - private readonly ObservableHashSet interactables = new ObservableHashSet(); - public ReactiveProperty CurrentHighlightedInteractable { get; private set; } - - private Vector3 lastPosition; - public new T GetComponent() { return Root.GetComponent(); @@ -55,7 +43,7 @@ namespace KitsuneCafe.Player return root.TryGetComponent(out component); } - void Reset() + private void OnValidate() { root = gameObject; collider = GetComponent(); @@ -63,83 +51,34 @@ namespace KitsuneCafe.Player private void Awake() { - CurrentHighlightedInteractable = new ReactiveProperty(null); - lastPosition = transform.position; + selectedObject.Value = null; sqrtMovementDelta = Mathf.Sqrt(minimumChangeDelta); var d = Disposable.CreateBuilder(); - collider.OnTriggerEnterAsObservable() - .Subscribe(other => - { - if (other.TryGetComponent(out IInteractable interactable)) - { - interactables.Add(interactable); - } - }) - .AddTo(ref d); + var activeInteractables = TrackCollisions(collider, ref d); - collider.OnTriggerExitAsObservable() - .Subscribe(other => - { - if (other.TryGetComponent(out IInteractable interactable)) - { - interactables.Remove(interactable); - } - }) - .AddTo(ref d); - - Observable.Merge(InteractablesChanged(), PlayerMoved()) - .ThrottleFirstFrame(updateFrequency) + var selectedObjects = ObserveNearestInteractable( + PositionChanged(transform, sqrtMovementDelta), + activeInteractables + ) .DefaultIfEmpty() - .Select(_ => - { - var closest = interactables - .Where(x => x.IsInteractable && x.gameObject != null) - .MinBy(x => Vector3.SqrMagnitude(gameObject.transform.position - x.gameObject.transform.position)); - - return closest; - }) .DistinctUntilChanged() - .Subscribe(highlighted => - { - CurrentHighlightedInteractable.Value = highlighted; - }) - .AddTo(ref d); - - interactables.ObserveChanged() - .ThrottleFirstFrame(updateFrequency, UnityFrameProvider.FixedUpdate) - .Subscribe(_ => - { - var highlighted = interactables - .Where(x => x.IsInteractable) - .MinBy(x => collider.transform.position.SqrDistance(x.gameObject.transform.position)); - - if (CurrentHighlightedInteractable.Value != highlighted) - { - CurrentHighlightedInteractable.Value = highlighted; - } - }) - .AddTo(ref d); - - var highlightedInteractable = CurrentHighlightedInteractable - .Scan((prev, cur) => - { - UnhighlightInteractable(prev); - HighlightInteractable(cur); - return cur; - }); + .Do(selected => selectedObject.Value = selected?.gameObject) + .SelectOrDefault(go => go.TryGetComponent(out IInteractable i) ? i : null) + .Scan(null, SwapSelected); interactSource .AsObservable() - .WithLatestFrom(highlightedInteractable, (_, highlighted) => highlighted) + .WithLatestFrom(selectedObjects, (_, highlighted) => highlighted) .WhereNotNull() .Subscribe(interactable => { var result = interactable.Interact(this); + if (result.IsOk) { - interactables.Remove(interactable); + activeInteractables.Remove(interactable); } else { @@ -151,46 +90,61 @@ namespace KitsuneCafe.Player d.RegisterTo(destroyCancellationToken); } - private Observable InteractablesChanged() + private ObservableHashSet TrackCollisions(Collider collider, ref DisposableBuilder d) { - return interactables.ObserveChanged().Select(_ => Unit.Default); + var interactables = new ObservableHashSet(); + + collider.OnTriggerEnterAsObservable() + .Subscribe(other => + { + if (other.TryGetComponent(out T interactable)) + { + interactables.Add(interactable); + } + }) + .AddTo(ref d); + + collider.OnTriggerExitAsObservable() + .Subscribe(other => + { + if (other.TryGetComponent(out T interactable)) + { + interactables.Remove(interactable); + } + }) + .AddTo(ref d); + + return interactables; } - private Observable PlayerMoved() + private Observable PositionChanged(Transform target, float delta, FrameProvider frameProvider = null) { - return Observable.EveryUpdate(UnityFrameProvider.FixedUpdate) - .Select(_ => transform.position) - .Where(pos => pos.SqrDistance(lastPosition) > sqrtMovementDelta) - .Do(pos => lastPosition = pos) - .Select(_ => Unit.Default); + frameProvider ??= UnityFrameProvider.FixedUpdate; + return Observable.EveryValueChanged(target, t => t.position, frameProvider) + .Scan((prev, cur) => cur.SqrDistance(prev) > delta ? cur : prev); } - private void HighlightInteractable(IInteractable interactable) + private Observable ObserveNearestInteractable(Observable positionSource, IObservableCollection interactables) { - if (interactable == null) { return; } - - interactable.Target(this); - - if (!interactable.TryGetComponent(out Outline outline)) - { - outline = interactable.gameObject.AddComponent(); - - outline.OutlineColor = outlineColor; - outline.OutlineWidth = outlineWidth; - outline.OutlineMode = outlineMode; - } - - outline.enabled = true; + return Observable.CombineLatest( + interactables.ObserveChanged(), + positionSource, + (_, position) => Nearest(position, interactables) + ); } - private void UnhighlightInteractable(IInteractable interactable) + private IInteractable Nearest(Vector3 origin, IObservableCollection interactables) { - if (interactable == null) { return; } + return interactables + .Where(x => x.IsInteractable) + .MinBy(x => origin.SqrDistance(x.gameObject.transform.position)); + } - if (interactable.TryGetComponent(out Outline outline)) - { - outline.enabled = false; - } + private IInteractable SwapSelected(IInteractable previous, IInteractable current) + { + previous?.Deselect(this); + current?.Select(this); + return current; } } } \ No newline at end of file diff --git a/Assets/Scripts/Interaction/SelectedObjectHandler.cs b/Assets/Scripts/Interaction/SelectedObjectHandler.cs new file mode 100644 index 0000000..84e8fd4 --- /dev/null +++ b/Assets/Scripts/Interaction/SelectedObjectHandler.cs @@ -0,0 +1,74 @@ +using KitsuneCafe.SOAP; +using R3; +using UnityEngine; + +namespace KitsuneCafe.Interaction +{ + public class SelectedObjectHandler : MonoBehaviour + { + [SerializeField] + private GameObjectValue selectedObject; + + [Header("Default Outline")] + [SerializeField] + private Color color = Color.orangeRed; + + [SerializeField] + private float width = 1f; + + [SerializeField] + private Outline.Mode mode = Outline.Mode.OutlineAll; + + private void Awake() + { + selectedObject + .AsObservable() + .Scan(null, SwapObjects) + .Subscribe() + .AddTo(this); + } + + private GameObject SwapObjects(GameObject previous, GameObject current) + { + + if (previous != null) + { + DeselectObject(previous); + } + + if (current != null) + { + SelectObject(current); + } + + return current; + } + + private void DeselectObject(GameObject gameObject) + { + if (gameObject.TryGetComponent(out Outline outline)) + { + outline.enabled = false; + } + } + + private Outline AddSelectionEffect(GameObject gameObject) + { + var outline = gameObject.AddComponent(); + outline.OutlineColor = color; + outline.OutlineWidth = width; + outline.OutlineMode = mode; + return outline; + } + + private void SelectObject(GameObject gameObject) + { + if (!gameObject.TryGetComponent(out Outline outline)) + { + outline = AddSelectionEffect(gameObject); + } + + outline.enabled = true; + } + } +} diff --git a/Assets/Scripts/Interaction/SelectedObjectHandler.cs.meta b/Assets/Scripts/Interaction/SelectedObjectHandler.cs.meta new file mode 100644 index 0000000..259aec5 --- /dev/null +++ b/Assets/Scripts/Interaction/SelectedObjectHandler.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 982ec8c450193224282e5b6e15ed3f18 \ No newline at end of file diff --git a/Assets/Scripts/SOAP/ReactiveValue.cs b/Assets/Scripts/SOAP/ReactiveValue.cs index 9e82396..00e5393 100644 --- a/Assets/Scripts/SOAP/ReactiveValue.cs +++ b/Assets/Scripts/SOAP/ReactiveValue.cs @@ -6,7 +6,7 @@ namespace KitsuneCafe.SOAP public class ReactiveValue : ReactiveSource { #if UNITY_EDITOR - [Multiline] + [TextArea] public string Description = ""; #endif diff --git a/Assets/Scripts/SOAP/Value/GameObjectValue.cs b/Assets/Scripts/SOAP/Value/GameObjectValue.cs new file mode 100644 index 0000000..e0a3799 --- /dev/null +++ b/Assets/Scripts/SOAP/Value/GameObjectValue.cs @@ -0,0 +1,13 @@ +using KitsuneCafe.System; +using UnityEngine; + +namespace KitsuneCafe.SOAP +{ + [CreateAssetMenu(fileName = "GameObjectValue", menuName = KitsuneCafeMenu.SoapValue + "GameObject")] + public class GameObjectValue : ReactiveValue + { + + } +} + + diff --git a/Assets/Scripts/SOAP/Value/GameObjectValue.cs.meta b/Assets/Scripts/SOAP/Value/GameObjectValue.cs.meta new file mode 100644 index 0000000..7f874be --- /dev/null +++ b/Assets/Scripts/SOAP/Value/GameObjectValue.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: c3b21f732f40c4e4cb96718b2e8e33bb \ No newline at end of file diff --git a/Assets/Scripts/System/Duration.cs b/Assets/Scripts/System/Duration.cs index 382d9ff..97319e7 100644 --- a/Assets/Scripts/System/Duration.cs +++ b/Assets/Scripts/System/Duration.cs @@ -1,5 +1,4 @@ using System; -using NUnit.Framework.Constraints; using UnityEngine; using UnityEngine.UIElements; @@ -16,11 +15,8 @@ namespace KitsuneCafe.System } [Serializable] - public struct Duration : IComparable, IComparable, IComparable, IEquatable, IEquatable, ISerializationCallbackReceiver + public struct Duration : IComparable, IComparable, IComparable, IEquatable, IEquatable { - [SerializeField] - private double displayValue; - [SerializeField, HideInInspector] private long value; @@ -29,7 +25,6 @@ namespace KitsuneCafe.System public Duration(long ticks, TimeUnit unit) { - displayValue = ToDisplayValue(ticks, unit); value = ticks; this.unit = unit; } @@ -78,16 +73,18 @@ namespace KitsuneCafe.System public static double ToDisplayValue(long ticks, TimeUnit unit) { - return unit switch + decimal value = unit switch { TimeUnit.Ticks => ticks, - TimeUnit.Milliseconds => ticks / TimeSpan.TicksPerMillisecond, - TimeUnit.Seconds => ticks / TimeSpan.TicksPerSecond, - TimeUnit.Minutes => ticks / TimeSpan.TicksPerMinute, - TimeUnit.Hours => ticks / TimeSpan.TicksPerHour, - TimeUnit.Days => ticks / TimeSpan.TicksPerHour, + TimeUnit.Milliseconds => (decimal)ticks / TimeSpan.TicksPerMillisecond, + TimeUnit.Seconds => (decimal)ticks / TimeSpan.TicksPerSecond, + TimeUnit.Minutes => (decimal)ticks / TimeSpan.TicksPerMinute, + TimeUnit.Hours => (decimal)ticks / TimeSpan.TicksPerHour, + TimeUnit.Days => (decimal)ticks / TimeSpan.TicksPerHour, var x => throw new ArgumentException($"{x} is not a valid TimeUnit.") }; + + return Convert.ToDouble(value); } public static long FromDisplayValue(double value, TimeUnit unit) @@ -168,15 +165,5 @@ namespace KitsuneCafe.System { return $"{value} {nameof(unit)}"; } - - public void OnBeforeSerialize() - { - displayValue = Into(); - } - - public void OnAfterDeserialize() - { - value = FromDisplayValue(displayValue, unit); - } } } diff --git a/Assets/Scripts/UI/Elements/ModalElement.cs b/Assets/Scripts/UI/Elements/ModalElement.cs index cf498b8..3d9a0fb 100644 --- a/Assets/Scripts/UI/Elements/ModalElement.cs +++ b/Assets/Scripts/UI/Elements/ModalElement.cs @@ -5,6 +5,37 @@ using UnityEngine.UIElements; namespace KitsuneCafe.UI { + public readonly struct HeadlessModalElementInstance : IUiElement + { + public readonly string Content; + + private readonly ModalElement so; + public readonly VisualTreeAsset VisualTreeAsset => so.VisualTreeAsset; + + public HeadlessModalElementInstance(string content, ModalElement so) + { + Content = content; + this.so = so; + } + + public VisualElement Instantiate() + { + var instance = VisualTreeAsset.CloneTree(); + Configure(instance); + return instance; + } + + public void Configure(VisualElement ve) + { + ve.Q(so.HeaderId).style.display = DisplayStyle.None; + ve.Q