using UnityEngine; using UnityEngine.InputSystem; using Yarn.Unity; namespace NightclubArcadia.Dialogue { /// /// Trigger-zone interactable: player walks in range, presses E, and this /// starts the given Yarn node. The reverse of DialogueTransitionController's /// <> — this is the "step into dialogue" half of the loop. /// public class DialogueInteractable : MonoBehaviour { [SerializeField] private DialogueRunner dialogueRunner; [SerializeField] private GameObject dialogueUI; [SerializeField] private string yarnNodeName = "Bartender_Chat"; private bool playerInRange; private InputAction interactAction; void Awake() { interactAction = new InputAction("Interact"); interactAction.AddBinding("/e"); interactAction.AddBinding("/buttonNorth"); interactAction.performed += _ => { if (playerInRange) { StartConversation(); } }; } void OnEnable() => interactAction?.Enable(); void OnDisable() => interactAction?.Disable(); void OnTriggerEnter(Collider other) { if (other.CompareTag("Player")) { playerInRange = true; } } void OnTriggerExit(Collider other) { if (other.CompareTag("Player")) { playerInRange = false; } } async void StartConversation() { // Player controls are locked by DialogueTransitionController off the // runner's onDialogueStart event — nothing to do for that here. if (DialogueUIVisibility.Show(dialogueUI)) { // Only reached if the UI was found deactivated; give TMP a // frame to re-cache its Canvas in OnEnable before any text is // generated. await Awaitable.NextFrameAsync(); } await dialogueRunner.StartDialogue(yarnNodeName); } } }