1. 研究SluaUnreal中lua代码和C++BP的衔接关系

首先是结合使用的效果。

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 已经预先将常用的ActorCharactorPawnUserWidgetController, 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这边的不可覆盖逻辑。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值