Verse Wiki — 写给蓝图作者的 Verse 手册
技巧 · EXTRA

Verse 编译报错怎么读:文件、行列、错误码

蓝图作者第一次写 Verse,最大的落差不是语法,是报错。蓝图出错时编辑器会把出问题的那个节点圈红,你双击就跳过去了;Verse 甩给你的是一行英文加一串编号。好消息是它有固定结构——学会拆开它,再认全新手最常撞的那几条,报错就从劝退变成导航。

一、报错的三段式

在 UEFN 里按 Ctrl+Shift+B 编译失败时,Verse 按钮会变成红色停止图标,点错误提示里的「See Errors」会打开 Message Log 面板,里面列着全部错误。挑一条出来看,它长这样:

Message Log 里的一条编译错误
my_door.verse(10,9, 10,13) : Verse compile error vErr:S54 : Unknown identifier `Prnt`.

它分三段,从左往右读:

例子 怎么用
位置 my_door.verse(10,9, 10,13) 文件名,加上一对「行,列」。第一对是出错片段的起点,第二对是终点——也就是说编译器已经把出错的那几个字符精确框出来了。第 10 行第 9 列到第 13 列,正好是 Prnt 这四个字母
错误码 vErr:S54 vErr 是「Verse 错误」的前缀,后面那个编号是错误类别。它的用处是搜索:把编号连同描述一起丢进搜索引擎或 Epic 开发者论坛,大概率有人撞过同一条。注意编号会随编译器版本调整,认后面那句描述比认编号更可靠
描述 Unknown identifier `Prnt`. 真正的信息量在这里。反引号里的名字是编译器不认识的那个词——这里是把 Print 敲成了 Prnt

习惯之后,读一条报错只要三秒:哪个文件第几行 → 编译器在抱怨哪个词 → 它抱怨的是哪一类问题。在 Message Log 里双击这一条,UEFN 会把你送到那一行那一列,光标就停在出错的字符上。

二、新手最常撞的五条

下面五条覆盖了绝大多数「第一周」的编译失败。描述文本会随版本微调,但意思是稳定的。

1. Unknown identifier —— 「这个名字我不认识」

大意:你用了一个编译器没见过的名字。三种成因,按概率排序:

2. Unknown member —— 「这个东西上没有这个成员」

大意:名字本身认得,但你拿它去点一个它没有的东西,比如 MyDoor.Opne()。翻译到蓝图语境就是:你从一个对象引脚上拉出来,搜一个这个类根本没有的函数。定位办法和上一条一样——先怀疑拼写,再去 Verse API 文档里确认这个类到底有哪些成员。

3. 重写对不上号 —— <override> 相关

这一类有两个方向,报错描述不同但根因是同一个:你写的签名和父类里那份对不上

撞到这一类,别急着改逻辑,先把 OnBegin<override>()<suspends>:void = 这一行和正课里的写法逐字比对一遍。

4. 失败上下文 —— 「这个判断必须放在允许失败的地方」

大意是:这个可能走不通的表达式,必须出现在一个允许它走不通的位置(英文里会出现 failure context 这个词)。新手撞到它,九成是忘了写 set:你想改一个变量,写了 Score = 100,但 Verse 里单个 =比较,不是赋值——于是这行变成了一个判断,而判断不能光秃秃地站在那儿。

解法:改值一律写 set Score = 100。这条报错的完整故事在第 8 课和第 12 课。

5. 缩进与语法 —— 「这儿不该出现这个」

Verse 用缩进表达归属,所以缩进错了就是语法错了。最常见的两种:该缩进的行没缩(函数体和函数声明齐平)、以及混用 Tab 和空格——肉眼看着对齐,编译器看到的是两种不同的字符。VS Code 默认 4 空格,别去动它。这类报错的描述往往比较干(「Expected …」之类),但位置那一段永远准确,顺着行号看缩进就行。

还有一条不算错误但值得知道:编译通过不代表运行时不会出事。Verse 另有一套运行时错误上报机制,那是另一个话题,见文末来源。

三、定位手法:四条经验

四、和蓝图的 Compiler Results 面板对照

蓝图当然也会编译失败,只是你可能没太把它当回事——因为它错得「有画面」。

蓝图 Verse 差异
Compiler Results 面板列出错误,双击跳到出错的节点 Message Log 列出错误,双击跳到出错的行和列 一个用图形定位,一个用坐标定位。Verse 精确到字符,反而比「圈红一个节点」更准
工具栏 Compile 只编译当前这一个蓝图资产 Build Verse Code 一次编译项目里所有 .verse 文件 Verse 的报错可能来自你今天根本没打开的文件;好处是跨文件的不一致当场暴露
很多「错误」在你连线的当下就被拦住了:类型不匹配的引脚根本连不上 全部推迟到编译期,由编译器一次性报出 蓝图用编辑器 UI 提前拦截,Verse 用编译器事后拦截。这是文本换来的代价,也是它能被 diff、被 review 的原因
有 Warning 也能保存、能运行 编译错误一条都不能剩,否则进不了游玩测试 Verse 更硬:要么全过,要么全不过

习惯之后你会发现文本报错其实更好用:它可以被复制、被搜索、被贴进论坛帖子、被丢给 AI。蓝图里那个圈红的节点,你只能截图。

一次 Build 之后 Message Log 里冒出 9 条报错。最有效率的第一步是什么?

五、来源

本文整理自 Epic 官方文档: