ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Unreal Engine] LuaMachine : Lua call C++ function
    Unreal Engine 5._ 2023. 8. 22. 13:39

    이전 글 (LuaMachine : Install & Hello world)에서 LuaMachine을 설치하고, 간단한 텍스트 출력을 하는 방법을 살펴보았습니다.

    이번 글에서는 Lua에서 C++의 함수를 실행하는 방법에 대하여 알아보도록 하겠습니다.

     


     

    1. Sample code

     

    더보기

    이전 글에서 만든 LuaState에 다음과 같은 코드를 추가하도록 하겠습니다.

     

    MyLuaState.h

    ...
    public:
        UMyLuaState();
        
        UFUNCTION()
        void AddAndPrint(FLuaValue Val1, FLuaValue Val2);
    ...

    MyLuaState.cpp

    UMyLuaState::UMyLuaState() {
        Table.Add(
            TEXT("AddAndPrint"), 
            FLuaValue::Function(
                GET_FUNCTION_NAME_CHECKED_TwoParams(
                    UMyLuaState, AddAndPrint, FLuaValue, FLuaValue
                )
            )
        );
    }
    
    UMyLuaState::AddAndPrint(FLuaValue Val1, FLuaValue Val2) {
        int32 result = Val1.ToInteger() + Val2.ToInteger();
        UE_LOG(LogTemp, Log, TEXT("%d"), result);
    }

    호출 할 예제 함수는 AddAndPrint입니다. 해당 함수는 정수 2개를 더한 값을 출력합니다.

     

    별도로, 이번 예제에서 살펴 본 함수의 파라미터는 2개 입니다. (Val1, Val2)

    생성자의 Table에 함수를 등록할 때 사용된 매크로는 파라미터의 갯수에 따라 다음과 같이 나뉘어 있습니다.

    GET_FUNCTION_NAME_CHECKED
    GET_FUNCTION_NAME_CHECKED_OneParam
    GET_FUNCTION_NAME_CHECKED_TwoParams
    GET_FUNCTION_NAME_CHECKED_ThreeParams
    GET_FUNCTION_NAME_CHECKED_FourParams

    파라미터가 이 이상일 경우, 다른 방법을 찾아야 합니다. (매크로 추가, 함수 변경 등)

     

    2. Call C++ function in Lua script

     

    더보기

    위 문단의 함수를 이용하는 Lua스크립트와, 해당 스크립트를 실행하는 C++코드는 다음과 같습니다.

     

    addandprint.lua

    AddAndPrint(1, 2)

     MyActor.cpp

    void AMyActor::BeginPlay() {
        auto readLua = 
            ULuaBlueprintFunctionLibrary::LuaRunFile(
                GetWorld(), 
                UMyLuaState::StaticClass(), 
                TEXT("addandprint.lua"), 
                false
            );
    }

     

    3. FLuaValue

     

    더보기

    AddAndPrint함수는 두 정수를 더하는 함수입니다.

    하지만 이 함수의 파라미터는 int가 아닌 FLuaValue라는 형식인 것을 볼 수 있습니다.

     

    이것은 LuaMachine의 자료형입니다.

    C++의 자료형과 LuaMachine의 자료형이 서로 동일하지 않기 때문에 호출되는 값을 Wrapping한 것 입니다.

    이번 예제 코드 외에도, C++에서 Lua에 값을 전달받을 때, 전달할 때에는 FLuaValue를 이용해야 합니다.

     

    Wrapping방법은 다음과 같습니다.

    C++ to Lua

    • FLuaValue의 생성자 이용 (bool, int, float, UObject, String 등)
    • ULuaBlueprintFunctionLibrary 이용 (CreateLua~~ 함수로 FLuaValue 생성)

    Lua to C++

    • FLuaValue의 변환 함수 이용 (ToBool, ToInteger, ToFloat, ToString 등)
    • ULuaBlueprintFunctionLibrary 이용 (Conv_LuaValueTo~~ 함수로 FLuaValue를 변환)

     

    4. 주의사항

     

    더보기

    Lua에서 C++의 함수를 호출할 때의 주의점은 다음과 같습니다.

    • 호출할 함수가 LuaState에 정의되어 있어야 합니다.
    • 정의된 함수가 LuaState의 Table에 추가되어야 합니다. (MyLuaState 생성자 참조)
    • 위 항목의 LuaState와 스크립트를 읽을 때 전달하는 LuaState가 같아야 합니다. (상속 관계는 가능합니다.)

     

    5. Lua Virtual Machine

     

    더보기

    LuaMachine에서 Lua스크립트를 읽는 방식은 LuaState라는 Virtual Machine에서 Lua스크립트를 실행하는 것과 유사합니다. (이 Virtual Machine은 프로젝트, 프로그램 내에 다수 존재할 수 있습니다.)

    본질적으로 Lua스크립트에서 함수를 호출하는 것은 Virtual Machine의 Table에 있는 값을 읽어오는 것 입니다.

    따라서 Table에 함수 외의 다른 값을 지정하는 것이 가능합니다.

    ...
    Table.Add(TEXT("MyValue"), FLuaValue(1004));
    ...

    위와 같은 코드가 있을 경우, Lua스크립트에서 MyValue 키워드는 정수 1004로 변환됩니다.

     


     

    감사합니다.

    댓글

Designed by Tistory.