Skip to content
On this page

图片组件

图片组件用于在页面中显示本地或公网图片及 GIF 动图,适合背景、图标、装饰、头像框和状态提示。本地素材由客户端从当前游戏版本目录的 resourcepacks/ChaUI/ 中读取,公网素材由客户端异步下载。

适用场景

  • 页面背景与装饰图层
  • Logo、图标和状态标识
  • GIF 动画提示
  • 从整张素材中截取一块区域显示

图片路径可以填写相对于 resourcepacks/ChaUI/ 的路径,例如 gui/logo.png,也可以填写公开可访问的 http://https:// URL。支持按实际内容识别 PNG、JPG、JPEG 和 GIF;本地路径不能使用绝对路径、反斜杠或 ..

公网 URL 可以包含查询参数,也可以在路径和查询中使用响应式 {...},但协议、域名和显式端口必须固定,不能把变量放进主机部分。ChaUI 不发送 Cookie、Authorization 或自定义请求头,不允许访问 localhost、局域网、链路本地和保留地址;每次重定向也会重新检查目标。加载会异步进行,加载中或失败时使用缺失素材表现,不阻塞渲染。相同完整 URL 会复用内存缓存;需要主动刷新时可改变查询参数。http://https:// 都能使用,但 HTTP 不提供传输机密性与完整性,正式素材推荐使用 HTTPS。

单次公网图片最多下载 16 MiB,静态图与 GIF 单帧最大 4096×4096。GIF 最多 256 帧,总解码像素最多 16,777,216,单素材估算解码内存最多 64 MiB。全局最多同时下载 2 个素材并等待 64 个请求;解码缓存最多 128 条、合计最多 256 MiB,失败后同一 URL 冷却 30 秒。公网素材不写入磁盘缓存,页面关闭后会释放当前页面的引用,纹理缓存同时按 128 条与 256 MiB 限制,并且只逐出没有页面继续使用的纹理。

通用配置

配置项编辑器名称类型默认值可选值或格式说明
idID字符串自动生成 image_N页面内唯一 ID用于脚本、父级绑定和状态更新。
type类型只读字符串image固定值创建后不能修改。
parent父级字符串布局组件 ID为空表示根级元素;不得引用普通组件或形成循环。
z层级整数0任意整数数值越大越晚绘制,通常显示在更上层。
visible显示布尔值truetruefalse静态控制组件是否显示。
enabled启用布尔值truetruefalse控制组件能否参与交互。
pointerEvents指针处理枚举autoautoblockpass纯图片默认穿透;配置事件/提示后 auto 命中,block 强制遮挡,pass 永远穿透。
scale缩放数字或公式1非负值以图片中心缩放画面和命中范围,不改变布局值。
rotation旋转角度数字或公式0有限角度,单位为度围绕图片中心顺时针旋转画面,并按旋转后的形状精确命中。
opacity透明度数字或公式101控制图片透明度,不改变命中。
visibleWhen显示条件条件表达式只读条件条件为假时不显示;非法条件按不可见处理。
enabledWhen启用条件条件表达式只读条件条件为假时不响应事件。
tooltip多行提示字符串列表最多 32 行,每行最多 256 字符每行支持响应式变量、常量与确定性表达式。
containerBinding容器绑定字符串当前容器的语义槽位 ID仅容器替换页面使用,可让组件读取绑定物品信息。
containerTooltip容器提示布尔值truetruefalse没有显式 tooltip 时是否显示绑定物品提示。
layout.xX数字或公式创建时画布位置10window.width * 0.5最终横坐标。
layout.yY数字或公式创建时画布位置20parent.y + 8最终纵坐标。
layout.width数字或公式80合法布局公式图片最终显示宽度。
layout.height数字或公式24合法布局公式图片最终显示高度。
events.leftPress
/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多行脚本鼠标离开组件范围时触发。

专属配置

