教程 2:WebUIStudio
WebUIStudio 是随插件提供的桌面工具。它不启动游戏,直接加载工程里的网页源码或构建产物,让你逐页、逐状态地查看界面,检查控件,在界面上标注修改意见并交给 Codex 或 Claude。它只用于制作,不进入游戏包。
相关:教程 1:用 AI 制作界面、教程 4:人工编写界面。
启动
第一次使用先下载依赖。 点击关卡编辑器工具栏上的 WebUIStudio 按钮;依赖缺失或与插件版本不一致时,会弹出“OrionBrowser 依赖”窗口,点“下载”,完成后点“打开 WebUIStudio”,见安装。依赖齐全之后,用下面两种方式启动:
- 从 Unreal 启动(推荐):点击关卡编辑器主工具栏上的 WebUIStudio 按钮。Studio 打开当前工程并自动信任它。
- 直接启动:双击插件目录下的
Binaries/,选择Win64/ WebUIStudio.exe .uproject。这样打开的工程需要手动点一次“信任此工程”。
“设置”里的“本地数据”显示 Studio 数据占用的空间,并可以清理。
信任与运行环境
工程被信任之前,Studio 只列出界面;点提示条上的“信任此工程”之后,才会运行预览、安装依赖和发送请求。不要信任来历不明的工程。
Studio 自带 Node.js 和 npm。界面缺少依赖时,点提示条上的“一键安装环境”。发送标注和新建界面需要自行安装并登录 Codex 或 Claude 桌面应用;隔离草稿还需要它们的命令行工具和 Git。按 Ctrl+K 输入“检查运行环境…”可以重新检测。
认识窗口
| 区域 | 内容 |
|---|---|
| 标题栏 | 工程菜单、命令搜索(Ctrl+K)、语言、外观、设置 |
| 左栏 | 界面列表,分“生产界面”和“插件示例”两组,第一行是“新建界面”;底部是“场景”“资源与工具”“设置”,有问题时上方还会出现“发现报告” |
| 上下文条 | “页面”“场景”“分辨率”“来源”四个选择,和“重新加载预览” |
| 舞台 | 按所选分辨率显示真实页面 |
| 工具坞 | “浏览”和四种标注工具,以及截图、预览底色、抓手、缩放 |
| 右栏 | “标注”“检查”“草稿”“日志”四个页签 |
SettingsPanel,预览放大到 112%,并用“控件”工具做了一条标注。编号与上表各行的顺序一致:① 标题栏 ② 左栏 ③ 上下文条 ④ 舞台 ⑤ 工具坞 ⑥ 右栏。点击图片放大。打开一个界面
- 在左栏点一个界面。工程自己的界面在“生产界面”,插件自带的 Showcase 和 Sample 在“插件示例”。
- 界面有多个页面或视图时,展开行尾的箭头,点某一页或某个视图直接打开它。
- 在上下文条里选择“来源”:
| 来源 | 读取 | 需要 | 特点 |
|---|---|---|---|
| 源码(实时更新) | src |
界面依赖已安装 | 保存源码后预览立即更新;可以定位到源码行 |
| 构建产物 | dist |
已经构建 | 看到的就是 Unreal 将加载的文件 |
新增或移动界面后,点左栏的“重新扫描工程”。
页面按所选“分辨率”排版;拖动预览右下角外侧的手柄改变长宽比,双击恢复 1920 × 1080。缩放和移动见快捷键;工具坞的“截图并复制”把预览截图放进剪贴板。
预览里业务操作不执行,声音不播放,Native Surface、运行时图片和 Unreal 资产显示为占位;使用回退字体时,上下文条标出“字体/资源为回退”。蓝图或 C++ 逻辑、真实输入、声音、性能和叠在关卡上的可读性要在 Unreal 里检查。
预览底色
页面大部分是透明的。工具坞的“预览底色”决定透明处显示什么:透明网格(默认)、白色、黑色、灰色、自选颜色,或一张图片。放一张游戏截图作底,可以直接看出文字在画面上是否清楚。截图会带着同样的底色。
视图:webui-preview.json
一个页面常常有好几种样子:不同语言、空数据、弹窗打开。在 App 根目录放一份 webui-preview.json,把它们登记成视图,就能在左栏逐个打开。
例如各篇教程共用的设置面板:
{
"schemaVersion": 1,
"views": [
{ "id": "default", "route": "", "title": "Default" },
{ "id": "chinese", "route": "", "title": "Chinese", "patch": { "culture": "zh-Hans" } },
{ "id": "muted", "route": "", "title": "Volume 0", "patch": { "volume": 0 } }
]
}"default" · 没有 patch"chinese" · patch: { "culture": "zh-Hans" }"muted" · patch: { "volume": 0 }patch 就够了。视图的数据来自 App 的预览状态:src 下名字同时含有 preview 和 state 的导出(例如 createSettingsPanelPreviewState),常量或没有必填参数的函数都可以;也可以用 state 字段指明。没有预览状态时页面停在空状态,“发现报告”会写明原因。
| 字段 | 含义 |
|---|---|
schemaVersion |
固定为 1 |
state.module、state.export、state.args |
可选。预览状态在 src/ 下的模块、导出名和调用参数 |
views[].id |
视图标识,字母、数字、_、-,App 内唯一 |
views[].route |
所属路由。没有路由的 App 写空字符串 |
views[].title |
列表里显示的名字 |
views[].args |
这个视图调用预览状态时的参数 |
views[].patch |
合并到预览状态上的对象,适合只差一两个字段的视图。对象逐层合并,数组和其他值整体替换 |
views[].events |
显示这个视图时发给页面的事件:name、payload,可选的时机 at |
每个路由的第一个视图是默认视图。随附 Showcase 的 webui-preview.json 可以作为参考。
场景
上下文条的“场景”默认是“动态预览 · 工程源码”,每个视图一个。需要源码里没有的特殊状态时,从左栏底部打开“场景”,编辑 JSON(初始状态、操作的应答规则、按时间发出的事件),点“校验并保存”,之后就能在上下文条里选用这个自定义场景。
检查与日志
检查页签。 用“控件”工具点一个控件,右栏显示它的控件 Id、尺寸、源码文件与行号、组件层级和匹配到的样式规则。“在编辑器中打开”用系统默认程序打开源文件。
日志页签。 按时间倒序记录页面与宿主之间的消息、页面的 console 输出和被拦截的外部请求,可以按“全部”“警告”“错误”过滤。页面出错或操作被拒绝时,“日志”页签上出现红点。
settings-reset 这个控件Result 是模拟宿主对业务操作的拒绝(studio.unhandledCall),属于正常现象。标注并发给 Agent
Studio 可以把修改意见连同控件位置、截图和源码行一起交给 Codex 或 Claude。前提:工程已信任,并且已经安装并登录对应的桌面应用。
做标注
在工具坞选择一种标注工具:
| 工具 | 操作 | 记录 |
|---|---|---|
| 控件 | 点击控件;按住拖动则变成框选 | 控件和它的源码位置 |
| 点位 | 在任意位置点一下 | 一个坐标点和所在控件 |
| 框选 | 拖出一个矩形 | 区域和区域内的控件 |
| 圈画 | 按住自由勾画 | 笔迹和范围内的控件 |
选定后弹出标注浮层:
- 写下“想让这里怎么改”,按
Enter保存,Shift+Enter换行,Esc取消。 - 评论为空时,“控件”工具可以用
↑、↓改选父级或第一个子控件。 - 对单个控件可以展开“调整属性”,直接改文字、颜色、字体、间距、尺寸、边框等。这些调整只作用于预览,不改源码,它们作为目标值随标注交给 Agent。
Enter 保存。左边的滑杆图标展开“调整属性”。保存的标注在页面上显示编号,可以在右栏“标注”页签里修改、“重新选择目标”和删除。一批最多 30 条。页面或源码变化后标注会标出“需要重新定位”,用“重新选择目标”指定新目标。
标注工具启用时,点击不会传给页面;要操作页面先切回“浏览”。
发送
- 在右栏底部写这一批的整体要求。
- 点“发送给”,选择 Codex 或 Claude 和方式。前三种直接修改当前工程:
| 方式 | 说明 |
|---|---|
| 续用专属聊天 | 接着上一次由 Studio 发起的聊天;还没有时会新建 |
| 新建专属聊天 | 在桌面应用里为这个工程新开一个聊天 |
| 已有会话 | 从列表里挑一个属于这个工程的会话 |
| 隔离草稿 | 先在副本里生成改动,审阅后再应用,见隔离草稿 |
- 需要时调整模型与推理强度、修改范围,或打开“计划模式”(只写计划,不改文件)。
- 点“发送标注”。
没有标注时,按钮变成“发送整页修改”,让 Agent 修改当前预览的整个页面。
右栏的发送记录显示每一条的状态;对方改完源码后,预览直接显示结果。“停止跟踪”只结束 Studio 的等待,不会停止桌面应用里已经开始的任务。
向 Claude 发送时,Studio 会在工程的 .claude/ 里登记几条 statusMessage 为 Orion WebUI Studio bridge 的 Hook,用来接收回执。这个文件通常随版本库共享,提交前先看一眼这处改动。
新建界面
左栏第一行的“新建界面”打开一个弹窗:
- 写“界面描述”:要做什么、显示什么、能操作什么。写法见教程 1。
- “界面名”可选:大写字母开头,只含字母和数字,不能与已有界面重名。留空则由接收方命名。
- 选择发给 Codex 还是 Claude,用新聊天还是专属聊天。
- 点“发送给…”。或者点“复制提示词”,粘贴到任意对话里。
对方完成后,新界面出现在左栏;需要在 Editor 里完成的步骤由对方在回复里列出。
隔离草稿
想先看改动再决定要不要时,用“隔离草稿”:
- 添加标注,在“发送给”里选 Codex 或 Claude 的“隔离草稿”,点“生成隔离草稿”。
- Studio 在一份副本里让命令行工具修改,然后运行这个界面的类型检查、测试和构建。
- 在“草稿”页签审阅差异,可以把草稿和原工程并排预览。
- 满意后点“应用到工程”(之后可以“撤销这次应用”),再按需点“重建当前界面的 dist”。
所有标注必须属于同一个界面,并且来自“源码”来源。草稿只能改标注定位到的源码文件,以及你允许时的共享组件、入口与通信文件;只有工程 Content/UI/WebUI 下的界面能应用草稿。
快捷键
| 按键 | 作用 |
|---|---|
Ctrl+K |
命令搜索:工具、界面、页面、视图、语言、外观 |
Ctrl+. |
开关上一次用的标注工具 |
Ctrl + 滚轮、Ctrl+=、Ctrl+- |
缩放预览 |
Ctrl+0 |
预览回到适应窗口 |
| 鼠标中键拖动 | 移动放大后的预览 |
Ctrl+Enter |
在整体要求或界面描述里发送 |
排查
| 现象 | 原因与处理 |
|---|---|
| 左栏没有我的界面 | 目录不在名为 WebUI 的目录下,或者没有含 orionWebUI 的 package.json、index.html、dist/index.html 中的任何一个。补上后点“重新扫描工程” |
| “源码”来源不可选 | 依赖未安装;用“一键安装环境”,或在 App 目录运行 npm ci |
| “构建产物”来源不可选 | 没有 dist/index.html;运行 npm run build |
| 打开后是空状态 | 没有预览状态;看“发现报告”,按视图一节补上 |
| 浏览器里有数据,Studio 里没有 | 预览数据只写在“没有宿主”的分支里;把它导出成预览状态 |
| “构建产物”没有数据 | 先用“源码”来源打开一次这个页面,源码改动后再打开一次 |
点击按钮后日志里出现 studio.unhandledCall |
正常:业务操作在 Studio 里不执行。页面应当接住这个拒绝 |
| 不能发送 | 工程未信任,或桌面应用没有安装、没有登录;发往已有会话时,对方必须空闲并且输入框为空 |