ABOUT ME

-

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

    이전 글 (LuaMachine : Lua call C++ function)을 통해 C++의 함수를 Lua에서 실행하는 방법을 살펴보았습니다.

    이번 글에서는 반대로 Lua의 함수를 C++에서 호출하는 방법을 살펴보도록 하겠습니다.

     


     

    1. Sample code

     

    더보기

    다음과 같은 Lua스크립트를 작성하도록 하겠습니다.

     

    myluascript.lua

    function add_and_print(val1, val2)
        print(val1 + val2)
    end

    위 함수는 2개의 인자 (val1, val2)를 더한 값읋 출력하는 함수입니다. 

     

    2. Call Lua function in C++ code

     

    더보기

    이전 글을 통해 LuaState라는 일종의 Virtual Machine에서 Lua스크립트를 실행하는 것을 살펴보았습니다.

    또한, 이전 글에서는 Lua스크립트를 읽어오는 LuaRunFile함수를 사용했습니다.

     

    이번 글에서 사용할 함수는 스크립트의 함수를 읽어오는 함수입니다.

     

    MyActor.cpp

    void AMyActor::BeginPlay() {
        auto readLua = 
            ULuaBlueprintFunctionLibrary::LuaRunFile(
                GetWorld(), 
                UMyLuaState::StaticClass(), 
                TEXT("myluascript.lua"), 
                false
            );
            
        TArray<FLuaValue> params;
        params.Add(FLuaValue(10));
        params.Add(FLuaValue(11));
        
        auto luaFunction = 
            ULuaBlueprintFunctionLibrary::LuaGlobalCall(
                GetWorld(),
                UMyLuaState::StaticClass(),
                TEXT("add_and_print"),
                params
            );
    }

    코드는 크게 스크립트를 읽어오는 LuaRunFile부분과, 함수를 읽어오는 LuaGlobalCall이 있습니다.

    LuaRunFile은 지정한 LuaState위에 스크립트 파일을 읽어오는 함수입니다.

    LuaGlobalCall은 지정한 LuaState위에 읽어온 스크립트 파일 중, 지정한 함수를 읽어오는 함수입니다.

     

    LuaGlobalCall은 FLuaValue를 반환하며, 이 값은 지정한 함수의 return값과 동일합니다.

    현재 예제에는 return값이 없지만, 있을 경우 luaFunction변수를 통해 접근이 가능합니다.

     

     

    3. LuaState

     

    더보기

    이전 글을 통해, LuaState는 일종의 Virtual Machine인 것을 알아보았습니다.

    이전 글에서는 언급할 필요가 없었던 추가적인 정보로, LuaState는 프로그램의 생명주기 동안 각 인스턴스가 일종의 싱글톤 객체로 활동합니다.

    따라서, 위 문단의 LuaRunFile과 LuaGlobalCall에 전달한 UMyLuaState::StaticClass()는 같은 인스턴스를 참조합니다.

    만약 다른 스크립트를 다른 LuaState로 이용할 경우, 해당 스크립트간의 독립성이 보장됩니다.

     

     

    3. 주의사항

     

    더보기

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

    • LuaRunFile과 LuaGlobalCall이 사용하는 LuaState가 동일해야 합니다.
    • 파라미터가 없는 함수일 경우, TArray<FLuaValue>()로 빈 배열을 전달할 수 있습니다.
    • 스크립트에 오류가 있을 경우 LuaRunFile과정에서 실패하여, LuaRunGlobal이 동작하지 않을 수 있습니다.

     


     

    감사합니다.

    댓글

Designed by Tistory.