Files
lennartandClaude Opus 5 cba87dcb31 add UI layer: dialogue stream, HUD, player menu, and skills panel
Runtime UI under Scripts/UI: a UIStateController owning menu/dialogue state, a
PlayerControlLock so opening a panel suppresses world input, panel visibility
helpers, and the menu input binding.

Views: the dialogue stream presenter and its options presenter and message row,
the portrait HUD, and the player menu with character, journal, and tab-bar
views. Skills gains SkillsPanelView and SkillRowView, which is why the Skills
asmdef now references UnityEngine.UI.

Prefabs/UI holds the authored canvases (dialogue stream, HUD, player menu) and
their rows. UILayerBootstrap remains a hand-added runtime fallback for scenes
where those prefabs are not instantiated; it deliberately does not auto-spawn.

Editor/UILayerSetup.cs is the one-shot menu that builds and wires those prefabs
into a scene, with UILayerSetupAutoRun reminding after a script reload.

Art/UI/Placeholder carries the placeholder portrait the HUD falls back to.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-08-25 19:03:42 +02:00

54 lines
1.4 KiB
C#

using TMPro;
using UnityEngine;
namespace NightclubArcadia.UI.Dialogue
{
/// <summary>
/// One message row in the dialogue stream: optional speaker name + body text.
/// </summary>
public sealed class DialogueMessageRow : MonoBehaviour
{
[SerializeField] TMP_Text speakerText;
[SerializeField] TMP_Text bodyText;
[SerializeField] GameObject speakerLabel;
public TMP_Text BodyText => bodyText;
public void SetContent(string speaker, string body)
{
if (string.IsNullOrWhiteSpace(speaker))
{
if (speakerLabel != null)
{
speakerLabel.SetActive(false);
}
else if (speakerText != null)
{
speakerText.gameObject.SetActive(false);
}
}
else
{
if (speakerLabel != null)
{
speakerLabel.SetActive(true);
}
else if (speakerText != null)
{
speakerText.gameObject.SetActive(true);
}
if (speakerText != null)
{
speakerText.text = speaker;
}
}
if (bodyText != null)
{
bodyText.text = body ?? string.Empty;
}
}
}
}