首先是结合使用的效果。
1.使用Slua拓展蓝图
我们知道如果要用SLua拓展一个Actor蓝图,需要让这个蓝图继承自LuaActor的C++类。
继承后我们会在蓝图类的详情面板中看到下面这栏
我们在LuaFilePath中填下拓展该蓝图类的Lua脚本在Lua目录下得相对路径即可。
在使用中我们可以用self来访问该蓝图中的变量和方法。
也就是说self是对原蓝图类的一层封装。
值得一提的是在lua中我们实现原蓝图中同名方法时,在游戏运行时表现出来得效果是对蓝图方法进行覆盖。
以ui来举例(刚好现在负责ui,LuaUserWidget其实和LuaActor实现的方式也大同小异啦)
假如我在蓝图中实现了EventConstruct
并在拓展的lua中也实现了Construct方法
那么游戏运行时将不运行蓝图上面的逻辑,继而直接运行lua上的逻辑。
2.接着是使用Slua拓展C++类
假如要拓展的是Actor类或Actor子类
我们需要在创建Actor对象的使用使他的基类为LuaActor
题外话(这是lua和C++以及蓝图产生联系的封装)
slua 已经预先将常用的Actor,Charactor,Pawn,UserWidget,Controller, PlayerController, GameModeBase, HUD 都做了类似支持,方便使用,同时你也可以自行扩展更多Actor具备如此能力。
上面这行话是来自sluaunreal文档的值得注意的一点是UserWidget并不是Actor而是Uobject。也许这里是作者没注意吧。
接着如上拓展了Actor类或Actor子类后
要绑定lua脚本也类似上面蓝图的操作不过这个操作是在C++代码里面做的
设定Actor绑定的lua文件,为此我们需要添加构造函数,例如:
AMyLuaActor::AMyLuaActor() {
LuaFilePath = "MyLuaActor";
LuaStateName = "main";
}
把上面我们自定义的LuaActor 子类 绑定lua 脚本后
我发现和拓展蓝图 的覆盖表现不一致。
拓展C++类的表现是
先调用lua里的方法 再调用C++里的方法。
此时我lua里的逻辑如下
然后又瞅了眼slua文档有这样一句话
因为上面的实验lua和C++ 都执行了,所以我又改了下C++
在Actor类的beginplay中最后一行加上
并让C++LuaActor子类不执行Actor的beginplay
让lua 调用基类beginPlay
结果是输出了hello 2 而lua call 和 actor基类的输出均没有。
到这里感觉能给一个结论了就是LuaActor子类中的方法(至少是BeginPlay)和lua中的BeginPlay() 是两个完全不同的东西。
且缺少了Actor类BeginPlay的调用lua BeginPlay也不会被调用。
所以文档中的意思可能确实是用lua beginPlay来覆盖绑定的C++类(LuaActor的子类)的基类LuaActor-----Actor中的方法。(由于LuaActor中没有覆盖基类中Actor的生命周期方法)
于是又开始实验
LuaActor子类恢复
Lua中
输出
Lua中的BeginPlay好像并不能覆盖Actor中的BeginPlay,但两个方法相互独立应该是没错了。
文档中有这样一句话。
那么slua不覆盖C++中的同名函数只是起到一个模拟生命周期的作用吗
这样lua对于C++不能覆盖同名函数只能在C++逻辑前插入lua逻辑了
Log中lua输出在C++输出前。
至少在我们项目中是这样的用法。
上面的结论就是
Lua拓展蓝图可用lua同名方法覆盖蓝图中的逻辑
Lua拓展C++可在C++同名方法执行前插入Lua逻辑。
对了文档中还有一句话
作者的意思是把绑定类当作lua脚本的父类吗,那前面是不是可以理解成【受绑定lua脚本】的父类是LuaActor子类咯。至于LuaActor子类的beginplay和 lua beginPlay先后执行 也许是项目中的bug(emmm最近有同事在改sLua代码)
总之先放着,现在的表现就是lua拓展C++ 只能在C++同名方法前插入lua这边的不可覆盖逻辑。