¾ð¸®¾ó¿¡¼ »ç¿ë ÇÒ¼ö ÀÖ´Â ·ç¾Æ°¡ ¸î°¡Áö ÀÖÁö¸¸ ÅÙ¼¾Æ®ÀÇ unluaÀÇ »ç¿ë¹ý¿¡ ´ëÇؼ ¾Ë¾Æ º¸°Ú´Ù.
Áö±ÝÀº 4.26x±îÁö Áö¿øÇÏ°í ÀÖ´Ù. ¿©±â¿¡ ¼³¸í ÇÑ °ÍÀº ·ç¾Æ¿¡ Àͼ÷ ÇÏÁö ¾Ê±â ¶§¹®¿¡ Ʋ¸±¼öµµ ÀÖ´Ù.
UnLua¸¦ ¼³Ä¡
UnLua¸¦ ¼³Ä¡ ÇÏ´Â°Í ºÎÅÍ ¾Ë¾Æ º¸ÀÚ.
1. ´Ù¿î·Îµå
https://github.com/Tencent/UnLua
2. ´Ù¿î·Îµå ¹ÞÀº ÈÄ Plugins Æú´õ¸¦ º¹»ç ÇÑ´Ù.
3. Ž»ö±â¿¡¼ ÇÁ·ÎÁ§Æ® ÆÄÀÏ À§¿¡¼ "Generate Visual Studio project files"À» ½ÇÇà ÇÑ´Ù.
ºñÁê¾ó ½ºÆ©µð¿À ¼Ö·ç¼Ç Æ®¸®¿¡¼ "unlua" Æú´õ°¡ º¸ÀÌ´ÂÁö È®ÀÎ ÇÑ´Ù.
ºí·çÇÁ¸°Æ® ½ºÅÂƽ ¹ÙÀεù
ºí·ç ÇÁ¸°Æ®¿¡¼ °ÔÀÓ¸ðµå¸¦ ¸¸µç´Ù.
»ý¼ºµÈ ºí·ç ÇÁ¸°Æ®¸¦ ¿¾î º¸ÀÚ.
Ŭ·¡½º ¼¼ÆÃÀ» Ŭ¸¯ÇÑ´Ù.
±¸ÇöµÈ ÀÎÅÍÆäÀ̽º¿¡ UnLuaInterface¸¦ Ãß°¡ÇÑ´Ù.
Åø¹Ù¿¡¼ "Lua Template" ¹öÆ°À» Ŭ¸¯ÇÑ´Ù.
°á°ú)
"Content/Script" Æú´õ ¾Æ·¡¿¡ °ÔÀÓ¸ðµå¿Í °°Àº Æú´õ ±¸Á¶¿Í °°Àº ÆÄÀÏ À̸§ÀÌ »ý¼º µÈ´Ù.
BP_MYGAME.uasset ºí·çÇÁ¸°Æ®ÀÇ ÅÛÇ÷¹ÀÌÆ®¸¦ »ý¼º Çϸé BP_MYGAME_C.lua ÆÄÀÏÀÌ ¸¸µé¾îÁø´Ù.
BP_MYGAME_C.lua ÆÄÀÏ
require "UnLua"
local BP_MYGAME_C = Class()
--function BP_MYGAME_C:Initialize(Initializer)
--end
--function BP_MYGAME_C:UserConstructionScript()
--end
--function BP_MYGAME_C:ReceiveBeginPlay()
--end
--function BP_MYGAME_C:ReceiveEndPlay()
--end
-- function BP_MYGAME_C:ReceiveTick(DeltaSeconds)
-- end
--function BP_MYGAME_C:ReceiveAnyDamage(Damage, DamageType, InstigatedBy, DamageCauser)
--end
--function BP_MYGAME_C:ReceiveActorBeginOverlap(OtherActor)
--end
--function BP_MYGAME_C:ReceiveActorEndOverlap(OtherActor)
--end
return BP_MYGAME_C
C++ ½ºÅÃƽ ¹ÙÀεù
C++ ÆÄÀÏÀ» ½ºÅÃƽ ¹ÙÀεù Çϴ¹ý¿¡ ´ëÇؼ ¾Ë¾Æ º¸ÀÚ.
build.cs¿¡ ¸ðµâÀ» Ãß°¡ ÇÑ´Ù.
¾ð¸®¾ó build.cs ÆÄÀÏ¿¡ "UnLua", "Lua"¸¦ Ãß°¡ ÇÑ´Ù.
----> "Lua"¸¦ Ãß°¡ÇÏÁö ¾ÊÀ¸¸é "UnLua.h" Æ÷ÇÔ ÇÒ¶§ "lua.hpp" ÆÄÀÏÀ» ãÀ»¼ö ¾ø´Ù´Â ¿¡·¯°¡ ¶á´Ù.
Ŭ·¡½º¿¡ Çì´õ ÆÄÀÏÀ» Ãß°¡ÇÑ´Ù.
#include "UnLuaInterface.h"
Ŭ·¡½º´Â IUnLuaInterface¸¦ »ó¼ÓÇÑ´Ù.
#include "CoreMinimal.h"
#include "GameFramework/GameModeBase.h"
#include "UnLuaInterface.h"
#include "luatestGameModeBase.generated.h"
UCLASS()
class LUATEST_API AluatestGameModeBase : public AGameModeBase, public IUnLuaInterface
·Îµù ÇÒ ¸ðµâ(·ç¾Æ ÆÄÀÏ)À» GetModuleName_Implementation ¸Þ¼Òµå¿¡¼ ÁöÁ¤ ÇÑ´Ù.
class LUATEST_API AluatestGameModeBase : public AGameModeBase, public IUnLuaInterface
{
......
public:
virtual FString GetModuleName_Implementation() const override
{
return TEXT("MyLuaGameMode");
}
};
C++ ½ºÅÂƽ ¹ÙÀεù Àû¿ë
°ÔÀÓ¸ðµå¿¡ IUnLuaInterface¸¦ Ãß°¡ ÇÏ¿´´Ù.
MyLuaGameMode.lua ¸ðµâÀ» ·Îµù ÇÏ°í ÀÖ´Ù.
luatestGameModeBase.h ÆÄÀÏ
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/GameModeBase.h"
#include "UnLuaInterface.h"
#include "luatestGameModeBase.generated.h"
UCLASS()
class LUATEST_API AluatestGameModeBase : public AGameModeBase, public IUnLuaInterface
{
GENERATED_BODY()
public:
virtual void BeginPlay() override;
UFUNCTION()
void RunLuaFunction();
UFUNCTION()
void RunFromLuaClass();
public:
virtual FString GetModuleName_Implementation() const override
{
UE_LOG(LogTemp, Log, TEXT("UnLua GetModuleName_Implementation "));
return TEXT("MyLuaGameMode");
}
private:
UPROPERTY()
int mIndex = 7;
};
UFUNCTION, UPROPERTY¸¦ ÁöÁ¤ÇØ¾ß ÇÔ¼ö³ª º¯¼ö¸¦ ·ç¾Æ·Î ÀͽºÆ÷Æ® ÇÒ¼ö ÀÖ´Ù.
MyLuaGameMode.lua ÆÄÀÏ
require "UnLua"
print("----------------- MyLuaGameMode.Lua --------!!!!" )
--C++¿¡¼ CallTableFunc ¸í·É¾î¸¦ È£Ãâ ÇÒ¶§ »ç¿ëÇϱâ À§ÇØ Àü¿ªÀ¸·Î ¼±¾ðÇÑ´Ù.
MyLuaGameMode = Class()
--local MyLuaGameMode = Class()
function MyLuaGameMode:UserConstructionScript()
print("UnLua MyLuaGameMode ConstructionScript !!!!" )
end
--ºí·ç ÇÁ¸°Æ® ÇÔ¼ö È£Ãâ
function MyLuaGameMode:ReceiveBeginPlay()
--Lua¿¡¼ C++ ¸â¹ö¸¦ °¡Á® ¿Ã¼öµµ ÀÖ´Ù.
print(self.mIndex)
self.mIndex = 99
print("UnLua MyLuaGameMode BeginPlay !!!!" )
UE4.UKismetSystemLibrary.PrintString(self,"MyLuaGameMode:ReceiveBeginPlay")
--Lua¿¡¼ C++ Ŭ·¡½º ¸Þ¼Òµå¸¦ È£ÃâÇÑ´Ù.
self.RunFromLuaClass(self);
--Lua¿¡¼ ·ç¾Æ Ŭ·¡½º ¸Þ¼Òµå¸¦ È£ÃâÇÑ´Ù.
self.DisplayTest();
end
function MyLuaGameMode:DisplayTest()
print("MyLuaGameMode:DisplayTest !!!!" )
end
--CPP¿¡¼ ·ç¾Æ¸¦ È£Ãâ ÇÏ´Â ÇÔ¼ö
function MyLuaGameMode:RunFromCPPNative()
print("in Lua - MyLuaGameMode:RunFromCPPNative" )
end
return MyLuaGameMode
util.lua ÆÄÀÏ
require "UnLua"
function LuaTest()
print("********************LuaTest function !!!!" )
end
¾Æ·¡ ¸í·É¾î·Î ¸ðµâ ·ÎµùÀ» Çϸé Á¦ÀÏ ¸ÕÀú ½ÇÇà µÇ´ÂÁö È®ÀÎÀ» À§ÇØ Ãß°¡ ÇÏ¿´´Ù.
print ·ç¾Æ ¸í·ÉÀ» ½ÇÇàÇÏ¸é ¾ð¸®¾ð ¿¡µðÅÍ Ãâ·Â ·Î±×¿¡ Ãâ·Â µÈ´Ù.
print("----------------- MyLuaGameMode.Lua --------!!!!" )
C++¿¡¼ CallTableFunc ¸í·É¾î¸¦ È£Ãâ ÇÒ¶§ »ç¿ëÇϱâ À§ÇØ Àü¿ªÀ¸·Î ¼±¾ðÇÑ´Ù.
unlua ¿¹Á¦¿¡¼´Â local µÇ¾î Àִµ¥ Àü¿ªÀ¸·Î ¹Ù²Û´Ù.
MyLuaGameMode = Class()
--local MyLuaGameMode = Class()
ReceiveBeginPlay´Â C++, BluePrint BeginPlay¿¡ ´ëÀÀ µÇ´Â ·ç¾Æ ¸í·É¾îÀÌ´Ù.
C++¿¡¼ BeginPlay¿Í °°ÀÌ »ç¿ëÇÒ¶§´Â ¼ø¼°¡ ¾î¶»°Ô µÇ´ÂÁö È®ÀÎÀÌ ÇÊ¿ä ÇÏ´Ù.
function MyLuaGameMode:ReceiveBeginPlay()
¾ð¸®¾óÀÇ PrintString ¸í·Éµµ È£Ãâ ÇÒ¼ö ÀÖ´Ù.
UE4.UKismetSystemLibrary.PrintString(self,"MyLuaGameMode:ReceiveBeginPlay")
·ç¾Æ¿¡¼ C++ÀÇ ¸Þ¼Òµå¸¦ È£Ãâ ÇÒ¶§´Â ÇÔ¼ö À̸§¿¡ "self"¸¦ Àû¾î ÁØ´Ù.
·ç¾Æ Ŭ·¡½º¿¡°Ô C++ Ŭ·¡½º´Â super Ŭ·¡½º°¡ µÇ±â ¶§¹®¿¡ "self"¸¦ ³Ñ°Ü ÁØ´Ù.
self.RunFromLuaClass(self);
·ç¾Æ Ŭ·¡½º¿¡¼ ·ç¸¶ ¸Þ¼Òµå¸¦ È£Ãâ ÇÏ´Â ¿¹ÀÌ´Ù.
self.DisplayTest();
C++¿¡¼ ·ç¾Æ¸¦ È£Ãâ ÇÒ¼ö ÀÖ´ÂÁö È®ÀÎ Çϱâ À§ÇØ Ãß°¡ÇÑ ÇÔ¼öÀÌ´Ù.
function MyLuaGameMode:RunFromCPPNative()
print("in Lua - MyLuaGameMode:RunFromCPPNative" )
end
luatestGameModeBase.cpp
#include "luatestGameModeBase.h"
#include "UnLua.h"
void AluatestGameModeBase::RunFromLuaClass()
{
UE_LOG(LogTemp, Warning, TEXT("C++ UnLua RunFromLuaClass"));
}
void AluatestGameModeBase::RunLuaFunction()
{
UE_LOG(LogTemp, Warning, TEXT("C++ UnLua RunLuaFunction"));
#if 0
//·ç¾Æ ÇÔ¼ö È£Ãâ
lua_State* L = UnLua::GetState();
UnLua::RunFile(L, "util.lua");
UnLua::Call(L, "LuaTest");
#else
//·ç¾Æ ¸Þ¼Òµå È£Ãâ
lua_State* L = UnLua::GetState();
//"MyLuaGameMode"À» Àü¿ª º¯¼ö·Î ¼±¾ð Ç߱⠶§¹®¿¡ º°µµ·Î ·Îµù ÇÏÁö ¾Ê¾Æµµ ½ÇÇà µÇ´Â°Í È®ÀÎ
//UnLua::RunFile(L, "MyLuaGameMode.lua");
UnLua::CallTableFunc(L, "MyLuaGameMode", "RunFromCPPNative");
#endif
}
void AluatestGameModeBase::BeginPlay()
{ mIndex = 78;
UE_LOG(LogTemp, Warning, TEXT("C++ before ReceiveBeginPlay UnLua mIndex = %d"), mIndex);
UE_LOG(LogTemp, Warning, TEXT("C++ UnLua BeginPlay"));
Super::BeginPlay();
UE_LOG(LogTemp, Warning, TEXT("C++ after ReceiveBeginPlay UnLua mIndex = %d"), mIndex);
RunLuaFunction();
}
·ç¾Æ¿¡¼ Ŭ·¡½º ¸Þ¼Òµå°¡ ºÒ·Á Áö´ÂÁö È®ÀÎÇϱâ À§ÇØ Ãß°¡ÇÑ ¸Þ¼ÒµåÀÌ´Ù.
AluatestGameModeBase::RunFromLuaClass()
AluatestGameModeBase::RunLuaFunction() ÇÔ¼ö¿¡¼ ·ç¾Æ ÇÔ¼ö¿Í ·ç¾Æ Ŭ·¡½ºÀÇ ¸Þ¼Òµå¸¦ È£Ãâ ÇÏ°í ÀÖ´Ù.
·ç¾Æ ÇÔ¼ö¸¦ È£Ãâ ÇÏ´Â ¿¹ÀÌ´Ù.
lua_State* L = UnLua::GetState();
UnLua::RunFile(L, "util.lua");
UnLua::Call(L, "LuaTest");
·ç¾Æ ¸Þ¼Òµå¸¦ È£ÃâÇÏ´Â ¿¹ÀÌ´Ù.
·ç¾Æ¿¡¼ MyLuaGameMode¸¦ Àü¿ªÀ¸·Î ¼±¾ð ÇÏ¿© RunFile¸¦ º°µµ·Î ÇÒ ÇÊ¿ä°¡ ¾ø´Ù.
lua_State* L = UnLua::GetState();
//"MyLuaGameMode"À» Àü¿ª º¯¼ö·Î ¼±¾ð Ç߱⠶§¹®¿¡ º°µµ·Î ·Îµù ÇÏÁö ¾Ê¾Æµµ ½ÇÇà µÇ´Â°Í È®ÀÎ
//UnLua::RunFile(L, "MyLuaGameMode.lua");
UnLua::CallTableFunc(L, "MyLuaGameMode", "RunFromCPPNative");
C++ BeginPlayÀÌ´Ù.
·ç¾ÆÀÇ ReceiveBeginPlay´Â ºí·çÇÁ¸°Æ®ÀÇ ReceiveBeginPlay¸¦ ÀÌ¿ëÇÏ°í ÀÖ´Ù.
ºí·çÇÁ¸°Æ®ÀÇ BeginPlay´Â ½ÇÁ¦ ³»ºÎ ÄÚµå´Â ReceiveBeginPlay ÇÔ¼öÀÌ´Ù.
ReceiveBeginPlay, BeginPlay ½ÇÇà ¼ø¼´Â ´ÙÀ½°ú °°´Ù.
void AluatestGameModeBase::BeginPlay()
{
//·ç¾Æ ÄÚµå ½ÇÇàÀü Super::BeginPlay(); //·ç¾Æ ReceiveBeginPlay ½ÇÇà
//·ç¾Æ ÄÚµå ½ÇÇà ÈÄ
}
C++ º¯¼ö¸¦ ·ç¾Æ¿Í ¿¬°á
ÀÌ ºÎºÐÀº ÀÚÁÖ »ç¿ë µÇ±â ¶§¹®¿¡ ´Ù½Ã ¼³¸íÇÑ´Ù.
C++ ¸â¹ö·Î º¯¼ö ¼±¾ð
Á¢±Ù ÁöÁ¤ÀÚ´Â »ó°ü¾ø°í UPROPERTY¸¦ ÁöÁ¤ÇØ¾ß ·ç¾Æ·Î ¸â¹ö¸¦ ÀͽºÆ÷Æ® ÇÒ¼ö ÀÖ´Ù.
UPROPERTY()
int mIndex = 7;
·ç¾Æ¿¡¼ º¯¼ö »ç¿ë
self¸¦ ÀÌ¿ëÇؼ »ç¿ë ÇÒ¼ö ÀÖ´Ù.
self.mIndex = 99
´Ù¿î·Îµå:
luatest.Build.cs
luatestGameModeBase.h
luatestGameModeBase.cpp
MyLuaGameMode.lua
util.lua
ÂüÁ¶)
·ç¾Æ¿¡¼ C++ PrintString È£Ãâ
https://www.programmersought.com/article/25326264507/
C++¿¡¼ ·ç¾Æ È£Ãâ
https://github.com/Tencent/UnLua/issues/60
UNLUA ¸ÞÀÎ ¼³¸í ÆäÀÌÁö
https://www.zhihu.com/topic/21248591/hot
HelloWorldUMG
https://zhuanlan.zhihu.com/p/330790611
Unlua ¼Ò½º ÄÚµå ºÐ¼® ¹× ¸Þ¸ð¸® °ü¸®
https://zhuanlan.zhihu.com/p/186209883
Unlua Àü¹ÝÀûÀÎ ¼³¸í
https://blog.csdn.net/weixin_34803466/article/details/112494155
UnLua ºÐ¼® (1) °´Ã¼ ¹ÙÀεù ·ç¾Æ
https://zhuanlan.zhihu.com/p/100058725
UnLua´Â UE È£Ãâ lua¿Í ÇÔ²² UE Á¤Àû ³»º¸³»±â 2
|