diff --git a/Assets/Resources/Prefabs/Player/Player.prefab b/Assets/Resources/Prefabs/Player/Player.prefab index 70cd46a..f53b3c8 100644 --- a/Assets/Resources/Prefabs/Player/Player.prefab +++ b/Assets/Resources/Prefabs/Player/Player.prefab @@ -87,7 +87,7 @@ SpriteRenderer: m_GlobalIlluminationMeshLod: 0 m_SortingLayerID: 0 m_SortingLayer: 0 - m_SortingOrder: 4 + m_SortingOrder: 6 m_MaskInteraction: 0 m_Sprite: {fileID: 8271730618534065979, guid: 3994f202971bb7b40949ddc94ef4fd0e, type: 3} m_Color: {r: 1, g: 1, b: 1, a: 1} diff --git a/Assets/Resources/Scenes/LevelScene/ExampleScene.unity b/Assets/Resources/Scenes/LevelScene/ExampleScene.unity index 5e07cbc..2d26059 100644 --- a/Assets/Resources/Scenes/LevelScene/ExampleScene.unity +++ b/Assets/Resources/Scenes/LevelScene/ExampleScene.unity @@ -5137,6 +5137,7 @@ GameObject: - component: {fileID: 309926746} - component: {fileID: 309926749} - component: {fileID: 309926750} + - component: {fileID: 309926751} m_Layer: 0 m_Name: Main Camera m_TagString: MainCamera @@ -5278,6 +5279,30 @@ MonoBehaviour: lookDownAmount: 4 lookUpAmount: 4 offset: {x: 0, y: 0, z: -10} +--- !u!114 &309926751 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 309926745} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c88f5cead0c0b2a4eb05b5900433f8d1, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.RenderPipelines.Universal.2D.Runtime::UnityEngine.Rendering.Universal.PixelPerfectCamera + m_ComponentVersion: 1 + m_AssetsPPU: 16 + m_RefResolutionX: 228 + m_RefResolutionY: 128 + m_CropFrame: 0 + m_GridSnapping: 0 + m_FilterMode: 0 + m_UpscaleRT: 0 + m_PixelSnapping: 0 + m_CropFrameX: 0 + m_CropFrameY: 0 + m_StretchFill: 0 --- !u!1 &1105961119 GameObject: m_ObjectHideFlags: 0 @@ -5287,6 +5312,8 @@ GameObject: serializedVersion: 6 m_Component: - component: {fileID: 1105961120} + - component: {fileID: 1105961122} + - component: {fileID: 1105961121} m_Layer: 0 m_Name: SpawnPoint m_TagString: Untagged @@ -5310,6 +5337,101 @@ Transform: - {fileID: 1554208358} m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1105961121 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1105961119} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Runtime::UnityEngine.Rendering.Universal.UniversalAdditionalCameraData + m_RenderShadows: 1 + m_RequiresDepthTextureOption: 2 + m_RequiresOpaqueTextureOption: 2 + m_CameraType: 0 + m_Cameras: [] + m_RendererIndex: -1 + m_VolumeLayerMask: + serializedVersion: 2 + m_Bits: 1 + m_VolumeTrigger: {fileID: 0} + m_VolumeFrameworkUpdateModeOption: 2 + m_RenderPostProcessing: 0 + m_Antialiasing: 0 + m_AntialiasingQuality: 2 + m_StopNaN: 0 + m_Dithering: 0 + m_ClearDepth: 1 + m_AllowXRRendering: 1 + m_AllowHDROutput: 1 + m_UseScreenCoordOverride: 0 + m_ScreenSizeOverride: {x: 0, y: 0, z: 0, w: 0} + m_ScreenCoordScaleBias: {x: 0, y: 0, z: 0, w: 0} + m_RequiresDepthTexture: 0 + m_RequiresColorTexture: 0 + m_TaaSettings: + m_Quality: 3 + m_FrameInfluence: 0.1 + m_JitterScale: 1 + m_MipBias: 0 + m_VarianceClampScale: 0.9 + m_ContrastAdaptiveSharpening: 0 + m_Version: 2 +--- !u!20 &1105961122 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1105961119} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 1 + m_BackGroundColor: {r: 0.19215687, g: 0.3019608, b: 0.4745098, a: 0} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_Iso: 200 + m_ShutterSpeed: 0.005 + m_Aperture: 16 + m_FocusDistance: 10 + m_FocalLength: 50 + m_BladeCount: 5 + m_Curvature: {x: 2, y: 11} + m_BarrelClipping: 0.25 + m_Anamorphism: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 --- !u!1 &1180046187 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/Resources/Scenes/LevelScene/Level_1.unity b/Assets/Resources/Scenes/LevelScene/Level_1.unity index b8d4547..be30c1f 100644 --- a/Assets/Resources/Scenes/LevelScene/Level_1.unity +++ b/Assets/Resources/Scenes/LevelScene/Level_1.unity @@ -5243,6 +5243,7 @@ GameObject: - component: {fileID: 309926746} - component: {fileID: 309926749} - component: {fileID: 309926750} + - component: {fileID: 309926751} m_Layer: 0 m_Name: Main Camera m_TagString: MainCamera @@ -5384,6 +5385,30 @@ MonoBehaviour: lookDownAmount: 4 lookUpAmount: 4 offset: {x: 0, y: 0, z: -10} +--- !u!114 &309926751 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 309926745} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c88f5cead0c0b2a4eb05b5900433f8d1, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.RenderPipelines.Universal.2D.Runtime::UnityEngine.Rendering.Universal.PixelPerfectCamera + m_ComponentVersion: 1 + m_AssetsPPU: 16 + m_RefResolutionX: 228 + m_RefResolutionY: 128 + m_CropFrame: 0 + m_GridSnapping: 0 + m_FilterMode: 0 + m_UpscaleRT: 0 + m_PixelSnapping: 0 + m_CropFrameX: 0 + m_CropFrameY: 0 + m_StretchFill: 0 --- !u!1001 &679319475 PrefabInstance: m_ObjectHideFlags: 0 diff --git a/Assets/Resources/Scenes/LevelScene/Level_2.unity b/Assets/Resources/Scenes/LevelScene/Level_2.unity index 9e07154..28bae10 100644 --- a/Assets/Resources/Scenes/LevelScene/Level_2.unity +++ b/Assets/Resources/Scenes/LevelScene/Level_2.unity @@ -5240,6 +5240,7 @@ GameObject: - component: {fileID: 309926746} - component: {fileID: 309926749} - component: {fileID: 309926750} + - component: {fileID: 309926751} m_Layer: 0 m_Name: Main Camera m_TagString: MainCamera @@ -5381,6 +5382,30 @@ MonoBehaviour: lookDownAmount: 4 lookUpAmount: 4 offset: {x: 0, y: 0, z: -10} +--- !u!114 &309926751 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 309926745} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c88f5cead0c0b2a4eb05b5900433f8d1, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.RenderPipelines.Universal.2D.Runtime::UnityEngine.Rendering.Universal.PixelPerfectCamera + m_ComponentVersion: 1 + m_AssetsPPU: 16 + m_RefResolutionX: 228 + m_RefResolutionY: 128 + m_CropFrame: 0 + m_GridSnapping: 0 + m_FilterMode: 0 + m_UpscaleRT: 0 + m_PixelSnapping: 0 + m_CropFrameX: 0 + m_CropFrameY: 0 + m_StretchFill: 0 --- !u!1001 &571674481 PrefabInstance: m_ObjectHideFlags: 0 diff --git a/Assets/Resources/Scenes/LevelScene/Level_3.unity b/Assets/Resources/Scenes/LevelScene/Level_3.unity index 576346a..dd27e14 100644 --- a/Assets/Resources/Scenes/LevelScene/Level_3.unity +++ b/Assets/Resources/Scenes/LevelScene/Level_3.unity @@ -6968,6 +6968,7 @@ GameObject: - component: {fileID: 309926746} - component: {fileID: 309926749} - component: {fileID: 309926750} + - component: {fileID: 309926751} m_Layer: 0 m_Name: Main Camera m_TagString: MainCamera @@ -7109,6 +7110,30 @@ MonoBehaviour: lookDownAmount: 4 lookUpAmount: 4 offset: {x: 0, y: 0, z: -10} +--- !u!114 &309926751 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 309926745} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c88f5cead0c0b2a4eb05b5900433f8d1, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.RenderPipelines.Universal.2D.Runtime::UnityEngine.Rendering.Universal.PixelPerfectCamera + m_ComponentVersion: 1 + m_AssetsPPU: 16 + m_RefResolutionX: 228 + m_RefResolutionY: 128 + m_CropFrame: 0 + m_GridSnapping: 0 + m_FilterMode: 0 + m_UpscaleRT: 0 + m_PixelSnapping: 0 + m_CropFrameX: 0 + m_CropFrameY: 0 + m_StretchFill: 0 --- !u!1001 &434005055 PrefabInstance: m_ObjectHideFlags: 0 diff --git a/Assets/Resources/Scenes/LevelScene/Level_4.unity b/Assets/Resources/Scenes/LevelScene/Level_4.unity index a99af65..e893deb 100644 --- a/Assets/Resources/Scenes/LevelScene/Level_4.unity +++ b/Assets/Resources/Scenes/LevelScene/Level_4.unity @@ -2047,6 +2047,7 @@ GameObject: - component: {fileID: 309926746} - component: {fileID: 309926749} - component: {fileID: 309926750} + - component: {fileID: 309926751} m_Layer: 0 m_Name: Main Camera m_TagString: MainCamera @@ -2188,6 +2189,30 @@ MonoBehaviour: lookDownAmount: 4 lookUpAmount: 4 offset: {x: 0, y: 0, z: -10} +--- !u!114 &309926751 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 309926745} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c88f5cead0c0b2a4eb05b5900433f8d1, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.RenderPipelines.Universal.2D.Runtime::UnityEngine.Rendering.Universal.PixelPerfectCamera + m_ComponentVersion: 1 + m_AssetsPPU: 16 + m_RefResolutionX: 228 + m_RefResolutionY: 128 + m_CropFrame: 0 + m_GridSnapping: 0 + m_FilterMode: 0 + m_UpscaleRT: 0 + m_PixelSnapping: 0 + m_CropFrameX: 0 + m_CropFrameY: 0 + m_StretchFill: 0 --- !u!1001 &698513172 PrefabInstance: m_ObjectHideFlags: 0 diff --git a/Assets/Resources/Scenes/LevelScene/Level_5.unity b/Assets/Resources/Scenes/LevelScene/Level_5.unity index d165fe8..9316df3 100644 --- a/Assets/Resources/Scenes/LevelScene/Level_5.unity +++ b/Assets/Resources/Scenes/LevelScene/Level_5.unity @@ -2355,6 +2355,7 @@ GameObject: - component: {fileID: 309926746} - component: {fileID: 309926749} - component: {fileID: 309926750} + - component: {fileID: 309926751} m_Layer: 0 m_Name: Main Camera m_TagString: MainCamera @@ -2496,6 +2497,30 @@ MonoBehaviour: lookDownAmount: 4 lookUpAmount: 4 offset: {x: 0, y: 0, z: -10} +--- !u!114 &309926751 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 309926745} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c88f5cead0c0b2a4eb05b5900433f8d1, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.RenderPipelines.Universal.2D.Runtime::UnityEngine.Rendering.Universal.PixelPerfectCamera + m_ComponentVersion: 1 + m_AssetsPPU: 16 + m_RefResolutionX: 228 + m_RefResolutionY: 128 + m_CropFrame: 0 + m_GridSnapping: 0 + m_FilterMode: 0 + m_UpscaleRT: 0 + m_PixelSnapping: 0 + m_CropFrameX: 0 + m_CropFrameY: 0 + m_StretchFill: 0 --- !u!1001 &462510107 PrefabInstance: m_ObjectHideFlags: 0 diff --git a/Assets/Resources/Scenes/LevelScene/Level_6.unity b/Assets/Resources/Scenes/LevelScene/Level_6.unity index 3962cbb..bd9ad46 100644 --- a/Assets/Resources/Scenes/LevelScene/Level_6.unity +++ b/Assets/Resources/Scenes/LevelScene/Level_6.unity @@ -4965,6 +4965,7 @@ GameObject: - component: {fileID: 309926746} - component: {fileID: 309926749} - component: {fileID: 309926750} + - component: {fileID: 309926751} m_Layer: 0 m_Name: Main Camera m_TagString: MainCamera @@ -5008,9 +5009,9 @@ Camera: m_NormalizedViewPortRect: serializedVersion: 2 x: 0 - y: 0 + y: 0.0037037036 width: 1 - height: 1 + height: 0.9925926 near clip plane: 0.3 far clip plane: 1000 field of view: 60 @@ -5106,6 +5107,30 @@ MonoBehaviour: lookDownAmount: 4 lookUpAmount: 4 offset: {x: 0, y: 0, z: -10} +--- !u!114 &309926751 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 309926745} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: c88f5cead0c0b2a4eb05b5900433f8d1, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.RenderPipelines.Universal.2D.Runtime::UnityEngine.Rendering.Universal.PixelPerfectCamera + m_ComponentVersion: 1 + m_AssetsPPU: 16 + m_RefResolutionX: 228 + m_RefResolutionY: 128 + m_CropFrame: 0 + m_GridSnapping: 0 + m_FilterMode: 0 + m_UpscaleRT: 0 + m_PixelSnapping: 0 + m_CropFrameX: 0 + m_CropFrameY: 0 + m_StretchFill: 0 --- !u!1 &1105961119 GameObject: m_ObjectHideFlags: 0 @@ -5538,7 +5563,7 @@ PrefabInstance: m_Modifications: - target: {fileID: 157655442561767499, guid: 89d1343a9ab90d448b8aa2bdba1fb6d1, type: 3} propertyPath: m_LocalPosition.x - value: -2.5157971 + value: -16.71 objectReference: {fileID: 0} - target: {fileID: 157655442561767499, guid: 89d1343a9ab90d448b8aa2bdba1fb6d1, type: 3} propertyPath: m_LocalPosition.y diff --git a/Assets/Resources/Scripts/Player/PlayerController.cs b/Assets/Resources/Scripts/Player/PlayerController.cs index 64174ed..05887e9 100644 --- a/Assets/Resources/Scripts/Player/PlayerController.cs +++ b/Assets/Resources/Scripts/Player/PlayerController.cs @@ -19,10 +19,9 @@ public class PlayerController : MonoBehaviour _playerMovement = GetComponent(); _inputRecorder = GetComponent(); } - + private void OnMove(InputValue value) { - if (GameManager.instance.gameState == GameState.Playing) { moveInputBuffer = value.Get(); } @@ -110,6 +109,11 @@ public class PlayerController : MonoBehaviour { return; } + + if (GameManager.instance.gameState == GameState.Pause) + { + moveInputBuffer = Vector2.zero; + } if (_isLookingDown || _isLookingUp) { diff --git a/Assets/Resources/Scripts/Prop/CheeseEnter.cs b/Assets/Resources/Scripts/Prop/CheeseEnter.cs index 9dffe4e..dba541a 100644 --- a/Assets/Resources/Scripts/Prop/CheeseEnter.cs +++ b/Assets/Resources/Scripts/Prop/CheeseEnter.cs @@ -1,3 +1,4 @@ +using Unity.Mathematics.Geometry; using UnityEngine; using UnityEngine.InputSystem; @@ -30,6 +31,8 @@ public class GoalTrigger : MonoBehaviour if (!isTriggered) { isTriggered = true; + CameraEffect cam = Camera.main.GetComponent(); + cam.ZoomUpPlayer(1.5f, 0.5f); GameManager.instance.ClearLevel(); } } diff --git a/Assets/Resources/Scripts/Prop/WaterEnter.cs b/Assets/Resources/Scripts/Prop/WaterEnter.cs index c67c527..72ee35b 100644 --- a/Assets/Resources/Scripts/Prop/WaterEnter.cs +++ b/Assets/Resources/Scripts/Prop/WaterEnter.cs @@ -1,18 +1,41 @@ +using System; using UnityEngine; public class WaterEnter : MonoBehaviour { - private void OnTriggerEnter2D(Collider2D other) + private bool isPlayerEnterWater = false; + + private async void OnTriggerEnter2D(Collider2D other) { Debug.Log(other.gameObject.name); if (other.tag == "Player") { - GameManager.instance.PlayerDie(); - } else if (other.tag == "Ghost") + isPlayerEnterWater = true; + other.GetComponent().enabled = false; + + await Awaitable.WaitForSecondsAsync(3f); + if (isPlayerEnterWater) + { + GameManager.instance.PlayerDie(); + } + } + else if (other.tag == "Ghost") { other.GetComponent().enabled = false; other.GetComponent().enabled = false; other.GetComponent().SetTrigger("Die"); } } + + private void OnTriggerExit2D(Collider2D other) + { + if(other.tag.Equals("Player") || other.tag.Equals("Ghost")) + { + other.GetComponent().enabled = true; + if (other.tag.Equals("Player")) + { + isPlayerEnterWater = false; + } + } + } } diff --git a/Assets/Resources/Scripts/Utility/CameraEffect.cs b/Assets/Resources/Scripts/Utility/CameraEffect.cs index a32539a..c39337f 100644 --- a/Assets/Resources/Scripts/Utility/CameraEffect.cs +++ b/Assets/Resources/Scripts/Utility/CameraEffect.cs @@ -1,19 +1,19 @@ using System; using System.Collections; using UnityEngine; +using UnityEngine.Rendering.Universal; +using UnityEngine.U2D; public class CameraEffect : MonoBehaviour { - private Camera _camara; + private Camera _camera; + private PixelPerfectCamera _ppc; private Transform target; [SerializeField] float smoothTime = 0.3f; - [SerializeField] private float lookDownAmount = 4f; [SerializeField] private float lookUpAmount = 4f; - - // 오프셋 [SerializeField] private Vector3 offset = new Vector3(0, 0, -10f); private float defaultYOffset; @@ -22,16 +22,19 @@ public class CameraEffect : MonoBehaviour private void Start() { defaultYOffset = offset.y; - target = GameObject.FindGameObjectWithTag("Player").transform; - _camara = gameObject.GetComponent(); + _camera = GetComponent(); + _ppc = GetComponent(); + + GameObject player = GameObject.FindGameObjectWithTag("Player"); + if (player != null) + { + target = player.transform; + } } private void LateUpdate() { - if (target == null) - { - return; - } + if (target == null) return; Vector3 targetPosition = target.position + offset; transform.position = Vector3.SmoothDamp(transform.position, targetPosition, ref _velocity, smoothTime); @@ -58,9 +61,30 @@ public class CameraEffect : MonoBehaviour } } - public void ZoomUpPlayer(float zoomAmout) + public async void ZoomUpPlayer(float zoomAmount, float time) { - _camara.fieldOfView = zoomAmout; + if (_ppc == null) return; + _ppc.enabled = false; + + float startSize = _camera.orthographicSize; + float timer = 0f; + + while (timer < time) + { + timer += Time.deltaTime; + float t = timer / time; + _camera.orthographicSize = Mathf.Lerp(startSize, zoomAmount, t); + await Awaitable.NextFrameAsync(); + } + + _camera.orthographicSize = zoomAmount; + int targetResY = Mathf.RoundToInt(zoomAmount * 2 * _ppc.assetsPPU); + int targetResX = Mathf.RoundToInt(targetResY * (16f / 9f)); + + _ppc.refResolutionX = targetResX; + _ppc.refResolutionY = targetResY; + + _ppc.enabled = true; } public void PlayPreViewSequence(Action onComplete) @@ -70,8 +94,8 @@ public class CameraEffect : MonoBehaviour public IEnumerator PreviewSequence(Action onComplete) { - Transform player = GameObject.FindGameObjectWithTag("Player").transform; - target = player; + Transform player = GameObject.FindGameObjectWithTag("Player")?.transform; + if (player != null) target = player; yield return new WaitForSeconds(2f); GameObject cheese = GameObject.FindGameObjectWithTag("Cheese"); @@ -81,7 +105,7 @@ public class CameraEffect : MonoBehaviour yield return new WaitForSeconds(2f); } - target = player; + if (player != null) target = player; yield return new WaitForSeconds(1f); onComplete?.Invoke(); }