[Player] Add dispatcher for cancelled movement and reset pickup correctly when move cancelled during pickup
This commit is contained in:
@@ -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<PlayerTouchController>();
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user