Files
aetherbound-guild/docs/runtime/M52_SHARED_UI_RULES.md
T

5.9 KiB
Raw Blame History

M52 Shared UI Rules

这是当前 Q 版日系手绘方向的运行时 UI 规则。页面可以有不同构图,但不能 改变下面的材质、层级和伸缩语法。

设计画布与伸缩

  • 运行时背景使用 aspect-cover 铺满视口,允许裁切,不允许压扁或拉长。
  • 交互层使用居中的 16:9 设计画布;宽屏增加两侧世界空间,窄屏在上下留 安全区,画布本身不变形。
  • 图标、头像、纹章使用保持比例的固定槽位,不使用九宫格。
  • 木牌、羊皮纸、名册、资源徽章使用可拉伸的外框;圆角、内边距、角钉和 文字槽由组件提供,内部图标和文字保持原尺寸。
  • 所有点击区域至少 48px 高;可见材质可以比逻辑点击区域更小,但文字和 图标必须对齐可见槽位。

组件语法

runtime/ui/shared/market_chrome.gd 是当前共享材质原型,后续应迁移到 统一的 UIFactory / token 层,而不是页面自行创建新的边框。

组件 视觉职责 动态内容
title 米白纸牌、青绿色布带、黄铜角钉、柔和投影 页面名、阶段名
resource 小型纸徽章、左右角钉 队伍、金币、数量
card 悬挂绳、羊皮纸、职业彩带、特质印章、价格条 头像、姓名、职业、特质、价格、状态
ledger 暖色冒险者名册、头像槽、单一行动码头 候选详情、说明、价格、主动作
wood_button 棕木牌、底部厚度、黄铜角钉 返回、离开、导航动作
ledger_action 青绿色操作牌、内描边、黄铜角钉 查看详情、确认

信息预算

  • 每页一个主动作;首屏只放 2–3 个核心事实。
  • 标题、资源、对象、下一步动作按这个顺序建立层级。
  • 调试 hash、内部 ID、服务状态不得出现在玩家可见层。
  • 中文正文使用共享字体和固定字号;长文案优先换行,其次省略,不能越过 容器边界。
  • 禁止“纯文本按钮”。任何可点击文案必须有材质、图标或明确的选中/禁用 状态。

页面迁移顺序

  1. 先把页面分成 Entry Shell / Selection / Formation / Battle / Outcome。
  2. 选择一个主材质组件,不在页面内叠第二套同类边框。
  3. 先做静态层,再放运行时文字、数值和透明命中区。
  4. 在 760×360、844×390、1280×720 以及中英文截图中检查:裁切、文字槽、 主动作、选中态、禁用态和无重复框。
  5. 只有截图和试玩都通过后,才把该组件扩展到下一页。

Market 模块边界(M52-B)

Market 不是一张平面图,而是下面这棵组合树;每个叶子模块拥有自己的 文字槽、裁切边界和响应式布局,页面只负责排列模块与转发 intent:

M52MarketDesignPage
├─ WorldBackground(aspect-cover,只负责场景)
├─ MarketHeader
│  ├─ TitlePlaque(NinePatch 外框)
│  ├─ TitleLabel
│  └─ StageLabel
├─ ResourceStatusGroup
│  ├─ CompanyBadge
│  ├─ CoinBadge
│  └─ SettingsButton
├─ RecruitBoard
│  └─ RecruitCard × 3
│     ├─ CardShell / ProfessionRibbon
│     ├─ PortraitModule(Frame + Viewport + Image)
│     ├─ IdentityModule(NamePlate + NameLabel)
│     ├─ TraitModule(Badge + TraitLabel)
│     ├─ CostModule(CoinSocket + Status + Amount)
│     └─ StateLayer / HitArea
├─ CandidateLedger
│  ├─ LedgerShell / LedgerHeader
│  ├─ PortraitModule
│  ├─ IdentityModule
│  ├─ ProfessionModule
│  ├─ DetailCopy
│  ├─ TraitModule
│  ├─ CostModule
│  ├─ ActionDock
│  └─ HitArea(ActionDock 自带)
└─ FooterNav(BackGuild / ReturnContract)

Market 的层所有权明确为:m52_q_market_world_only.png 只负责场景、木架、 布旗、柜台和远景;三块中央委托板不再属于背景。它们的纸面、类别图标、 人物框、姓名、特质、价格和选中态全部由运行时模块绘制。旧的 m52_q_market_background.png 仍保留作历史候选,但禁止再作为 Market 运行时底图。

当前已抽成可复用脚本的是 MarketHeader、ResourceStatusGroup、 RecruitCard、CandidateLedger 及其头像、姓名、职业、详情文案、特质、 价格、动作子模块; FooterNav 也已独立;Market View 现在只保留模块排列、数据绑定和 intent 转发,不能再在页面内新增同类边框或文字按钮。 所有页面级标题必须先挂到 Header 的本地槽位,再挂 Header 到设计画布;禁止 把子标题直接按画布坐标定位。每个垂直槽位之间必须留出至少 4% 的设计画布 间距,紧凑尺寸还要通过自动换行或省略号保护容器边界。

CandidateLedger 细粒度拆分(2026-09-10)

右侧详情不是一个“文字块”,而是一个可复用的 CandidateLedger 组合件: LedgerShell、LedgerHeader、PortraitModule、IdentityModule、 ProfessionModule、DetailCopy、TraitModule、CostModule、 ActionDock。每个子模块只拥有自己的背景/文字槽位,父模块只负责垂直 排列和转发动作意图。ActionDock 同时承载视觉按钮和触摸命中区,避免 “看起来像按钮、实际点击区在别处”。

截图探针必须为每个候选人提供真实的本地化职业、特质和详情文案;空数据 只能用于空状态验收,不能用来判断最终文字布局。

RecruitCard 紧凑布局(2026-09-10)

RecruitCard 与 CandidateLedger 共用头像、姓名、特质和价格模块,但不 强行共用同一套尺寸。卡片进入手机横屏紧凑模式后,会给头像、姓名、特质、 价格重新分配独立的垂直槽位;姓名和特质牌切换到共享的 compact_label 材质,保留纸面、细边和阴影,同时避免装饰端帽压到文字。费用模块继续 隐藏卡片中的重复可用状态,只显示硬币图标和金额。