通过Title保留并更新HUD文本¶
本页介绍如何构建一个可复用的UI组件,使其"监听"标题文本,只在标题包含特定标记时更新界面显示内容。这种方式适合通过/title命令向界面推送低频状态数据,避免每条标题都触发界面重算。
设计思路¶
组件由两部分构成:
- 可见的
label(preserved_title_display):负责显示文字。 - 隐藏的子
panel(data_control):负责检测标记、保存文本,是整个组件的逻辑核心。
关键技术点:使用property_bag在data_control中创建一个局部变量#preserved_text。由于它不是全局变量,每个组件实例都拥有独立的#preserved_text,互不干扰,从而实现真正的模块化复用。
实现代码¶
RP/ui/hud_screen.json
{
"preserved_title_display": {
"$update_string": "update",
"type": "label",
"text": "#text",
"controls": [
{
"data_control": {
"type": "panel",
"size": [0, 0],
"property_bag": {
"#preserved_text": ""
},
"bindings": [
{
"binding_name": "#hud_title_text_string"
},
{
"binding_name": "#hud_title_text_string",
"binding_name_override": "#preserved_text",
"binding_condition": "visibility_changed"
},
{
"binding_type": "view",
"source_property_name": "(not (#hud_title_text_string = #preserved_text) and not ((#hud_title_text_string - $update_string) = #hud_title_text_string))",
"target_property_name": "#visible"
}
]
}
}
],
"bindings": [
{
"binding_type": "view",
"source_control_name": "data_control",
"source_property_name": "(#preserved_text - $update_string)",
"target_property_name": "#text"
}
]
}
}
原理说明¶
data_control的逻辑¶
data_control是一个尺寸为[0, 0]的不可见面板,负责检测标记并保存文本:
-
property_bag:在面板上创建并初始化局部变量#preserved_text为空字符串。因为是局部变量,每个preserved_title_display实例都有自己独立的#preserved_text,不同实例之间完全隔离。 -
visibility_changed绑定:当data_control的可见状态切换时,此绑定立即将当前的#hud_title_text_string复制到#preserved_text中,完成"锁存"操作。 -
可见性条件:第三条绑定决定
data_control何时"闪烁"(在单帧内变为可见),触发上述锁存操作。两个条件同时满足时才会触发:
not (#hud_title_text_string = #preserved_text):新到的标题与已保存的不同(防止同一标题重复触发)。not ((#hud_title_text_string - $update_string) = #hud_title_text_string):新标题中包含更新标记$update_string。
当含标记的新标题到来时,面板变为可见、visibility_changed触发锁存、可见性条件立即变为false——面板在单帧内完成一次"闪烁",后续标题不再触发,除非又有新的含标记标题到来。
preserved_title_display标签的绑定¶
外层标签从子控件data_control读取数据:
source_control_name: "data_control":指向子控件。source_property_name: "(#preserved_text - $update_string)":取出保存的文本,并去除标记字符串,得到干净的显示内容。
使用方法¶
- 将
$update_string设置为自己约定的标记前缀(默认为"update")。 - 通过
/title @s title update:你的内容命令推送数据;标记与内容的格式由$update_string决定。 - 同一屏幕中可以多次使用该组件,每个实例互不干扰。
- 本组件同样适用于副标题(
#hud_subtitle_text_string)或其他可绑定文本源,只需替换binding_name中的绑定名即可。
关于字符串匹配
字符串匹配对大小写和拼写敏感,建议在项目内统一约定标记格式,例如"wiki:"作为前缀,避免与其他资源包冲突。