.verse 文件放在哪、怎么被引用
正课里你写了一个类,放在一个 .verse 文件里。但一个项目不会只有一个文件——第二个类该建新文件还是塞进去?两个文件里的类怎么互相看见?这一页讲清 Verse 代码在项目里的组织方式,再把纯文本的 .verse 和二进制的 .uasset 摆在一起,看看这个差别到底带来了什么。
一、Verse 代码住在哪:Verse Explorer 里的那棵树
UEFN 里有一个专门的面板叫 Verse Explorer,它显示的就是你项目里所有 .verse 文件的一棵树,根节点是项目名。正课里那句「右键项目名 → Add new Verse file to project」,做的事就是在这棵树上挂一个新文件。
这棵树在硬盘上是真实存在的文件夹和文件,不是编辑器虚构的视图。你可以在文件管理器里找到它们,用记事本打开,内容就是你在 VS Code 里看到的那些字符。这一点和 Content Browser 很不一样:Content Browser 里的路径(/Game/...)是引擎的虚拟路径,资产是二进制包。
顺带一提:.verse 文件不是「资产」。它不出现在 Content Browser 里,也不能被拖进关卡。被拖进关卡的是编译产物——你写的类经过 Build Verse Code 之后,才会以一个可放置的条目出现在 Content Browser 里。源码和产物是两样东西,这也是 Verse 和蓝图最结构性的差别之一。
二、文件与模块:决定可见性的是文件夹,不是文件
新手最容易问错的问题是「我的类在 A 文件里,B 文件怎么用它?」——因为这个问题的主语搞错了。Verse 里管可见性的单位不是文件,是模块(module);而一个模块,就是 Verse Explorer 里的一个文件夹。
- 你在 Verse Explorer 里新建一个文件夹,就等于新建了一个模块,模块名就是文件夹名;
- 同一个文件夹里的若干个
.verse文件,属于同一个模块——它们里面的定义彼此天然可见,不需要任何using; - 要用别的文件夹里的东西,才需要在文件顶部写一条
using,把那个模块的路径请进来; - 项目自己的模块路径,以创作者名和项目名开头,形如
/YourName@fortnite.com/YourProject/Folder——和你在正课里见过的/Fortnite.com/Devices是同一套路径体系,只是那些是 Epic 提供的库。
所以「一个文件一个类」在 Verse 里纯粹是整理习惯,不是语法要求:一个文件里塞五个类,和拆成五个文件放在同一个文件夹里,可见性完全一样。拆文件是为了人好找,不是为了让编译器高兴。
注意:模块层级的规则在 UEFN 23.20 版本调整过一次,更早的教程里的写法可能对不上号。using 与模块的完整语法是下一课(第 7 课)的主题,这里只建立「文件夹 = 模块」这一个心智模型。
和蓝图的引用方式对照
| 蓝图 | Verse | 差异 |
|---|---|---|
任何蓝图都能引用任何别的资产,靠资产路径(/Game/...) |
要用别的模块里的东西,必须先在文件顶部 using |
蓝图的引用是按资产、随用随建;Verse 的可见性是按模块、必须显式声明 |
| Content Browser 的文件夹只是整理,不影响谁能引用谁 | Verse Explorer 的文件夹就是模块边界,直接决定可见性 | 在蓝图里挪一个资产到别的文件夹,引用照旧;在 Verse 里挪一个文件到别的文件夹,它就换了模块 |
| 一个资产就是一个类,没有「一个文件多个类」这回事 | 一个文件可以放任意多个类、函数、枚举 | Verse 允许你把一组相关的小类放在同一个文件里,这在蓝图里做不到 |
三、.verse 与 .uasset:一个是文本,一个是二进制
现在说这一页真正想让你记住的那件事。BP_MyDoor.uasset 是二进制文件:除了 Unreal 编辑器,没有任何工具能有意义地读它。my_door.verse 是纯文本:记事本能打开,能复制,能搜索,能逐行比较。
这个差别听起来很技术,但它决定的其实是你和队友怎么一起工作:
| 这件事 | 蓝图资产(.uasset,二进制) |
Verse 源码(.verse,文本) |
|---|---|---|
| 用什么打开 | 只有 Unreal 编辑器 | 任何文本编辑器 |
| 版本控制里看变更 | 只知道「这个文件变了」,看不出变了什么 | 逐行显示:加了哪行、删了哪行、改了哪个词 |
| 两个人同时改同一个东西 | 无法自动合并,通常只能二选一 | 改的不是同一段就能自动合并,冲突了也能手动挑 |
| 常见协作策略 | 独占签出:谁在改,别人就锁着别碰 | 各改各的,事后合并 |
| 代码审查 | 基本靠截图和口头描述 | 可以逐行留评论 |
| 让 AI 读写 | 几乎不可能 | 直接读、直接改(第 30 课的主题) |
这不是说蓝图做错了什么。二进制资产换来的是图形化编辑和引擎级的强引用检查,这些也是真本事。但如果你在一个多人团队里被「蓝图合并冲突」折磨过,你会立刻明白 Epic 为什么要把新一代玩法框架建在一门文本语言上。
还有一条现实提醒:UEFN 项目并不会因为你写了 Verse 就变成纯文本工程。关卡、网格、材质、音效仍然是二进制资产,只有逻辑那一层文本化了。所以真实的工程是混合的——代码走文本流程,美术走资产流程。这也是为什么「把逻辑写进 Verse、把内容留在资产里」在今天是个划算的分工。
你的项目里,door.verse 和 lock.verse 放在同一个文件夹里。lock.verse 想用 door.verse 里定义的类,要做什么?
四、来源
本文整理自 Epic 官方文档与开发者论坛: