using UnityEngine; /// /// Manages the state and interactions for a single puzzle step, including unlock/lock logic and event handling. /// [RequireComponent(typeof(Interactable))] public class ObjectiveStepBehaviour : MonoBehaviour { /// /// The data object representing this puzzle step. /// public PuzzleStepSO stepData; private Interactable interactable; private bool isUnlocked = false; void Awake() { interactable = GetComponent(); } void OnEnable() { if (interactable == null) interactable = GetComponent(); if (interactable != null) { interactable.StartedInteraction += OnStartedInteraction; interactable.InteractionComplete += OnInteractionComplete; } PuzzleManager.Instance?.RegisterStepBehaviour(this); } void OnDisable() { if (interactable != null) { interactable.StartedInteraction -= OnStartedInteraction; interactable.InteractionComplete -= OnInteractionComplete; } PuzzleManager.Instance?.UnregisterStepBehaviour(this); } /// /// Unlocks this puzzle step, allowing interaction. /// public void UnlockStep() { isUnlocked = true; Debug.Log($"[Puzzles] Step unlocked: {stepData?.stepId} on {gameObject.name}"); // Optionally, show visual feedback for unlocked state } /// /// Locks this puzzle step, preventing interaction. /// public void LockStep() { isUnlocked = false; Debug.Log($"[Puzzles] Step locked: {stepData?.stepId} on {gameObject.name}"); // Optionally, show visual feedback for locked state } /// /// Returns whether this step is currently unlocked. /// public bool IsStepUnlocked() { return isUnlocked; } /// /// Handles the start of an interaction (can be used for visual feedback). /// private void OnStartedInteraction() { // Optionally handle started interaction (e.g. visual feedback) } /// /// Handles completion of the interaction, notifies PuzzleManager if successful and unlocked. /// /// Whether the interaction was successful. private void OnInteractionComplete(bool success) { if (!isUnlocked) return; if (success) { Debug.Log($"[Puzzles] Step interacted: {stepData?.stepId} on {gameObject.name}"); PuzzleManager.Instance?.OnStepCompleted(stepData); } } }