UE5 UnLua 脚本方案原理
本文剖析 UnLua 是如何将 Lua 接入到 UE5中。尽可能少贴代码,将部分 Lua C API 的操作转为 Lua 伪代码,同时每个小节只关注主线内容,方便阅读和理解。
对象绑定
本小节只关注当 UE5 创建一个对象时,是如何将其和 Lua 脚本给绑定起来的。
1. 创建虚拟机
我们需要创建一个 Lua 虚拟机来执行游戏逻辑,但有时又希望每个 GameInstance 各自拥有自己的虚拟机,这样会更方便调试和管理,这就意味着需要确定每个 Object 会被分配到哪个虚拟机(以后为和代码保持一致,会简称为 Env),抽象出 ULuaEnvLocator 用于定位 Object 所属 Env,并创建 Env,Env 的一些简单操作会封装到 FLuaEnv 中。
大部分情况下,只需认为整个客户端只会开启一个 Lua 虚拟机就可以了,基于这个前提,甚至可以去掉这个类。
1 | class UNLUA_API ULuaEnvLocator : public UObject |
定位当前 Object 属于哪个 Env
1 | EnvLocator = NewObject<ULuaEnvLocator>(GetTransientPackage(), EnvLocatorClass); |
从以上代码能看出 FLuaEnv 就是虚拟机本身的封装类。
2. 绑定 UE 反射对象到 Lua
通过继承以下两个类,来进行监听当前创建、销毁哪些 UObject ,从而实现绑定,内部实现为了解耦,会在多处监听。
1 | class FUnLuaModule : public IUnLuaModule, |
知道了哪些对象创建出来后,还需要知道该对象跟哪份 Lua 文件进行绑定,Unlua 有好几种方案,第一种是最好理解的,要求实现 IUnLuaInterface 接口:
1 | class UNLUA_API IUnLuaInterface |
