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]>
This commit is contained in:
@@ -0,0 +1,50 @@
|
||||
using TMPro;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
|
||||
namespace NightclubArcadia.Skills
|
||||
{
|
||||
/// <summary>
|
||||
/// One skill row: name, numeric rank, and accent-tinted fill bar.
|
||||
/// </summary>
|
||||
public sealed class SkillRowView : MonoBehaviour
|
||||
{
|
||||
[SerializeField] TMP_Text nameLabel;
|
||||
[SerializeField] TMP_Text rankLabel;
|
||||
[SerializeField] Image barFill;
|
||||
[SerializeField] Image accentStripe;
|
||||
|
||||
public void Bind(SkillDefinition def, int rank, int displayMaxRank)
|
||||
{
|
||||
if (def == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (nameLabel != null)
|
||||
{
|
||||
nameLabel.text = string.IsNullOrEmpty(def.DisplayName)
|
||||
? def.Id.ToUpperInvariant()
|
||||
: def.DisplayName;
|
||||
nameLabel.color = def.AccentColor;
|
||||
}
|
||||
|
||||
if (rankLabel != null)
|
||||
{
|
||||
rankLabel.text = rank.ToString();
|
||||
}
|
||||
|
||||
if (barFill != null)
|
||||
{
|
||||
var max = Mathf.Max(1, displayMaxRank);
|
||||
barFill.fillAmount = Mathf.Clamp01(rank / (float)max);
|
||||
barFill.color = def.AccentColor;
|
||||
}
|
||||
|
||||
if (accentStripe != null)
|
||||
{
|
||||
accentStripe.color = def.AccentColor;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user