Skip to content
On this page

按钮组件

按钮组件是可点击图片,支持普通、悬浮、选中三套素材、GIF、响应式文字、逐字显示,以及左中右三键的按下、松开、点击和悬浮事件。多个按钮可以绑定同一个页面变量,快速做出页签、分类栏和单选按钮。没有可用图片时会显示安全的默认按钮外观。

适用场景

  • 页面确认、关闭和跳转入口
  • 商店购买、任务领取和功能开关
  • 带普通/悬浮状态的图片按钮
  • 页签、分类栏、难度选择等单选按钮组
  • 需要点击、右键或悬浮事件的交互区域

通用配置

配置项编辑器名称类型默认值可选值或格式说明
idID字符串自动生成 button_N页面内唯一 ID用于脚本和状态更新。
type类型只读字符串button固定值创建后不能修改。
parent父级字符串布局组件 ID为空表示根级元素。
z层级整数0任意整数控制按钮绘制顺序。
visible显示布尔值truetruefalse静态显隐开关。
enabled启用布尔值truetruefalse为假时不响应按钮事件。
pointerEvents指针处理枚举autoautoblockpass按钮在 auto 下天然参与命中;pass 会让按钮完全无法交互。
scale缩放数字或公式1非负值以按钮中心缩放图片、文字和命中范围,不改变布局值。
opacity透明度数字或公式101同时控制按钮图片和文字透明度,不改变命中。
visibleWhen显示条件条件表达式只读条件条件为假时隐藏。
enabledWhen启用条件条件表达式只读条件条件为假时禁用。
tooltip多行提示字符串列表最多 32 行,每行最多 256 字符鼠标悬浮说明。
containerBinding容器绑定字符串当前容器的语义槽位 ID仅容器替换页面使用;绑定后按钮代理对应原版槽位点击。
containerTooltip容器提示布尔值truetruefalse没有显式 tooltip 时是否显示绑定物品的原版提示。
layout.xX数字或公式创建时画布位置合法布局公式按钮左上角 X。
layout.yY数字或公式创建时画布位置合法布局公式按钮左上角 Y。
layout.width数字或公式80合法布局公式按钮最终宽度。
layout.height数字或公式24合法布局公式按钮最终高度。
events.leftPres
/rightPress/middlePress
按下脚本ChaUI Script多行脚本对应按键按下时触发,适合按压动画。
events.leftRelease
/rightRelease/middleRelease
松开脚本ChaUI Script多行脚本对应按键捕获仍有效并松开时触发。
events.leftClick左键脚本ChaUI Script多行脚本左键点击时触发。
events.rightClick右键脚本ChaUI Script多行脚本右键点击时触发。
events.middleClick中键脚本ChaUI Script多行脚本中键点击时触发。
events.hoverEnter悬浮进入脚本ChaUI Script多行脚本鼠标进入时触发一次。
events.hoverLeave悬浮离开脚本ChaUI Script多行脚本鼠标离开时触发一次。

专属配置

文字配置

配置项编辑器名称类型默认值可选值或格式说明
button.label文字字符串新建时组件 ID;字段缺失为空普通文字与 {表达式}绘制在按钮上的文字,可实时读取变量和只读常量。
button.font字体路径字符串resourcepacks/ChaUI 下的安全 .ttf 相对路径使用自定义 TTF;缺失、损坏或不支持的字形安全回退原版字体。
button.fontResolution字体分辨率整数3216256控制 TTF 字形清晰度,不改变实际文字大小。
button.color文字颜色颜色#FFFFFF严格 #RRGGBB按钮文字的基础颜色;透明度继续使用根级 opacity
button.textSize文字大小正数1正整数或正小数按钮文字缩放比例。
button.textX文字X整数6任意整数相对于按钮左上角的文字 X 偏移。
button.textY文字Y整数6任意整数相对于按钮左上角的文字 Y 偏移。
button.textLineLength每行字数正整数或空00/空或正整数按字符数量换行。
button.textLineWidth每行宽度非负整数或空0GUI 像素按应用 textSize 后的真实字形宽度换行;0 或空表示不限制。
button.revealIntervalMs逐字间隔(ms)非负整数0毫秒0 立即显示;正数逐字出现。
button.align对齐枚举leftleftcenterright在剩余按钮文字区域内对齐。

按钮文字与文本组件使用同一套字体、颜色、响应式文字和换行语义。textLineLengthtextLineWidth 可以同时设置,任意一项先达到限制就换行;显式换行与空行会保留,单个超宽字形会独占一行。TTF 路径、字形回退和分辨率选择规则可参考文本组件

