From 68592e851471e73157192ab1e4e806e94a7e1294 Mon Sep 17 00:00:00 2001 From: Michal Pikulski Date: Thu, 4 Sep 2025 11:19:05 +0200 Subject: [PATCH] [Player] Add dispatcher for cancelled movement and reset pickup correctly when move cancelled during pickup --- Assets/Scripts/Pickup.cs | 15 ++++++++++++--- Assets/Scripts/PlayerTouchController.cs | 2 ++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/Assets/Scripts/Pickup.cs b/Assets/Scripts/Pickup.cs index 9c06f31a..8c44b1ac 100644 --- a/Assets/Scripts/Pickup.cs +++ b/Assets/Scripts/Pickup.cs @@ -7,6 +7,7 @@ public class Pickup : MonoBehaviour private Interactable interactable; private bool pickupInProgress = false; + private PlayerTouchController cachedPlayerController; void Awake() { @@ -69,13 +70,11 @@ public class Pickup : MonoBehaviour private void OnInteracted() { if (pickupInProgress) return; - pickupInProgress = true; var playerObj = GameObject.FindGameObjectWithTag("Player"); var followerObj = GameObject.FindGameObjectWithTag("Pulver"); if (playerObj == null || followerObj == null) { Debug.LogWarning("Pickup: Player or Follower not found."); - pickupInProgress = false; return; } var playerController = playerObj.GetComponent(); @@ -83,17 +82,26 @@ public class Pickup : MonoBehaviour if (playerController == null || followerController == null) { Debug.LogWarning("Pickup: PlayerTouchController or FollowerController missing."); - pickupInProgress = false; return; } // Use GameManager for playerStopDistance and followerPickupDelay float playerStopDistance = GameManager.Instance.PlayerStopDistance; float followerPickupDelay = GameManager.Instance.FollowerPickupDelay; + // Subscribe to cancellation event + cachedPlayerController = playerController; void OnPlayerArrived() { playerController.OnArrivedAtTarget -= OnPlayerArrived; + playerController.OnMoveToCancelled -= OnPlayerMoveCancelled; + pickupInProgress = true; // Only lock when follower is about to be dispatched StartCoroutine(DispatchFollower()); } + void OnPlayerMoveCancelled() + { + playerController.OnArrivedAtTarget -= OnPlayerArrived; + playerController.OnMoveToCancelled -= OnPlayerMoveCancelled; + pickupInProgress = false; + } System.Collections.IEnumerator DispatchFollower() { yield return new WaitForSeconds(followerPickupDelay); @@ -111,6 +119,7 @@ public class Pickup : MonoBehaviour pickupInProgress = false; } playerController.OnArrivedAtTarget += OnPlayerArrived; + playerController.OnMoveToCancelled += OnPlayerMoveCancelled; Vector3 stopPoint = transform.position + (playerObj.transform.position - transform.position).normalized * playerStopDistance; playerController.MoveToAndNotify(stopPoint); } diff --git a/Assets/Scripts/PlayerTouchController.cs b/Assets/Scripts/PlayerTouchController.cs index 1e1665b7..1a666ef4 100644 --- a/Assets/Scripts/PlayerTouchController.cs +++ b/Assets/Scripts/PlayerTouchController.cs @@ -19,6 +19,7 @@ public class PlayerTouchController : MonoBehaviour, ITouchInputConsumer public delegate void ArrivedAtTargetHandler(); public event ArrivedAtTargetHandler OnArrivedAtTarget; + public event System.Action OnMoveToCancelled; private Coroutine moveToCoroutine; private bool interruptMoveTo = false; @@ -112,6 +113,7 @@ public class PlayerTouchController : MonoBehaviour, ITouchInputConsumer public void InterruptMoveTo() { interruptMoveTo = true; + OnMoveToCancelled?.Invoke(); } private System.Collections.IEnumerator MoveToTargetCoroutine(Vector3 target)