127 lines
4.5 KiB
C#
127 lines
4.5 KiB
C#
using UnityEngine;
|
|
|
|
public class Pickup : MonoBehaviour
|
|
{
|
|
public PickupItemData itemData;
|
|
public SpriteRenderer iconRenderer;
|
|
private Interactable interactable;
|
|
|
|
private bool pickupInProgress = false;
|
|
private PlayerTouchController cachedPlayerController;
|
|
|
|
void Awake()
|
|
{
|
|
if (iconRenderer == null)
|
|
iconRenderer = GetComponent<SpriteRenderer>();
|
|
interactable = GetComponent<Interactable>();
|
|
if (interactable != null)
|
|
{
|
|
interactable.Interacted += OnInteracted;
|
|
}
|
|
ApplyItemData();
|
|
}
|
|
|
|
void OnDestroy()
|
|
{
|
|
if (interactable != null)
|
|
{
|
|
interactable.Interacted -= OnInteracted;
|
|
}
|
|
}
|
|
|
|
#if UNITY_EDITOR
|
|
void OnValidate()
|
|
{
|
|
if (iconRenderer == null)
|
|
iconRenderer = GetComponent<SpriteRenderer>();
|
|
ApplyItemData();
|
|
}
|
|
|
|
void OnDrawGizmos()
|
|
{
|
|
// Use GameManager for playerStopDistance
|
|
float playerStopDistance = GameManager.Instance.PlayerStopDistance;
|
|
Gizmos.color = Color.yellow;
|
|
Gizmos.DrawWireSphere(transform.position, playerStopDistance);
|
|
GameObject playerObj = GameObject.FindGameObjectWithTag("Player");
|
|
if (playerObj != null)
|
|
{
|
|
Vector3 stopPoint = transform.position + (playerObj.transform.position - transform.position).normalized * playerStopDistance;
|
|
Gizmos.color = Color.cyan;
|
|
Gizmos.DrawSphere(stopPoint, 0.15f);
|
|
}
|
|
}
|
|
#endif
|
|
|
|
public void ApplyItemData()
|
|
{
|
|
if (itemData != null)
|
|
{
|
|
if (iconRenderer != null && itemData.mapSprite != null)
|
|
{
|
|
iconRenderer.sprite = itemData.mapSprite;
|
|
// Removed scaling logic, just set sprite
|
|
}
|
|
gameObject.name = itemData.itemName;
|
|
// Optionally update other fields, e.g. description
|
|
}
|
|
}
|
|
|
|
private void OnInteracted()
|
|
{
|
|
if (pickupInProgress) return;
|
|
var playerObj = GameObject.FindGameObjectWithTag("Player");
|
|
var followerObj = GameObject.FindGameObjectWithTag("Pulver");
|
|
if (playerObj == null || followerObj == null)
|
|
{
|
|
Debug.LogWarning("Pickup: Player or Follower not found.");
|
|
return;
|
|
}
|
|
var playerController = playerObj.GetComponent<PlayerTouchController>();
|
|
var followerController = followerObj.GetComponent<FollowerController>();
|
|
if (playerController == null || followerController == null)
|
|
{
|
|
Debug.LogWarning("Pickup: PlayerTouchController or FollowerController missing.");
|
|
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);
|
|
followerController.OnPickupArrived += OnFollowerArrived;
|
|
followerController.OnPickupReturned += OnFollowerReturned;
|
|
followerController.GoToPointAndReturn(transform.position, playerObj.transform);
|
|
}
|
|
void OnFollowerArrived()
|
|
{
|
|
followerController.OnPickupArrived -= OnFollowerArrived;
|
|
}
|
|
void OnFollowerReturned()
|
|
{
|
|
followerController.OnPickupReturned -= OnFollowerReturned;
|
|
pickupInProgress = false;
|
|
}
|
|
playerController.OnArrivedAtTarget += OnPlayerArrived;
|
|
playerController.OnMoveToCancelled += OnPlayerMoveCancelled;
|
|
Vector3 stopPoint = transform.position + (playerObj.transform.position - transform.position).normalized * playerStopDistance;
|
|
playerController.MoveToAndNotify(stopPoint);
|
|
}
|
|
}
|