From 1dfcee3d2c1c6424b994410255b93a20ba9f97cd Mon Sep 17 00:00:00 2001 From: Michal Pikulski Date: Wed, 3 Sep 2025 16:55:21 +0200 Subject: [PATCH] [Puzzles][Input] Update input handling to not mistakingly miss frames. Add debug frame input debugging. --- Assets/Resources.meta | 8 +++ Assets/Resources/Fonts.meta | 8 +++ Assets/Resources/Fonts/DebugFont.ttf | Bin 0 -> 61820 bytes Assets/Resources/Fonts/DebugFont.ttf.meta | 28 ++++++++ Assets/Scenes/AppleHillsOverworld.unity | 80 ++++++++++++++++++++++ Assets/Scripts/DebugUIMessage.cs | 19 +++-- Assets/Scripts/InputManager.cs | 42 +++++++++--- Assets/Scripts/ObjectiveStepBehaviour.cs | 13 ++-- Assets/Scripts/PuzzleManager.cs | 24 ++++++- 9 files changed, 196 insertions(+), 26 deletions(-) create mode 100644 Assets/Resources.meta create mode 100644 Assets/Resources/Fonts.meta create mode 100644 Assets/Resources/Fonts/DebugFont.ttf create mode 100644 Assets/Resources/Fonts/DebugFont.ttf.meta diff --git a/Assets/Resources.meta b/Assets/Resources.meta new file mode 100644 index 00000000..0622040f --- /dev/null +++ b/Assets/Resources.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: cfa619a4e508a184588b500e8b34ac81 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Fonts.meta b/Assets/Resources/Fonts.meta new file mode 100644 index 00000000..15e0e044 --- /dev/null +++ b/Assets/Resources/Fonts.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 42111873997850f4cbced0be4400e7f9 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Resources/Fonts/DebugFont.ttf b/Assets/Resources/Fonts/DebugFont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..babbc392318c113f7f74665b6ea8369afe458de1 GIT binary patch literal 61820 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 literal 0 HcmV?d00001 diff --git a/Assets/Resources/Fonts/DebugFont.ttf.meta b/Assets/Resources/Fonts/DebugFont.ttf.meta new file mode 100644 index 00000000..e14e6587 --- /dev/null +++ b/Assets/Resources/Fonts/DebugFont.ttf.meta @@ -0,0 +1,28 @@ +fileFormatVersion: 2 +guid: d7cffddcbc0cc8f4ebe6e28eb9804082 +TrueTypeFontImporter: + externalObjects: {} + serializedVersion: 4 + fontSize: 16 + forceTextureCase: -2 + characterSpacing: 0 + characterPadding: 1 + includeFontData: 1 + fontNames: + - Square + fallbackFontReferences: [] + customCharacters: + fontRenderingMode: 0 + ascentCalculationMode: 1 + useLegacyBoundsCalculation: 0 + shouldRoundAdvanceValue: 1 + userData: + assetBundleName: + assetBundleVariant: +AssetOrigin: + serializedVersion: 1 + productId: 216954 + packageName: Fatality FPS Gaming Font + packageVersion: 1.0 + assetPath: Assets/FPSFont/FPS Gaming Font/Square-Black.ttf + uploadId: 490185 diff --git a/Assets/Scenes/AppleHillsOverworld.unity b/Assets/Scenes/AppleHillsOverworld.unity index 647f57bc..a671c813 100644 --- a/Assets/Scenes/AppleHillsOverworld.unity +++ b/Assets/Scenes/AppleHillsOverworld.unity @@ -776,6 +776,85 @@ PrefabInstance: m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: b5fc01af35233eb4cbeede05e50a7c34, type: 3} +--- !u!1 &1255598765 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1255598768} + - component: {fileID: 1255598767} + - component: {fileID: 1255598766} + m_Layer: 0 + m_Name: EventSystem + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1255598766 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1255598765} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 01614664b831546d2ae94a42149d80ac, type: 3} + m_Name: + m_EditorClassIdentifier: + m_SendPointerHoverToParent: 1 + m_MoveRepeatDelay: 0.5 + m_MoveRepeatRate: 0.1 + m_XRTrackingOrigin: {fileID: 0} + m_ActionsAsset: {fileID: -944628639613478452, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + m_PointAction: {fileID: -1654692200621890270, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + m_MoveAction: {fileID: -8784545083839296357, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + m_SubmitAction: {fileID: 392368643174621059, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + m_CancelAction: {fileID: 7727032971491509709, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + m_LeftClickAction: {fileID: 3001919216989983466, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + m_MiddleClickAction: {fileID: -2185481485913320682, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + m_RightClickAction: {fileID: -4090225696740746782, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + m_ScrollWheelAction: {fileID: 6240969308177333660, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + m_TrackedDevicePositionAction: {fileID: 6564999863303420839, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + m_TrackedDeviceOrientationAction: {fileID: 7970375526676320489, guid: ca9f5fa95ffab41fb9a615ab714db018, type: 3} + m_DeselectOnBackgroundClick: 1 + m_PointerBehavior: 0 + m_CursorLockBehavior: 0 + m_ScrollDeltaPerTick: 6 +--- !u!114 &1255598767 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1255598765} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 76c392e42b5098c458856cdf6ecaaaa1, type: 3} + m_Name: + m_EditorClassIdentifier: + m_FirstSelected: {fileID: 0} + m_sendNavigationEvents: 1 + m_DragThreshold: 10 +--- !u!4 &1255598768 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1255598765} + 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!4 &1309036670 stripped Transform: m_CorrespondingSourceObject: {fileID: 3823830588451517910, guid: 301b4e0735896334f8f6fb9a68a7e419, type: 3} @@ -22995,3 +23074,4 @@ SceneRoots: - {fileID: 1950557796102186365} - {fileID: 638340961} - {fileID: 218805561} + - {fileID: 1255598768} diff --git a/Assets/Scripts/DebugUIMessage.cs b/Assets/Scripts/DebugUIMessage.cs index e9169168..d7dd2b2a 100644 --- a/Assets/Scripts/DebugUIMessage.cs +++ b/Assets/Scripts/DebugUIMessage.cs @@ -31,15 +31,23 @@ public class DebugUIMessage : MonoBehaviour textGO.transform.SetParent(canvas.transform); messageText = textGO.AddComponent(); messageText.alignment = TextAnchor.MiddleCenter; - messageText.font = Resources.GetBuiltinResource("Arial.ttf"); - messageText.fontSize = 32; + // Try to load a custom font from Resources/Fonts/DebugFont.ttf + Font customFont = Resources.Load("Fonts/DebugFont"); + if (customFont != null) + messageText.font = customFont; + else + messageText.font = Resources.GetBuiltinResource("LegacyRuntime.ttf"); + messageText.fontSize = 16; messageText.color = Color.yellow; + var outline = textGO.AddComponent(); + outline.effectColor = Color.black; + outline.effectDistance = new Vector2(2, -2); var rect = messageText.GetComponent(); - rect.anchorMin = new Vector2(0.5f, 0.1f); - rect.anchorMax = new Vector2(0.5f, 0.1f); + rect.anchorMin = new Vector2(0.5f, 0.5f); + rect.anchorMax = new Vector2(0.5f, 0.5f); rect.pivot = new Vector2(0.5f, 0.5f); rect.anchoredPosition = Vector2.zero; - rect.sizeDelta = new Vector2(800, 100); + rect.sizeDelta = new Vector2(400, 40); messageText.text = ""; } @@ -59,4 +67,3 @@ public class DebugUIMessage : MonoBehaviour messageText.enabled = false; } } - diff --git a/Assets/Scripts/InputManager.cs b/Assets/Scripts/InputManager.cs index 497a4f3a..844f1ed0 100644 --- a/Assets/Scripts/InputManager.cs +++ b/Assets/Scripts/InputManager.cs @@ -4,22 +4,41 @@ using System; public class InputManager : MonoBehaviour { - public static InputManager Instance { get; private set; } + private static InputManager _instance; + public static InputManager Instance + { + get + { + if (_instance == null) + { + _instance = FindAnyObjectByType(); + if (_instance == null) + { + var go = new GameObject("InputManager"); + _instance = go.AddComponent(); + DontDestroyOnLoad(go); + } + } + return _instance; + } + } + private PlayerInput playerInput; private InputAction touchPressAction; private InputAction touchPositionAction; private ITouchInputConsumer defaultConsumer; private bool isTouchHeld = false; + private bool lastFrameInteracted = false; void Awake() { - if (Instance != null && Instance != this) + if (_instance != null && _instance != this) { Destroy(gameObject); return; } - Instance = this; + _instance = this; DontDestroyOnLoad(gameObject); playerInput = GetComponent(); if (playerInput == null) @@ -62,17 +81,20 @@ public class InputManager : MonoBehaviour private void OnTouchPressStarted(InputAction.CallbackContext ctx) { // Touch started (finger down) - isTouchHeld = true; Vector3 _screenPos = Camera.main.ScreenToWorldPoint(touchPositionAction.ReadValue()); Vector2 screenPos = new Vector2(_screenPos.x, _screenPos.y); - if (!TryDelegateToInteractable(screenPos)) + lastFrameInteracted = TryDelegateToInteractable(screenPos); + if (!lastFrameInteracted) defaultConsumer?.OnTouchPress(screenPos); + isTouchHeld = true; } private void OnTouchPressCanceled(InputAction.CallbackContext ctx) { // Touch released (finger up) isTouchHeld = false; + // Reset lastFrameInteracted for next frame + lastFrameInteracted = false; // Optionally, you can notify consumers of release if needed } @@ -84,11 +106,8 @@ public class InputManager : MonoBehaviour // Convert to world position Vector3 worldPos = Camera.main.ScreenToWorldPoint(pos); Vector2 worldPos2D = new Vector2(worldPos.x, worldPos.y); - defaultConsumer?.OnTouchPress(worldPos2D); // Move continuously to finger position - } - else - { - defaultConsumer?.OnTouchPosition(pos); // For drag or hover + if (!lastFrameInteracted) + defaultConsumer?.OnTouchPress(worldPos2D); // Move continuously to finger position } } @@ -100,7 +119,8 @@ public class InputManager : MonoBehaviour Vector2 pos = touchPositionAction.ReadValue(); Vector3 worldPos = Camera.main.ScreenToWorldPoint(pos); Vector2 worldPos2D = new Vector2(worldPos.x, worldPos.y); - defaultConsumer?.OnTouchPress(worldPos2D); + if (!lastFrameInteracted) + defaultConsumer?.OnTouchPress(worldPos2D); } } diff --git a/Assets/Scripts/ObjectiveStepBehaviour.cs b/Assets/Scripts/ObjectiveStepBehaviour.cs index 434609ff..2c43ddbe 100644 --- a/Assets/Scripts/ObjectiveStepBehaviour.cs +++ b/Assets/Scripts/ObjectiveStepBehaviour.cs @@ -10,20 +10,21 @@ public class ObjectiveStepBehaviour : MonoBehaviour void Awake() { interactable = GetComponent(); + } + + void OnEnable() + { + if (interactable == null) + interactable = GetComponent(); if (interactable != null) - { interactable.Interacted += OnInteracted; - } - // Register with PuzzleManager PuzzleManager.Instance?.RegisterStepBehaviour(this); } - void OnDestroy() + void OnDisable() { if (interactable != null) - { interactable.Interacted -= OnInteracted; - } PuzzleManager.Instance?.UnregisterStepBehaviour(this); } diff --git a/Assets/Scripts/PuzzleManager.cs b/Assets/Scripts/PuzzleManager.cs index 5bbfcfd1..ac1ae759 100644 --- a/Assets/Scripts/PuzzleManager.cs +++ b/Assets/Scripts/PuzzleManager.cs @@ -3,7 +3,25 @@ using System.Collections.Generic; public class PuzzleManager : MonoBehaviour { - public static PuzzleManager Instance { get; private set; } + private static PuzzleManager _instance; + public static PuzzleManager Instance + { + get + { + if (_instance == null) + { + _instance = FindAnyObjectByType(); + if (_instance == null) + { + var go = new GameObject("PuzzleManager"); + _instance = go.AddComponent(); + DontDestroyOnLoad(go); + } + } + return _instance; + } + } + private HashSet completedSteps = new HashSet(); private HashSet unlockedSteps = new HashSet(); @@ -15,12 +33,12 @@ public class PuzzleManager : MonoBehaviour void Awake() { - if (Instance != null && Instance != this) + if (_instance != null && _instance != this) { Destroy(gameObject); return; } - Instance = this; + _instance = this; DontDestroyOnLoad(gameObject); }