text
确认(已选择 {vars.selectedCount} 项)
购买:{vals.papi.price} 金币
生命恢复到 {vals.player.maxHealth}

变量变化后按钮文字会自动刷新。需要完整了解表达式、花括号转义和 PAPI 映射,请阅读响应式变量与实时文字

普通状态图片

配置项编辑器名称类型默认值可选值或格式说明
button.path图片路径字符串gui/button_N.pngChaUI 相对图片路径,可含 {表达式}普通状态图片或 GIF;最终路径变化时重新加载。
button.gifLoopGIF循环布尔值truetruefalse控制普通状态 GIF 是否循环。
button.gifLoopCountGIF次数非负整数00 或正整数0 表示无限循环。
button.sourceX源X非负整数或公式像素坐标或数字公式普通素材选区左上角 X。
button.sourceY源Y非负整数或公式像素坐标或数字公式普通素材选区左上角 Y。
button.sourceWidth源宽非负整数或公式像素尺寸或数字公式普通素材选区宽度;为 0 时普通素材不绘制。
button.sourceHeight源高非负整数或公式像素尺寸或数字公式普通素材选区高度;为 0 时普通素材不绘制。

悬浮状态图片

配置项编辑器名称类型默认值可选值或格式说明
button.hoverPath悬浮路径字符串gui/button_N_hover.pngChaUI 相对图片路径,可含 {表达式}鼠标悬浮时使用;为空或加载失败时回退普通图片。
button.hoverGifLoop悬浮GIF循环布尔值truetruefalse控制悬浮 GIF 是否循环。
button.hoverGifLoopCount悬浮GIF次数非负整数00 或正整数0 表示无限循环。
button.hoverSourceX悬浮源X非负整数或公式像素坐标或数字公式悬浮素材选区左上角 X。
button.hoverSourceY悬浮源Y非负整数或公式像素坐标或数字公式悬浮素材选区左上角 Y。
button.hoverSourceWidth悬浮源宽非负整数或公式像素尺寸或数字公式悬浮素材选区宽度;为 0 时悬浮素材不绘制。
button.hoverSourceHeight悬浮源高非负整数或公式像素尺寸或数字公式悬浮素材选区高度;为 0 时悬浮素材不绘制。

选中状态与选中图片

button.checked 用来把按钮绑定到一个页面变量。多个按钮填写同一个变量后,左键点击其中一个按钮,变量会自动变成该按钮的 id,于是同一组里只有对应按钮显示选中图片。

配置项编辑器名称类型默认值可选值或格式说明
button.checked选中变量字符串完整的 vars.<变量名>变量值等于当前按钮 id 时进入选中态。
button.checkedPath选中路径字符串gui/button_N_checked.pngChaUI 相对图片路径,可含 {表达式}按钮选中时使用的图片或 GIF。
button.checkedGifLoop选中GIF循环布尔值truetruefalse控制选中状态 GIF 是否循环。
button.checkedGifLoopCount选中GIF次数非负整数00 或正整数0 表示无限循环。
button.checkedSourceX选中源X非负整数或公式像素坐标或数字公式选中素材选区左上角 X。
button.checkedSourceY选中源Y非负整数或公式像素坐标或数字公式选中素材选区左上角 Y。
button.checkedSourceWidth选中源宽非负整数或公式像素尺寸或数字公式选中素材选区宽度;为 0 时选中素材不绘制。
button.checkedSourceHeight选中源高非负整数或公式像素尺寸或数字公式选中素材选区高度;为 0 时选中素材不绘制。

普通、悬浮和选中路径都能使用响应式表达式。例如页面变量 vars.themedark 时,gui/{vars.theme}/confirm.png 会读取 gui/dark/confirm.png。变量变化后对应素材重新加载,GIF 从第 0 帧开始。最终路径不安全或文件不存在时,按钮只回退到可用状态图片或默认外观,不会影响页面其他组件。

普通、悬浮和选中三组选区也都接受数字公式。每次渲染会使用当前变量重新计算并向下取整;某一状态的结果无效或越界时只让该状态素材不可用,再按按钮状态规则回退。选区与布局宽度配合的完整示例见图片裁剪与动态血条

选中变量必须填写完整引用,例如 vars.selectedTab,不能只写 selectedTab,也不能写成 vals.selectedTab。根级 vars 可以提前给它一个默认按钮 ID,让页面打开时直接选中某一项;也可以不提前声明,第一次左键点击会在当前页面会话中创建这个变量。

