Verse Wiki — 写给 UE6 时代的 Verse 互动手册
拓展 · EXTRA

跨文件夹引用自己模块的正确姿势

第 3 课学会了 using 官方模块,可项目一旦拆成多个文件夹,「怎么引用自己的模块」就成了论坛上的月经题。这一页把社区沉淀的实战规则整理成速查卡:四条规则,覆盖同目录、子文件夹、嵌套模块三种场景。

一、一个两层文件夹的示例工程

先立一个靶子。假设你的项目 Content 里长这样——回忆第 3 课:每个文件夹自动成为同名模块:

目标:让 hub_device.verse 用上 combat 模块里的函数,再摸清嵌套的 skills 该怎么导入。

combat/damage.verse
# 文件夹 combat 就是模块名,这个文件里的定义自动归入 combat
# 想被外面用,成员要标 public(模块本身的可见性见拓展 x2)
CalcDamage<public>(Base:int, Bonus:int):int = Base + Bonus

(读图翻译:这就是一个蓝图函数 CalcDamage——两个整数输入引脚 Base、Bonus,输出它俩之和;<public> 是给函数挂上「对外可见」的牌子。)

成员开了门还不够,combat 模块本身也得对外可见——在 combat/ 文件夹旁边放一个同名 .verse 文件,给模块补上显式声明(两道门的道理见下文规则四):

combat.verse(与 combat/ 文件夹同级)
# 同名 .verse 文件为文件夹模块声明可见性,combat 从默认 internal 变为 public
combat<public> := module:
hub_device.verse
using { /Fortnite.com/Devices }
using { /UnrealEngine.com/Temporary/Diagnostics }
using { combat }

hub_device := class(creative_device):

    OnBegin<override>()<suspends>:void =
        Print("总伤害:{CalcDamage(10, 5)}")

(读图翻译:这台主设备开头三行 using 把三个抽屉勾进来,其中 combat 是你自己的;Event BeginPlay 里用 Print String 打出「总伤害:15」,那个 15 是现场调用 combat 抽屉里的 CalcDamage(10, 5) 算出来的。)

注意第三行:自己项目里的模块不需要域名式长路径,同一层级直接写模块名 using { combat } 就够了。这是新手最常犯的错误之一——照着官方模块的样子写 using { /combat.com/... } 之类的臆造路径,当然找不到。

二、速查卡:四条规则

规则一:同目录的模块,直接写名字。using { your_module },不带斜杠、不带域名。

规则二:子文件夹里的模块,可用本地路径。形如 using { /YourFolder/your_module },以 / 开头、从项目代码根往下写。至于带账号的完整项目路径,写法随账号与项目而异——别背模板,以 Verse Explorer 中生成的实际路径为准。

规则三:嵌套模块,先外层后子模块。这是论坛验证过的硬规则:导入顺序反了会直接报错。

导入嵌套模块的顺序
using { combat }           # 先导入外层模块
using { combat.skills }    # 再导入子模块——顺序反了会报错

# 也可以只导入外层,用点号限定访问子模块的成员:
# combat.skills.SomeClass

规则四:模块和成员都要 public。跨模块访问一个成员,得过两道门:模块本身可见、成员本身可见。只给函数标了 <public> 而模块还是默认 internal,照样吃访问权限错误——两道门都要开(为什么默认关门,见拓展 x2 的 23.20 变革史)。

四条规则合在一起,就是多文件项目的完整引用心法:名字解决同层,路径解决跨层,顺序解决嵌套,public 解决权限。项目再大,引用问题也逃不出这四句。

最后一条排错提示:如果 using 怎么写都报「找不到模块」,先停下来检查两件事——文件夹名最近有没有被改过(第 3 课讲过,目录名就是模块路径,改名等于搬家),以及报错的到底是「找不到模块」还是「访问权限」。前者查路径和拼写,后者查两道 public 的门。分清这两类错误,能省下论坛上大多数人绕过的弯路。

文件顶部先写了 using { combat.skills },下一行才写 using { combat },Build 的结果是?

出处与延伸

本文整理自 Epic 开发者论坛的多个高热帖子: