From af27bb0230af0e1a6ee5641b752f01ad00eb3b6b Mon Sep 17 00:00:00 2001 From: henrisel Date: Tue, 27 Jan 2026 18:38:20 +0200 Subject: [PATCH] shape scanner improvements: add handle, destroy scannable object on completion, correctly detect when new object is generated --- 3d-generation-pipeline/README.md | 4 - .../ModelGeneration/ShapeScanner.prefab | 272 ++++++++++++++++-- .../ModelGeneration/ShapeScannerRay.prefab | 4 +- .../_PROJECT/Scenes/DeltaBuilding_base.unity | 4 +- .../ArcheryRange/MicrophoneStand.cs | 10 +- .../ShapeDetectionMinigameController.cs | 8 +- .../ShapeDetection/ShapeScanner.cs | 27 +- 7 files changed, 299 insertions(+), 30 deletions(-) diff --git a/3d-generation-pipeline/README.md b/3d-generation-pipeline/README.md index 42768817..17690fde 100644 --- a/3d-generation-pipeline/README.md +++ b/3d-generation-pipeline/README.md @@ -2,13 +2,9 @@ * user flow: grab item? mida krabada * võtta spawnitud mudeli mõõtmed: meshcollideri max x, max y, etc? bounding box? * shape scanner: - * initialisation correct number of confs - * mitte-liigutatavaks, aga samal ajal kõrgus dünaamiliselt õige. või lihtsalt piisavalt madalale asetada või väljaulatuv kang millest krabada * peenikesemad kiired * mitte lihtsalt ontriggerenter ja -exit, sest kui mitu objekti lähevad samal ajal sisse - * kui mudel despawnib shape scanneri kiirte sees olles siis collision detection läheb katki * mustad kiired on halvasti nähtavad pruuni materjali taustal - * kui üks config completed, siis mängijale aru saada: sound effect, "loading" * speech-to-text: * vana tekst ei kao ära * kogu tekst muutub ootamatult "Silence"-iks diff --git a/Assets/_PROJECT/Prefabs/ModelGeneration/ShapeScanner.prefab b/Assets/_PROJECT/Prefabs/ModelGeneration/ShapeScanner.prefab index b0ce4223..fff37eab 100644 --- a/Assets/_PROJECT/Prefabs/ModelGeneration/ShapeScanner.prefab +++ b/Assets/_PROJECT/Prefabs/ModelGeneration/ShapeScanner.prefab @@ -1,5 +1,112 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: +--- !u!1 &709153202497655716 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 3247357557719671279} + - component: {fileID: 7256125702820162016} + - component: {fileID: 8711103819910437103} + - component: {fileID: 2373810972321806103} + m_Layer: 2 + m_Name: Handle (1) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &3247357557719671279 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 709153202497655716} + m_LocalRotation: {x: -0.92387974, y: -0.3826829, z: 0.000000113925715, w: -0.00000035363863} + m_LocalPosition: {x: -0.406, y: -0.242, z: -0.009} + m_LocalScale: {x: 0.036143623, y: 0.16946283, z: 0.036143623} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 8294461198356057691} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: -180, y: 0, z: -45} +--- !u!33 &7256125702820162016 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 709153202497655716} + m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &8711103819910437103 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 709153202497655716} + 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_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: a8775aa86c058ce4986d3749a7d0c86e, 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!136 &2373810972321806103 +CapsuleCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 709153202497655716} + 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: 2 + m_Radius: 0.5000001 + m_Height: 2 + m_Direction: 1 + m_Center: {x: 0.000000059604645, y: 0, z: -0.00000008940697} --- !u!1 &1013838101896458198 GameObject: m_ObjectHideFlags: 0 @@ -12,7 +119,7 @@ GameObject: - component: {fileID: 2969912182040882308} - component: {fileID: 2891308580412767560} - component: {fileID: 8157435207705226294} - m_Layer: 0 + m_Layer: 2 m_Name: Cube (1) m_TagString: Untagged m_Icon: {fileID: 0} @@ -27,7 +134,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1013838101896458198} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalPosition: {x: 0, y: 0.143, z: 0} m_LocalScale: {x: 0.6, y: 0.03, z: 0.6} m_ConstrainProportionsScale: 0 m_Children: [] @@ -116,7 +223,7 @@ GameObject: - component: {fileID: 8594417542550664647} - component: {fileID: 7869926060146003813} - component: {fileID: 5476518908687164580} - m_Layer: 0 + m_Layer: 2 m_Name: CurrentConfigurationDisplay m_TagString: Untagged m_Icon: {fileID: 0} @@ -254,7 +361,7 @@ GameObject: serializedVersion: 6 m_Component: - component: {fileID: 8025195334996356355} - m_Layer: 0 + m_Layer: 2 m_Name: Corner2 m_TagString: Untagged m_Icon: {fileID: 0} @@ -285,7 +392,7 @@ GameObject: serializedVersion: 6 m_Component: - component: {fileID: 4362133469817120903} - m_Layer: 0 + m_Layer: 2 m_Name: RayParent m_TagString: Untagged m_Icon: {fileID: 0} @@ -300,7 +407,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1598434951760464124} m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: -0.225, z: 0} + m_LocalPosition: {x: 0, y: -0.082, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: @@ -320,7 +427,7 @@ GameObject: - component: {fileID: 6932860525531626823} - component: {fileID: 7714109504095032940} - component: {fileID: 6725626179204001352} - m_Layer: 0 + m_Layer: 2 m_Name: Panel m_TagString: Untagged m_Icon: {fileID: 0} @@ -399,7 +506,7 @@ GameObject: - component: {fileID: 8384342510111058824} - component: {fileID: 5271028056213577304} - component: {fileID: 903504955742171526} - m_Layer: 0 + m_Layer: 2 m_Name: Cube m_TagString: Untagged m_Icon: {fileID: 0} @@ -414,7 +521,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 3769602036287398038} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: -0.5, z: 0} + m_LocalPosition: {x: 0, y: -0.357, z: 0} m_LocalScale: {x: 0.6, y: 0.03, z: 0.6} m_ConstrainProportionsScale: 0 m_Children: [] @@ -501,7 +608,7 @@ GameObject: serializedVersion: 6 m_Component: - component: {fileID: 4055409281532582849} - m_Layer: 0 + m_Layer: 2 m_Name: Corner1 m_TagString: Untagged m_Icon: {fileID: 0} @@ -534,7 +641,7 @@ GameObject: - component: {fileID: 6492405423818451632} - component: {fileID: 489185111762359262} - component: {fileID: 7443612957244256760} - m_Layer: 0 + m_Layer: 2 m_Name: CorrectPercentageDisplay m_TagString: Untagged m_Icon: {fileID: 0} @@ -673,7 +780,8 @@ GameObject: - component: {fileID: 1587203061162103481} - component: {fileID: 6146655625910388013} - component: {fileID: 4552742491559429175} - m_Layer: 0 + - component: {fileID: 5496564390542954758} + m_Layer: 2 m_Name: ShapeScanner m_TagString: Untagged m_Icon: {fileID: 0} @@ -692,6 +800,8 @@ Transform: m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 m_Children: + - {fileID: 8855038928906100706} + - {fileID: 3247357557719671279} - {fileID: 4967077837470103189} - {fileID: 1593515563768306183} - {fileID: 4362133469817120903} @@ -783,7 +893,9 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: m_InteractionManager: {fileID: 0} - m_Colliders: [] + m_Colliders: + - {fileID: 3751126057824971022} + - {fileID: 2373810972321806103} m_InteractionLayerMask: serializedVersion: 2 m_Bits: 4294967295 @@ -859,7 +971,7 @@ MonoBehaviour: m_OnDeactivate: m_PersistentCalls: m_Calls: [] - m_AttachTransform: {fileID: 0} + m_AttachTransform: {fileID: 8855038928906100706} m_SecondaryAttachTransform: {fileID: 0} m_UseDynamicAttach: 1 m_MatchAttachPosition: 1 @@ -905,6 +1017,27 @@ MonoBehaviour: m_StartingSingleGrabTransformers: [] m_StartingMultipleGrabTransformers: [] m_AddDefaultGrabTransformers: 1 +--- !u!65 &5496564390542954758 +BoxCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6798688590405535079} + 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: 0.75, y: 0.75, z: 0.75} + m_Center: {x: 0, y: 0, z: 0} --- !u!1 &8844992431392597936 GameObject: m_ObjectHideFlags: 0 @@ -917,7 +1050,7 @@ GameObject: - component: {fileID: 2825347825077556369} - component: {fileID: 3521071293198874823} - component: {fileID: 106131459206684253} - m_Layer: 0 + m_Layer: 2 m_Name: Canvas m_TagString: Untagged m_Icon: {fileID: 0} @@ -942,7 +1075,7 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} - m_AnchoredPosition: {x: 0, y: 0.16} + m_AnchoredPosition: {x: 0, y: 0.31300017} m_SizeDelta: {x: 50, y: 30} m_Pivot: {x: 0.5, y: 0.5} --- !u!223 &2825347825077556369 @@ -1007,3 +1140,110 @@ MonoBehaviour: m_BlockingMask: serializedVersion: 2 m_Bits: 4294967295 +--- !u!1 &9220381957138534729 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8855038928906100706} + - component: {fileID: 3571859133888751127} + - component: {fileID: 5654644871419857071} + - component: {fileID: 3751126057824971022} + m_Layer: 2 + m_Name: Handle + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &8855038928906100706 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9220381957138534729} + m_LocalRotation: {x: -0.3826839, y: -0.9238794, z: 0.00000033061798, w: -0.00000016950273} + m_LocalPosition: {x: -0.417, y: 0.013, z: -0.009} + m_LocalScale: {x: 0.036143623, y: 0.17785089, z: 0.036143623} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 8294461198356057691} + m_RootOrder: -1 + m_LocalEulerAnglesHint: {x: -180, y: 0, z: -135} +--- !u!33 &3571859133888751127 +MeshFilter: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9220381957138534729} + m_Mesh: {fileID: 10206, guid: 0000000000000000e000000000000000, type: 0} +--- !u!23 &5654644871419857071 +MeshRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9220381957138534729} + 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_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: a8775aa86c058ce4986d3749a7d0c86e, 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!136 &3751126057824971022 +CapsuleCollider: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 9220381957138534729} + 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: 2 + m_Radius: 0.5000001 + m_Height: 2 + m_Direction: 1 + m_Center: {x: 0.000000059604645, y: 0, z: -0.00000008940697} diff --git a/Assets/_PROJECT/Prefabs/ModelGeneration/ShapeScannerRay.prefab b/Assets/_PROJECT/Prefabs/ModelGeneration/ShapeScannerRay.prefab index 5fececc3..29424110 100644 --- a/Assets/_PROJECT/Prefabs/ModelGeneration/ShapeScannerRay.prefab +++ b/Assets/_PROJECT/Prefabs/ModelGeneration/ShapeScannerRay.prefab @@ -28,8 +28,8 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 8688612914795219519} m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0.259, y: 0.012, z: -0.26886} - m_LocalScale: {x: 0.035, y: 0.5, z: 0.035} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.025, y: 0.5, z: 0.025} m_ConstrainProportionsScale: 0 m_Children: [] m_Father: {fileID: 0} diff --git a/Assets/_PROJECT/Scenes/DeltaBuilding_base.unity b/Assets/_PROJECT/Scenes/DeltaBuilding_base.unity index 6e700227..9722823f 100644 --- a/Assets/_PROJECT/Scenes/DeltaBuilding_base.unity +++ b/Assets/_PROJECT/Scenes/DeltaBuilding_base.unity @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:575d75cee8477fd57b91ac07ccfc31b42b7befad969e8bfc8f75da3456222a57 -size 67905988 +oid sha256:defd3e6e7fe3df5288221f83613d5bb4f05e743f0c396d2ba20aa30023fb8b53 +size 67906882 diff --git a/Assets/_PROJECT/Scripts/ModeGeneration/ArcheryRange/MicrophoneStand.cs b/Assets/_PROJECT/Scripts/ModeGeneration/ArcheryRange/MicrophoneStand.cs index 75fe1499..820b1cf8 100644 --- a/Assets/_PROJECT/Scripts/ModeGeneration/ArcheryRange/MicrophoneStand.cs +++ b/Assets/_PROJECT/Scripts/ModeGeneration/ArcheryRange/MicrophoneStand.cs @@ -36,7 +36,10 @@ public class MicrophoneStand : MonoBehaviour microphoneOffStatus.SetActive(false); microphoneOnStatus.SetActive(true); AudioManager.Instance.PlayAttachedInstance(FMODEvents.Instance.RadioButton, gameObject); - npcController.SpeakVoiceLine(1); + if (npcController != null) + { + npcController.SpeakVoiceLine(1); + } fmodWhisperBridge.ActivateRecording(); } } @@ -49,7 +52,10 @@ public class MicrophoneStand : MonoBehaviour microphoneOffStatus.SetActive(true); microphoneOnStatus.SetActive(false); AudioManager.Instance.PlayAttachedInstance(FMODEvents.Instance.RadioButton, gameObject); - npcController.SpeakVoiceLine(2); + if (npcController != null) + { + npcController.SpeakVoiceLine(2); + } fmodWhisperBridge.DeactivateRecording(); } } diff --git a/Assets/_PROJECT/Scripts/ModeGeneration/ShapeDetection/ShapeDetectionMinigameController.cs b/Assets/_PROJECT/Scripts/ModeGeneration/ShapeDetection/ShapeDetectionMinigameController.cs index 5e37e154..e28cf087 100644 --- a/Assets/_PROJECT/Scripts/ModeGeneration/ShapeDetection/ShapeDetectionMinigameController.cs +++ b/Assets/_PROJECT/Scripts/ModeGeneration/ShapeDetection/ShapeDetectionMinigameController.cs @@ -55,8 +55,12 @@ public class ShapeDetectionMinigameController : MonoBehaviour GameObject spawnedObject = await ModelGenerationUtils.Instance.SpawnModel(encodedModel); InitializeSpawnedObject(spawnedObject); - // Destroy previous generated object - Destroy(GeneratedModel); + if (GeneratedModel != null) + { + // Destroy previous generated object (first move out of ShapeScanner to trigger OnTriggerExit + GeneratedModel.transform.position = Vector3.zero; + //Destroy(GeneratedModel); + } GeneratedModel = spawnedObject; modelGenerationButton.Deactivate(); diff --git a/Assets/_PROJECT/Scripts/ModeGeneration/ShapeDetection/ShapeScanner.cs b/Assets/_PROJECT/Scripts/ModeGeneration/ShapeDetection/ShapeScanner.cs index 8974a915..f7d0c220 100644 --- a/Assets/_PROJECT/Scripts/ModeGeneration/ShapeDetection/ShapeScanner.cs +++ b/Assets/_PROJECT/Scripts/ModeGeneration/ShapeDetection/ShapeScanner.cs @@ -42,6 +42,8 @@ public class ShapeScanner : MonoBehaviour private int rayCount; private int correctRayStates; + private GameObject currentlyScannableObject; + // Start is called before the first frame update void Start() @@ -60,6 +62,22 @@ public class ShapeScanner : MonoBehaviour } + private void OnTriggerEnter(Collider other) + { + if (other.tag == rayPrefab.scannableTag) + { + currentlyScannableObject = other.gameObject; + } + } + + private void OnTriggerExit(Collider other) + { + if (other.tag == rayPrefab.scannableTag) + { + currentlyScannableObject = null; + } + } + private void InitializeConfiguration() { // Delete all existing rays first @@ -67,6 +85,11 @@ public class ShapeScanner : MonoBehaviour { Destroy(ray); } + if (currentlyScannableObject != null) + { + currentlyScannableObject.transform.position = Vector3.zero; + Destroy(currentlyScannableObject); + } ShapeScannerConfiguration configuration = configurations[currentConfiguration]; int rayRowCount = configuration.rows.Count; @@ -97,8 +120,6 @@ public class ShapeScanner : MonoBehaviour rayCount = configuration.rows.SelectMany(row => row.cells).Count(); correctRayStates = configuration.rows.SelectMany(row => row.cells).Count(cell => !cell); UpdateDisplay(calculateCorrectPercentage()); - - AudioManager.Instance.PlayAttachedInstance(FMODEvents.Instance.ShapeScannerSuccess, gameObject); } private float calculateCorrectPercentage() @@ -117,9 +138,11 @@ public class ShapeScanner : MonoBehaviour { currentConfiguration++; InitializeConfiguration(); + AudioManager.Instance.PlayAttachedInstance(FMODEvents.Instance.ShapeScannerSuccess, gameObject); } else { Debug.Log("Shape checker completed"); + AudioManager.Instance.PlayAttachedInstance(FMODEvents.Instance.ShapeScannerSuccess, gameObject); } } UpdateDisplay(correctPercentage);