配置项编辑器名称类型默认值可选值或格式说明
image.path图片路径字符串gui/image_N.pngChaUI 相对路径或 HTTP/HTTPS URL,可含 {表达式}当前显示的图片或 GIF。最终来源变化后会重新加载,GIF 从第 0 帧开始。
image.gifLoopGIF循环布尔值truetruefalse仅对 GIF 生效;关闭后播放一轮并停在最后一帧。
image.gifLoopCountGIF次数非负整数00 或正整数0 表示无限循环;正数表示播放指定轮数。
image.sourceX源X非负整数或公式像素坐标或数字公式源图选区左上角 X。
image.sourceY源Y非负整数或公式像素坐标或数字公式源图选区左上角 Y。
image.sourceWidth源宽非负整数或公式像素尺寸或数字公式源图选区宽度;为 0 时当前图片不绘制,与源高一起留空时使用整张图片。
image.sourceHeight源高非负整数或公式像素尺寸或数字公式源图选区高度;为 0 时当前图片不绘制,选区会缩放到组件宽高。

image.keyimage.texture 不属于当前图片组件字段,保存时会被拒绝。请只使用 image.path

图片路径可以跟随变量变化。例如 gui/{vars.theme}/logo.png 会在 vars.themeblue 时读取 gui/blue/logo.png。ChaUI 会在表达式求值后再次检查最终路径;如果结果为空、越过素材目录、使用反斜杠或扩展名不受支持,只让当前图片安全回退,不会让页面崩溃。

四个源图字段也可以填写 varsvalswindowparentself 和数学函数组成的公式。结果有小数时向下取整为源图像素;结果为负数、非有限值、未知变量或选区越界时只跳过当前图片。制作动态图集和无拉伸血条请先阅读图片裁剪与动态血条

配置示例

先在页面根级 vars 中加入 theme: default,再把下面组件放入 elements。这样更换 vars.theme 时会自动读取另一套素材目录。

yaml
- id: logo
  type: image
  parent: ""
  visible: true
  enabled: true
  pointerEvents: auto
  scale: 1
  opacity: 0.9
  z: 10
  layout:
    x: window.width * 0.5 - 64
    y: 20
    width: 128
    height: 64
  image:
    path: gui/{vars.theme}/logo.gif # theme 变化时自动换图
    gifLoop: true               # 允许循环
    gifLoopCount: 0             # 0 表示无限循环
    sourceX: 0                  # 从源图左上角开始
    sourceY: 0
    sourceWidth: 256            # 截取 256×128 区域
    sourceHeight: 128
  tooltip:
    - 服务器 Logo
  events: {}

若素材放在公开图床,可只把 image.path 改成网络地址;主机保持固定,变量放在路径或查询参数中:

yaml
image:
  path: https://cdn.example.com/chaui/{vars.theme}/logo.png?v={vars.assetRevision}
  gifLoop: true
  gifLoopCount: 0

脚本可以读取图片对象当前使用的路径。把下面的完整事件块替换到 logo 组件中,悬浮时会把路径保存到页面变量并显示在本地日志中:

yaml
events:
  hoverEnter: |-
    vars.logoPath = component("logo").image.path
    log("当前 Logo:{vars.logoPath}")

源图字段可以在当前页面会话中读取、固定赋值或绑定公式:

yaml
events:
  leftClick: |-
    component("logo").image.sourceWidth = formula(vars.visiblePixels)
    vars.currentWidth = component("logo").image.sourceWidth
    vars.widthFormula = component("logo").image.expression("sourceWidth").source

直接赋数字会清除旧公式;formula(...) 会继续跟随变量。脚本修改不会写回服务端页面文件。

常见问题

图片显示为缺失素材

普通页面的本地路径应检查文件是否存在于当前客户端的 resourcepacks/ChaUI/,并逐字核对路径、扩展名和大小写;普通页面不会从服务端插件同步本地素材。display.mode: vanilla 原版菜单页面会先查找活动菜单包中的同路径素材,再回退到 ChaAssets 和客户端本地目录,具体见页面包与素材。公网地址应确认它是直接返回图片数据的公开 HTTP/HTTPS URL,且没有跳转到私网、登录页或不受支持的格式。

GIF 修改路径后为什么重新播放

每次打开页面和每次动态修改图片路径都会建立新的播放作用域,这是预期行为。

只想显示素材的一部分

同时填写源 X、源 Y、源宽和源高。选区越界或尺寸非法时,组件会安全跳过图片绘制。

创建事件

图片组件支持 events.create,适合在组件出现时根据变量选择初始路径、显隐或尺寸。页面初始图片与脚本动态创建的图片都会对各自实例触发一次;隔离预览中的变化不会保存。