蓝图
可视化编程层——什么是蓝图、一份蓝图归属于谁,以及它被允许做什么
蓝图是一份可视化程序:节点由连线串起,由游戏运行时执行。项目靠蓝图获得行为而不必写代码——打开某个界面的按钮、列出存档的菜单、知道有没有进度可以继续的标题画面
填满一个槽位的方式不止蓝图一种。一个槽位装的是一份图层列表,其中一层也可以是脚本——项目自己拥有、在 Studio 之外编辑的 TypeScript 文件。每一层都会运行,所以同一个槽位里脚本可以和图并存。脚本讲的是这些文件放在哪里、一个脚本又是从哪里进入的

在放下第一个节点之前,每份蓝图都先回答一个问题:谁是它的宿主。答案决定了创建浮窗会给你哪些节点
宿主
宿主决定蓝图归属何处,也决定它的生命周期和可触及的范围
| 宿主 | 归属于 | 存活时长 |
|---|---|---|
globalMain | 项目,在 UI 面板中显示为应用逻辑,早期版本称作全局蓝图 | 整个应用 |
surfaceMain | 单个 Surface | 该 Surface 实例 |
widgetMain | 单个控件实例 | 该控件实例 |
widgetValue | 单个控件的单个属性 | 拥有它的绑定 |
componentWidgetMain | 可复用的组件控件 | 组件的每个实例 |
storyAction | 一张故事蓝图,处于 action、value 或 condition 模式 | 调用它的那一行 |
widgetMain 蓝图通过 Self 节点操作自己所属的控件,这类节点没有 Element 输入。要操作别的控件,则把一个 Element 引用接进 Element 节点。这条区分贯穿整个节点目录,也是理解创建浮窗的第一件事
Blueprint Value
Blueprint Value 是绑定到单个属性上的 widgetValue 蓝图,属性因此由计算得出而非直接填写。当前支持的目标是 nl.text → props.text、nl.button → props.label、nl.image → props.imageFill.assetId、nl.switch → props.checked、nl.frame → props.params、nl.slider → props.value
它的创建浮窗被刻意收窄:Init 与 On Flush 两个事件头、非 latent 的流程节点、纯 Data 与 Math、本地变量读写、Element 字面量,以及纯读取节点。没有改写、没有导航、没有持久变量,除 Call Fn 以外也没有 latent 节点(会挂起整张图的节点,例如 Delay 或一次存档写入)。一个能改变世界的取值器,会在世界改变的那一刻重新进入自己
要显示玩家语言中的文字,用 Translation Key Text 取翻译键的文字,再用 Format 把值填进去。读取玩家语言的 Blueprint Value 会在玩家切换语言时更新,无论它是通过 Translation Key Text 或按语言区分的资产读取,还是通过它调用的函数里的 Get Text、Get Current Language 或 Get Save Metadata 读取
文本的内容或按钮的文字绑定之后,控件自身的文字是示例文字:只在编辑器中显示,不进入构建出的游戏,也不参与翻译。见界面文本
编辑器画布是排版工具。它会解析蓝图到足以预览一个值绑定的程度,但并不运行游戏——需要活动游玩的节点在那里没有对话对象。蓝图行为请在开发模式中验证
接下来
若要发布自己的节点而非使用内置节点,参见插件 API 的 blueprintNodes