设置¶
通过 UnLuaNova工具栏->设置 打开,或者从 项目设置-> 插件 界面找到对应的选项卡。
一、运行时设置¶
启动模块名称¶
当Lua环境启动时,立即执行指定的脚本模块。例如此选项配置为 Main 时,将会执行 Main.lua 。留空则表示不执行任何脚本模块。
无限循环检测¶
设置一个超时时间(单位:秒),防止Lua代码陷入无限循环,导致游戏失去响应。默认为0秒(不启用)
注:检测基于 Lua Hook API ,因此只能防止Lua虚拟机在执行字节码时的无限循环,如果执行发生在C++层则依然会卡死。
悬垂指针检查¶
禁止Lua侧缓存任何结构体和容器的引用,在完成一次完整的从C++到Lua的调用之后标记它们为无效。
崩溃时输出Lua堆栈到日志¶
当捕获到崩溃时将所有的Lua环境的堆栈输出到日志,用于辅助问题排查。默认启用。
Lua环境分配器¶
默认的分配器会将所有 UObject 都分配到同一个Lua环境里,这通常适用于绝大部分的应用场景。
但有时候我们可能会有环境隔离的需求,比如将同一个 GameInstance 下的所有对象放在同一个环境里,在游戏退出时一次性释放所有该游戏实例相关的资源。又或者一些Lua游戏UI框架没有为单进程多游戏实例设计,在单进程启动多个游戏实例时会出现对象冲突的问题,此时就可以选择使用 ULuaEnvLocator_ByGameInstance 来做好相互隔离。
你也可以继承 ULuaEnvLocator 来实现自己的分配逻辑,但要注意的是,隔离并不是沙箱,它们依然可以通过UE接口访问到其它环境中的对象。
Lua模块定位器¶
默认在绑定对象到Lua时,生成的 GetModuleName 需要手动填入绑定模块路径,或者按住Alt来根据蓝图资源路径来自动填充。
如果期望建立自己的绑定规则,比如所有 Content/Blueprints 目录下所有的蓝图都直接绑定到 Content/Script 下同名的Lua脚本,或者剔除掉脚本名的 BP_ 前缀等等。
针对这类需求,可以继承 ULuaModuleLocator 来实现自己的自动绑定规则。如此一来,也可以避免不确定哪些蓝图绑定了哪些脚本的情形,更便于管理。
预绑定类型列表¶
在编辑器环境下,类似 UBlueprintFunctionLibary 和 UAnimNotifyState 这种类型在退出PIE后是不会销毁的。第二次进入PIE时候UnLuaNova无法捕获到它们的构造事件,会导致Lua绑定失效。将这种 “常驻” 类型加入到配置中,在启动Lua环境后立即进行绑定内存中它们的子类。
二、编辑器设置¶
热重载模式¶
- 自动:在代码发生变更时立即重载
- 手动:通过快捷键
Alt+L或工具栏热重载菜单选项触发热重载 - 永不:禁用热重载机制
生成智能提示信息¶
是否为Lua生成智能提示信息,使用流程参考这里
自动启动¶
默认UnLuaNova模块会随着游戏启动自动开启,以便捕获到所有可绑定的对象。但有时候可能会有自己的游戏启动流程,可以关闭这个选项,在合适的时机通过UnLuaNova::Startup() 来启动。
注:重启编译后生效
启用UnLuaNova调试代码¶
打开这个选项以获得UnLuaNova相关的更详细的调试信息,默认关闭。
注:重启编译后生效
启用Insights分析支持¶
打开这个选项以获得在Insights的UE调用Lua覆写函数的分析支持。
启用UFunction调用参数持久化缓存¶
为每个UFunction创建一个缓存块,每次进行UE和Lua交互调用时,重用这块内存,节省反复分配/释放内存的开销,默认启用。
注:重启编译后生效
启用类型检查¶
在每次Lua调用UE时进行参数类型检查,建议本地开发时启用,游戏测试/发布时关闭以获得更好的性能,默认开启。
注:重启编译后生效
启用RPC调用支持¶
默认开启,关闭后会默认所有覆盖的函数调用为本地调用,并对Out参数预留缓存,以获得这类函数调用的少许性能提升。如果你的游戏使用了联机特性建议不要关闭这个选项。
已过时:这个选项将在未来版本中移除。
注:重启编译后生效
启用被覆写函数调用支持¶
默认开启,使得我们在Lua中可以使用 self.Overridden 来访问被覆写的原函数。
注:重启编译后生效
启用FText支持¶
默认关闭,默认 FText 类型是以 lua string 的方式传递的,会丢失一些多语言信息。开启这个选项后 FText 会以C++对象的方式传递,以得到更好的多语言支持。
注:重启编译后生效
使用C++编译Lua环境¶
默认关闭,开启以得到更正确的跨语言交互异常处理支持,但需要手动处理以C编译的第三方库源码依赖Lua的符号问题。
注:重启编译后生效
Lua后端¶
在 Config/DefaultUnLuaNovaEditor.ini 中设置(改完需要重新编译,后端是编译期选择):
[/Script/UnLuaNovaEditor.UnLuaNovaEditorSettings]
LuaBackend=Luau
| 值 | 说明 |
|---|---|
Lua |
官方 Lua(github.com/lua/lua),与上游 UnLua 行为一致。版本由子模块指针决定,不体现在名字里 |
Luau |
Luau(github.com/luau-lang/luau)默认;提供渐进类型、原生沙盒、原生断点调试等能力 |
两个后端都以 git 子模块引入,位于 Plugins/UnLuaNova/Source/ThirdParty/:
ThirdParty/
├── LuaLib/ 本项目:Lua.Build.cs + LuaUnity.c
│ └── Lua/ 子模块:github.com/lua/lua
└── LuauLib/ 本项目:Luau.Build.cs + GenerateWrappers.py + Generated/
└── Luau/ 子模块:github.com/luau-lang/luau
子模块就放在各自的包装目录里:源码归上游仓库,包装(*.Build.cs、单一 TU 聚合文件、Luau 的生成包装)归本项目。
克隆仓库后需要初始化子模块:
git submodule update --init --recursive
注:切换后端后需重新编译。旧版本通过「自定义Lua版本」指定 lua-5.4.x 源码目录的方式已移除。
UE4命名空间¶
兼容旧版本需要通过 UE4 来访问的代码(新版中为 UE)。
注:重启编译后生效
返回值顺序¶
兼容旧版本需要把Out参数放在返回值前面的代码。
注:重启编译后生效
蓝图资源路径后缀¶
兼容旧版本中加载蓝图资源时,需要自动在路径末尾补 _C 的代码。
注:重启编译后生效
兼容UTF-8 BOM文件头¶
默认关闭,旧版本中会兼容带了BOM文件头的Lua文件,但会给运行时加载Lua带来一些没有必要的检测开销,建议使用自动化的工具来保证Lua文件编码正确。
关闭此选项时编辑器下会保持兼容,但会有相应的警告日志。
注:重启编译后生效
传参方式¶
旧版本中从UE调用被Lua覆写的UFunction时,是将对象参数作为指针传入的(比如容器、结构体),如果直接在Lua里修改需要进行手动拷贝操作(比如ToTable或Copy)。这在大多数只读的情况下都能工作良好,但有较好的性能收益的同时也带来了一些额外的心智负担。关闭这个选项能够将这个行为调整为默认自动拷贝。
检查新版本¶
当发现新版本时,会在控制台输出新版本信息。