-
[Unreal Engine] LuaMachine : Lua call C++ functionUnreal 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로 변환됩니다.
감사합니다.
'Unreal Engine 5._' 카테고리의 다른 글
[Unreal Engine] Solve : On mobile the SkyAtmosphere component needs a mesh with .... (1) 2023.09.06 [Unreal Engine] LuaMachine : C++ call Lua function (0) 2023.08.22 [Unreal Engine] Finding files (0) 2023.05.22 [Unreal Engine] LuaMachine : Install & Hello world (0) 2023.05.19 [Unreal Engine] C++ Code encoding (0) 2023.05.16