状态优先级固定为:

  1. 变量值等于按钮 ID:显示选中图片。
  2. 未选中且鼠标悬浮:显示悬浮图片。
  3. 其他情况:显示普通图片。

按钮已经选中时,鼠标悬浮不会再切换成悬浮图片。选中图片为空、无法加载或源图选区不可用时,会回退到普通图片,但仍然不会显示悬浮图片,这样选中状态不会因素材问题发生视觉跳变。

在编辑器里制作页签按钮

  1. 新建三个按钮,并分别设置容易辨认的 ID,例如 tab_hometab_shoptab_task
  2. 三个按钮的“选中变量”都填写 vars.selectedTab
  3. 分别设置普通路径、悬浮路径和选中路径。
  4. 在页面默认变量中新增 selectedTab,值填写希望默认打开的按钮 ID,例如 tab_home
  5. 给三个内容区域分别设置显示条件:vars.selectedTab == "tab_home"vars.selectedTab == "tab_shop"vars.selectedTab == "tab_task"
  6. 进入预览,点击任意页签即可看到按钮图片和内容区域同步切换。

左键点击时,ChaUI 会先完成自动选中,再执行该按钮的左键脚本。因此左键脚本能读取到新的选择,也可以再次修改同一个变量;如果脚本再次赋值,以脚本最后写入的值为准。右键、中键和悬浮事件不会自动改变选中变量。重复点击已经选中的按钮仍会正常执行左键脚本。

自动选择只属于当前打开的页面。关闭并重新打开页面后,会重新从页面默认变量或服务端下发的变量状态开始,不会把玩家最后一次点击写回页面配置。

完整页签配置示例

yaml
id: tab_demo
version: 1
title: 页签按钮示例
size:
  width: 360
  height: 220
coordinateMode: absolute
display:
  mode: screen
  screen:
    dimBackground: true

# 页面打开时默认选中首页。
vars:
  selectedTab: tab_home
  theme: default

# 本示例不使用 PAPI,仍保留完整页面结构。
papi:
  refreshTicks: 20
  values: {}

