using UnityEngine; using System; /// /// Represents an interactable object that can respond to tap input events. /// public class Interactable : MonoBehaviour, ITouchInputConsumer { public event Action StartedInteraction; public event Action InteractionComplete; private ObjectiveStepBehaviour stepBehaviour; void Awake() { stepBehaviour = GetComponent(); } /// /// Handles tap input. Triggers interaction logic. /// public void OnTap(Vector2 worldPosition) { Debug.Log($"[Interactable] OnTap at {worldPosition} on {gameObject.name}"); StartedInteraction?.Invoke(); } /// /// No hold behavior for interactables. /// public void OnHoldStart(Vector2 worldPosition) { } public void OnHoldMove(Vector2 worldPosition) { } public void OnHoldEnd(Vector2 worldPosition) { } /// /// Called when the follower arrives at this interactable. /// public bool OnFollowerArrived(FollowerController follower) { // Check if step is locked here if (stepBehaviour != null && !stepBehaviour.IsStepUnlocked()) { DebugUIMessage.Show("Item is not unlocked yet"); Debug.Log("[Puzzles] Tried to interact with locked step: " + gameObject.name); InteractionComplete?.Invoke(false); return false; } var requirements = GetComponents(); if (requirements.Length == 0) { InteractionComplete?.Invoke(true); return true; } bool anySuccess = false; foreach (var req in requirements) { if (req.TryInteract(follower)) { anySuccess = true; break; } } InteractionComplete?.Invoke(anySuccess); if (!anySuccess) { Debug.Log($"[Interactable] No interaction requirements succeeded for {gameObject.name}"); // Optionally trigger a default failure event or feedback here } return anySuccess; } }