DialogueInteractable, DialogueTransitionController, and DialogueUIVisibility are reworked against the new UI layer: visibility is driven by UIStateController rather than each component toggling canvases itself, which removes the duplicated show/hide logic the two had accumulated. NPCStandIn now ignores the interact button while UIStateController reports a menu open, so pressing interact through an open panel no longer starts a conversation behind it. The yarnproject change is graph-editor node positions only. Co-Authored-By: Claude Opus 5 <[email protected]>
70 lines
2.1 KiB
C#
70 lines
2.1 KiB
C#
using UnityEngine;
|
|
using UnityEngine.InputSystem;
|
|
using Yarn.Unity;
|
|
|
|
namespace NightclubArcadia.Dialogue
|
|
{
|
|
/// <summary>
|
|
/// Trigger-zone interactable: player walks in range, presses E, and this
|
|
/// starts the given Yarn node. The reverse of DialogueTransitionController's
|
|
/// <<enter_environment>> — this is the "step into dialogue" half of the loop.
|
|
/// </summary>
|
|
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("<Keyboard>/e");
|
|
interactAction.AddBinding("<Gamepad>/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);
|
|
}
|
|
}
|
|
}
|