unlua01

¾ð¸®¾ó¿¡¼­ »ç¿ë ÇÒ¼ö ÀÖ´Â ·ç¾Æ°¡ ¸î°¡Áö ÀÖÁö¸¸ ÅÙ¼¾Æ®ÀÇ 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