前期准备工作:
第一步下载插件
https://github.com/Tencent/UnLua
下载的内容包了ULua的范例,可以先跳过,等看完教程再去看。
第二步,新建C++项目,命名为TestLua并且将Lua插件复制到项目中
重新生成项目,然后打开TestLua.sln重新编译一下
新建TestLua蓝图,点击类设置添加UnLuaInterface接口
会多出一个接口函数,这个接口函数是用来规划Lua的脚本目录
Lua中类的名称必须为PrefixCPP + ClassName + [ _C ]
输入BP.TestLua_C,意思在Content/Script/目录下放置TestLua_C脚本
确定无误后点击LuaTemplate按钮生成脚本
可以右键Script文件夹批量打开Lua脚本,注意,没事干别乱点,会重新覆盖脚本,巨坑!
到此为止,前期准备工作完成。
与蓝图的交互
打印Hello Word
打开TestLua_C.lua,发现常用的函数已经帮我们写好了,其中"--"表示注释
function TestLua_C:ReceiveBeginPlay()
UE4.UKismetSystemLibrary.PrintString(self,"Hello World!")
end
在ReceiveBeginPlay函数中写上打印,将TestLua蓝图拖入到场景中,点击引擎中的播放运行
激动人心的Hello World出来了!
覆盖蓝图函数
新建TestPrintString函数,在BeginPlay的时候调用一下
接下来就在lua脚本中重写TestPrintString函数
function TestLua_C:TestPrintString()
UE4.UKismetSystemLibrary.PrintString(self,"Hello Lua!")
end
运行
如果你不希望在蓝图EventTick来调用TestPrintString,而是在的BeginPlay中调用TestPrintString,,会没有效果,因为BeginPlay被lua覆盖了,如果想要在蓝图中也能够调用,需要回调self.Overridden.ReceiveBeginPlay(self)
除了这个之外self.Overridden.ReceiveBeginPlay(self),你会发现一个很相似的函数:
self.Super.ReceiveBeginPlay(self),这样的函数是返回Lua父类方法,不能够返回蓝图父类的方法
需要注意的是,Lua的继承比较奇葩,首先你得在蓝图中拥有继承关系,然后需要在脚本中注明继承类
比如新建一个ParentLua,然后让TestLua在蓝图中的父类选择为ParentLua,蓝图的ParentLua不需要UnLuaInterface接口,只需要生成lua脚本后,在TestLua脚本中声明继承类名
local TestLua_C = Class("ParentLua_C")
调试
写程序难免出错,Ulua虽然没有很好的调试手段,但也留下了难能可贵的错误输出日志信息
如果不是特别精通Lua开发的同学,建议还是以蓝图为主吧,目前ULua开发还不是很友好。