using UnityEngine; using UnityEngine.Events; namespace MedievalShopkeeper { /// /// Base class for interactable shop entities (shelves, stock boxes, NPCs, registers). /// Can be added directly to objects with UnityEvents configured in the inspector, /// or inherited by specialized components like ShelfController or CustomerNPC. /// [SelectionBase] public class Interactable : MonoBehaviour, IInteractable { [Header("Interaction Settings")] [Tooltip("Text shown to the player when hovering/targeting this object.")] [SerializeField] private string prompt = "Interact"; [Tooltip("Max distance the player must be within to trigger interaction.")] [SerializeField] private float interactionRange = 2f; [Tooltip("Optional specific point where the player should stand. If unassigned, defaults to this transform.")] [SerializeField] private Transform interactionPoint; [Tooltip("Whether interaction is currently permitted.")] [SerializeField] private bool isInteractable = true; [Header("Events")] public UnityEvent onInteracted; public UnityEvent onHoverEnter; public UnityEvent onHoverExit; public virtual string InteractionPrompt => prompt; public virtual Transform InteractionTransform => interactionPoint != null ? interactionPoint : transform; public virtual float InteractionDistance => interactionRange; public virtual bool CanInteract(PlayerController player) { return isInteractable && enabled && gameObject.activeInHierarchy; } public virtual void Interact(PlayerController player) { if (!CanInteract(player)) return; onInteracted?.Invoke(player); } public virtual void OnHoverEnter(PlayerController player) { onHoverEnter?.Invoke(player); } public virtual void OnHoverExit(PlayerController player) { onHoverExit?.Invoke(player); } public void SetInteractable(bool interactable) { isInteractable = interactable; } public void SetPrompt(string newPrompt) { prompt = newPrompt; } protected virtual void OnDrawGizmosSelected() { Gizmos.color = Color.yellow; Vector3 center = InteractionTransform.position; Gizmos.DrawWireSphere(center, interactionRange); } } }