UnLua基础
简介
UnLua是适用于UE的一个高度优化的Lua脚本解决方案,由Tencent提供。详细可以看github中readme文档。
快速开始
安装
- 将UnLua中
Plugins
目录放置在UE4项目的根目录下。 - 将
UnLua.lua
脚本放置Content/Script
目录下。 - 重启UE工程。
UnLua初探
步骤:
- 编写
HelloWorld.lua
并放置在对应目录下。 - 在UE4中创建普通蓝图A。
- 将蓝图与lua脚本关联。
- 将普通蓝图A和关卡蓝图关联。
或者:
- 编写
HelloWorld.lua
并放置在对应目录下。 - 在UE4中编辑关卡蓝图。
- 将关卡蓝图与lua脚本关联。
编写HelloWorld.lua
创建HelloWorld.lua
脚本,并将其放置工程中的Content/Scrpit
或者Content/Scrpit/subTreeDir
目录下。
HelloWorld.Lua
脚本如下
-- 加载UnLua脚本, 必需*
require "UnLua"
-- 创建HelloWorld_C类
local HelloWorld_C = Class()
-- 初始化时执行
function HelloWorld_C:Initialize()
print("所有绑定到Lua的对象初始化时都会调用Initialize的实例方法")
end
return HelloWorld_C
以下是UnLua创建出来的模板脚本:Template.lua
,其各个函数后续会讲到。
--
-- DESCRIPTION
--
-- @COMPANY **
-- @AUTHOR **
-- @DATE ${date} ${time}
--
require "UnLua"
local Template_C = Class()
--function Template_C:Initialize(Initializer)
--end
--function Template_C:UserConstructionScript()
--end
--function Template_C:ReceiveBeginPlay()
--end
--function Template_C:ReceiveEndPlay()
--end
-- function Template_C:ReceiveTick(DeltaSeconds)
-- end
--function Template_C:ReceiveAnyDamage(Damage, DamageType, InstigatedBy, DamageCauser)
--end
--function Template_C:ReceiveActorBeginOverlap(OtherActor)
--end
--function Template_C:ReceiveActorEndOverlap(OtherActor)
--end
return Template_C
创建蓝图并关联
- 任意创建一个
蓝图A
,打开蓝图A
的类设置。在面板Details -> Interfaces -> Add
添加一个UnLuaInterface接口
。 - 双击在MyBlueprint面板中的
Interfaces -> Get Module Name
,将Reture Node节点
中的Reture Value的内容
修改为HelloWorld
。
Lua脚本放在Content/Script的子目录下
若HelloWorld.lua脚本
放在Content/Script子目录
下。例如:Content/Script/subTreeDir目录
下,需要修改的是将蓝图中Reture Value
内容改为subTreeDir.HelloWorld
。
关联关卡蓝图和普通蓝图A
- 在编辑器中打开关卡蓝图。
- 创建
Construct节点
,并将其节点的类改为蓝图A。 - 将关卡蓝图的
EventBeginPlay
连接到ConstructA
。
无需普通蓝图A,直接与关卡蓝图绑定
- 打开
关卡蓝图
的类设置。在面板Details -> Interfaces -> Add
添加一个UnLuaInterface接口
。 - 双击在MyBlueprint面板中的
Interfaces -> Get Module Name
,将Reture Node节点
中的Reture Value的内容
修改为HelloWorld
。
结束
打开Window -> Developer Tools -> Output log窗口
,并且运行游戏;即可在控制台中看到所有绑定到Lua的对象初始化时都会调用Initialize的实例方法
的输出内容。
UnLua中的Initialize方法
描述
所有绑定到Lua的对象初始化时都会调用Initialize的实例方法。
实例
创建Module.lua
InitializeTest/Module.lua
脚本如下
require "UnLua"
local Module = Class()
-- 所有绑定到Lua的对象初始化时都会调用Initialize的实例方法
function Module:Initialize()
local msg = [[
InitializeTest exce Initialize function.
]]
print(msg)
end
return Module
关卡蓝图关联InitializeTest.lua脚本
- 打开
关卡蓝图
的类设置。在面板Details -> Interfaces -> Add
添加一个UnLuaInterface接口
。 - 双击在MyBlueprint面板中的
Interfaces -> Get Module Name
,将Reture Node节点
中的Reture Value的内容
修改为InitializeTest.Module
。
UnLua中覆盖蓝图事件
描述
覆盖蓝图事件时,只需要在返回的table
中声明Receive{EventName}
。
注意点
关卡蓝图、Object蓝图、Actor蓝图、Character蓝图的Event是不一样的。例如关卡没有Actor的部分事件。
该规则不适用于CustomEvent。TODO
创建Module.lua
OverrideBlurprintEvents/Module.lua
脚本如下
require "UnLua"
local Module = Class()
function Module:ReceiveBeginPlay()
print("覆盖蓝图的BeginPlay事件.")
end
function Module:ReceiveTick(DeltaSeconds)
print("覆盖蓝图的Tick事件.")
end
function Module:ReceiveEndPlay()
print("覆盖蓝图的EndPlay事件.")
end
function Module:ReceiveCustomEvent()
print("覆盖蓝图的CustomEvent事件.")
end
return Module
关联蓝图
运行结果
- BeginPlay、Tick、EndPlay方法都被覆盖。
- CustomEvent没有被覆盖。