# UE4-slua_example **Repository Path**: jiangluu/UE4-slua_example ## Basic Information - **Project Name**: UE4-slua_example - **Description**: No description available - **Primary Language**: C++ - **License**: BSD-2-Clause - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-05-09 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 本项目是什么 本项目是基于 [slua](https://github.com/Tencent/sluaunreal) 的一个示例项目,并做了一点修改以贴合我们自己的需求。 slua是腾讯的一个项目,并已应用在 PUBG (即吃鸡)中。 可以直接以本项目作为开始,开发你自己的业务;也可以按照下面一节的说明,把slua应用到你自己的现有项目中。 ## 如何在你自己的现有项目中应用slua - 放入插件 把本项目的Plugins目录复制到你自己的项目下。重新打开UE Editor让插件编译。 - 添加自己的GameInstance C++类 在UE Editor中,在内容浏览器中右击,选择 新建C++类;选择父类为 GameInstance,类名建议指定为 KLGameInstance。 然后把本项目Source目录下的 KLGameInstance.h .cpp 文件与你的合并(最简单的合并就是直接覆盖,然后修改一下.h文件中的一个项目前缀)。 重新编译项目并确认没有报错。 - 指定自己的GameInstance 在UE Editor中,选择 项目设置-》地图与模式,在游戏实例中选择刚才添加的 KLGameInstance。 - 添加自己的脚本绑定 把本项目Source目录下的 SluaTestCase .h .cpp 文件,复制到你的项目中的对应目录。 重新编译项目并确认没有报错。 - 添加脚本 把本项目 Content目录下的Lua目录复制到你的项目中的对应目录。 并记得以后把你自己的Lua脚本都放在此目录下。 ## Lua脚本于蓝图如何结合 ### 入口 将slua插件加入项目后,虽然从代码上来说有了与脚本交互的能力,但实际上在运行时,还需要有一个入口,用来装载你的脚本。 目前这个入口只有一个办法,就是在场景中加入一个类型为 LuaActor的固定actor,并绑定一个 entry脚本文件,把所有你希望在本场景加载的脚本,在entry之内加载完毕。 这样就可以在本场景的蓝图中调用脚本中的函数了。 ### 蓝图调用脚本函数 在蓝图中加入一个 CallToLuaWithArguments节点,填入目标脚本函数名,并传入args参数,就可以调用脚本函数了。 ### 脚本中调用蓝图功能 基本所有蓝图类都已默认导入到脚本中,脚本可以随意调用。当然这需要使用者对蓝图有哪些类和方法有一定了解。 简单的例子: ```lua -- import blueprint class to use local Button = import('Button'); local ButtonStyle = import('ButtonStyle'); local TextBlock = import('TextBlock'); local SluaTestCase=import('SluaTestCase'); -- call static function of uclass SluaTestCase.StaticFunc() -- create Button local btn=Button(); local txt=TextBlock(); -- load panel of blueprint local ui=slua.loadUI('/Game/Panel.Panel'); -- add to show ui:AddToViewport(0); -- find sub widget from the panel local btn2=ui:FindWidget('Button1'); local index = 1 -- handle click event btn2.OnClicked:Add(function() index=index+1 print('say helloworld',index) end); -- handle text changed event local edit=ui:FindWidget('TextBox_0'); local evt=edit.OnTextChanged:Add(function(txt) print('text changed',txt) end); ``` ### 事件作为一个流程的开头 事件作为一个流程的开头,将只能写在蓝图中。因为脚本自己无法决定自己在什么时机被调用,这个时机总是unreal引擎决定的。