elements:
  # 首页页签:三个按钮绑定同一个页面变量。
  - id: tab_home
    type: button
    parent: ""
    visible: true
    enabled: true
    pointerEvents: auto
    scale: 1
    opacity: 1
    z: 20
    layout:
      x: 20
      y: 18
      width: 100
      height: 28
    button:
      label: 首页
      font: fonts/menu.ttf
      fontResolution: 64
      color: "#FFE6A3"
      textSize: 1
      textX: 0
      textY: 9
      textLineLength: 0
      textLineWidth: 0
      revealIntervalMs: 0
      align: center
      path: gui/{vars.theme}/tabs/home.png
      gifLoop: true
      gifLoopCount: 0
      sourceX: 0
      sourceY: 0
      sourceWidth: 100
      sourceHeight: 28
      hoverPath: gui/{vars.theme}/tabs/home_hover.png
      hoverGifLoop: true
      hoverGifLoopCount: 0
      hoverSourceX: 0
      hoverSourceY: 0
      hoverSourceWidth: 100
      hoverSourceHeight: 28
      checked: vars.selectedTab
      checkedPath: gui/{vars.theme}/tabs/home_checked.png
      checkedGifLoop: true
      checkedGifLoopCount: 0
      checkedSourceX: 0
      checkedSourceY: 0
      checkedSourceWidth: 100
      checkedSourceHeight: 28
    tooltip:
      - 切换到首页
    events: {}

  # 商店页签。
  - id: tab_shop
    type: button
    parent: ""
    visible: true
    enabled: true
    pointerEvents: auto
    scale: 1
    opacity: 1
    z: 20
    layout:
      x: 130
      y: 18
      width: 100
      height: 28
    button:
      label: 商店
      textSize: 1
      textX: 0
      textY: 9
      textLineLength: 0
      textLineWidth: 0
      revealIntervalMs: 0
      align: center
      path: gui/tabs/shop.png
      gifLoop: true
      gifLoopCount: 0
      sourceX: 0
      sourceY: 0
      sourceWidth: 100
      sourceHeight: 28
      hoverPath: gui/tabs/shop_hover.png
      hoverGifLoop: true
      hoverGifLoopCount: 0
      hoverSourceX: 0
      hoverSourceY: 0
      hoverSourceWidth: 100
      hoverSourceHeight: 28
      checked: vars.selectedTab
      checkedPath: gui/tabs/shop_checked.png
      checkedGifLoop: true
      checkedGifLoopCount: 0
      checkedSourceX: 0
      checkedSourceY: 0
      checkedSourceWidth: 100
      checkedSourceHeight: 28
    tooltip:
      - 切换到商店
    events: {}

  # 任务页签。
  - id: tab_task
    type: button
    parent: ""
    visible: true
    enabled: true
    pointerEvents: auto
    scale: 1
    opacity: 1
    z: 20
    layout:
      x: 240
      y: 18
      width: 100
      height: 28
    button:
      label: 任务
      textSize: 1
      textX: 0
      textY: 9
      textLineLength: 0
      textLineWidth: 0
      revealIntervalMs: 0
      align: center
      path: gui/tabs/task.png
      gifLoop: true
      gifLoopCount: 0
      sourceX: 0
      sourceY: 0
      sourceWidth: 100
      sourceHeight: 28
      hoverPath: gui/tabs/task_hover.png
      hoverGifLoop: true
      hoverGifLoopCount: 0
      hoverSourceX: 0
      hoverSourceY: 0
      hoverSourceWidth: 100
      hoverSourceHeight: 28
      checked: vars.selectedTab
      checkedPath: gui/tabs/task_checked.png
      checkedGifLoop: true
      checkedGifLoopCount: 0
      checkedSourceX: 0
      checkedSourceY: 0
      checkedSourceWidth: 100
      checkedSourceHeight: 28
    tooltip:
      - 切换到任务
    events: {}

  # 只有 selectedTab 等于 tab_home 时显示。
  - id: panel_home
    type: rect
    parent: ""
    visible: true
    enabled: true
    pointerEvents: pass
    opacity: 0.8
    visibleWhen: vars.selectedTab == "tab_home"
    z: 10
    layout:
      x: 20
      y: 60
      width: 320
      height: 140
    rect:
      color: "#36526B"
    tooltip: []
    events: {}

  # 商店内容区域。
  - id: panel_shop
    type: rect
    parent: ""
    visible: true
    enabled: true
    pointerEvents: pass
    opacity: 0.8
    visibleWhen: vars.selectedTab == "tab_shop"
    z: 10
    layout:
      x: 20
      y: 60
      width: 320
      height: 140
    rect:
      color: "#6B5236"
    tooltip: []
    events: {}

  # 任务内容区域。
  - id: panel_task
    type: rect
    parent: ""
    visible: true
    enabled: true
    pointerEvents: pass
    opacity: 0.8
    visibleWhen: vars.selectedTab == "tab_task"
    z: 10
    layout:
      x: 20
      y: 60
      width: 320
      height: 140
    rect:
      color: "#4F366B"
    tooltip: []
    events: {}

脚本读取按钮对象

按钮对象可以读取当前标签、选中绑定和布局公式。若要在点击后检查按钮状态,可以把下面的事件放进对应按钮:

yaml
events:
  leftClick: |-
    vars.clickedLabel = component("tab_home").button.label
    vars.buttonXFormula = component("tab_home").layout.expression("x").source
    log("点击按钮:{vars.clickedLabel}")

常见问题

图片加载成功后为什么没有默认描边

图片按钮使用素材本身的外观;只有图片不可用时才绘制默认按钮背景和描边。

悬浮图片没有切换

检查 hoverPath 的文件位置和大小写。悬浮图片不可用时会继续显示普通图片。

点击后没有显示选中图片

先检查“选中变量”是否写成完整的 vars.<变量名>,再确认变量当前值与按钮 id 完全一致。三个页签按钮必须绑定同一个变量,但各自保留不同的按钮 ID。

鼠标放在已选中的按钮上为什么没有悬浮变化

这是正常行为。选中状态优先于悬浮状态,可以避免当前页签因鼠标经过而看起来像失去选择。

选中图片不存在时会怎样

按钮会显示普通图片,不会改用悬浮图片。自动选中和左键脚本仍然可以正常工作。

左键脚本修改了同一个变量

自动选中先执行,左键脚本后执行。脚本最后写入的值就是本次点击后的最终值。

旧客户端为什么看不到选中状态

旧客户端可能只识别普通和悬浮图片,会忽略新增的选中配置。页面仍可打开,但页签视觉不会完整;使用 checked 页面时应确保玩家使用支持该功能的客户端。

点击脚本没有执行

确认 enabledenabledWhen 允许交互。服务端动作必须先保存页面,再在预览或运行页面中测试。

创建事件

按钮可配置 events.create。页面首次打开时,它会在页面 open 之后执行一次;脚本复制出的新按钮也会各执行一次。适合设置初始选中变量、标签或图片路径。编辑画布不触发,隔离预览会本地触发。