只有当蓝图中的Tick事件启用时,Lua中的Tick才会执行。这个是UE自己的设计,开启Tick有两种方法,一种是在C++中把 bCanEverTick
设为true,另一种就是在蓝图中创建 Event Tick
节点,可见 FKismetCompilerContext::SetCanEverTick()
函数。
在 "Additional Non-Asset Directories to Package" 一栏中加入Script目录。
可以使用Lua原生的语言特性,通过 []
来访问得到 function
对象后调用。
self["function name with space"]() -- “静态函数”
self["function name with space"](self) -- “实例函数”
新建工程时选择C++项目,而不是蓝图项目。
蓝图编辑器的窗口宽度太小,导致绑定图标被收缩到下拉按钮了,试试最大化编辑器窗口。
我们在蓝图中看到的方法名,很多都是经过对阅读友好化处理过的,以 Actor
上最常见的 BeginPlay
为例,在C++中是这样的:
/** Event when play begins for this actor. */
UFUNCTION(BlueprintImplementableEvent, meta=(DisplayName = "BeginPlay"))
void ReceiveBeginPlay();
实际上蓝图中对应的就是 ReceiveBeginPlay
这个方法,只是通过 DisplayName
让我们在蓝图里看起来更友好一些。
从 2.2.0
版本开始,UE.XXX
只支持访问C++类型,蓝图类型需要先通过 UE.UClass.Load
加载再使用。
只能够覆写标记了 BlueprintNativeEvent
和 BlueprintImplementationEvent
的 UFUNCTION
。
可以将部分逻辑合并成函数(Collapse To Function),然后在Lua中覆写这个函数。
参考文档:调试
参考文档:智能提示
简单点可以利用UnLua默认的加载机制,会优先加载FPaths::ProjectPersistentDownloadDir()
目录下的脚本。
以Windows平台举例,打包后工程里的Lua文件require "A.B.C"
,会依次尝试加载:
- WindowsNoEditor/项目名/Saved/PersistentDownloadDir/Content/Script/A/B/C.lua
- WindowsNoEditor/项目名/Content/Script/A/B/C.lua
移动平台的下载目录则是:
- Android:/storage/emulated/0/Android/data/com.game.xxx/files/Content/Script/A/B.lua
- iOS:App的Document目录/PersistentDownloadDir/Content/Script/A/B.lua
也可以参考自定义加载器的示例来实现完全定制的加载策略。
UE有自己的文件系统,如果有自定义查找目录的需求,可以修改UnLua.PackagePath
来实现,比如:
UnLua.PackagePath = UnLua.PackagePath .. ';Plugins/UnLuaExtensions/LuaProtobuf/Content/Script/?.lua'
PS:默认值是Content/Script/?.lua;Plugins/UnLua/Content/Script/?.lua
。
腾讯内部已知的有四十款左右项目在使用UnLua,外部项目暂时无法统计。