@UE5 usa un script Unlua externo
como descargar unlua
Hay muchas demostraciones en la dirección de Git, puedes consultarlas. Lo siguiente es parte de lo que uso en mi trabajo, reescribiendo funciones de C ++ y cargando scripts externos.
https://github.com/Tencent/UnLua
Cómo depurar el script unlua
Estoy usando lua Booster de vs code
Explique brevemente cómo usarlo.
Primero, debe iniciar el programa UE a depurar.
Haga clic en ejecutar y depurar
para seleccionar el primero
. Luego seleccione el proyecto a depurar
. Espere a que se cargue durante un período de tiempo antes de depurar.
Hooker listo indica que la carga está completa.
Cómo cargar la función unlua
Primero defina el
archivo LuaLoader .h de la clase C++
#pragma once
#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "LuaFileLoader.generated.h"
UCLASS()
class UE_SIMTRAFFICFLOW_API ULuaFileLoader : public UBlueprintFunctionLibrary
{
GENERATED_BODY()
UFUNCTION(BlueprintCallable, meta = (DisplayName = "SetupCustomLoader", Category = "UnLua Tutorial"))
static void SetupCustomLoader(int Index);
};
archivo .cpp
#include "LuaFileLoader.h"
#include "Kismet/KismetSystemLibrary.h"
#include "Misc/FileHelper.h"
#include "UnLua.h"
bool CustomLoader1(UnLua::FLuaEnv& Env, const FString& RelativePath, TArray<uint8>& Data, FString& FullPath)
{
const auto SlashedRelativePath = RelativePath.Replace(TEXT("."), TEXT("/"));
FullPath = FString::Printf(TEXT("%s%s.lua"), *GLuaSrcFullPath, *SlashedRelativePath);
if (FFileHelper::LoadFileToArray(Data, *FullPath, FILEREAD_Silent))
return true;
FullPath.ReplaceInline(TEXT(".lua"), TEXT("/Index.lua"));
if (FFileHelper::LoadFileToArray(Data, *FullPath, FILEREAD_Silent))
return true;
return false;
}
bool CustomLoader2(UnLua::FLuaEnv& Env, const FString& RelativePath, TArray<uint8>& Data, FString& FullPath)
{
const auto SlashedRelativePath = RelativePath.Replace(TEXT("."), TEXT("/"));
const auto L = Env.GetMainState();
lua_getglobal(L, "package");
lua_getfield(L, -1, "path");
const char* Path = lua_tostring(L, -1);
lua_pop(L, 2);
if (!Path)
return false;
TArray<FString> Parts;
FString(Path).ParseIntoArray(Parts, TEXT(";"), false);
for (auto& Part : Parts)
{
Part.ReplaceInline(TEXT("?"), *SlashedRelativePath);
FPaths::CollapseRelativeDirectories(Part);
if (FPaths::IsRelative(Part))
FullPath = FPaths::ConvertRelativePathToFull(GLuaSrcFullPath, Part);
else
FullPath = Part;
if (FFileHelper::LoadFileToArray(Data, *FullPath, FILEREAD_Silent))
return true;
}
return false;
}
void ULuaFileLoader::SetupCustomLoader(int Index)
{
switch (Index)
{
case 0:
FUnLuaDelegates::CustomLoadLuaFile.Unbind();
break;
case 1:
FUnLuaDelegates::CustomLoadLuaFile.BindStatic(CustomLoader1);
break;
case 2:
FUnLuaDelegates::CustomLoadLuaFile.BindStatic(CustomLoader2);
break;
}
}
El código de carga de los archivos integrados de Lua se puede encontrar en la demostración oficial y se pueden encontrar los dos códigos de archivo anteriores.
Cómo reescribir una función de C++
Se utiliza el método de reflexión de planos
. Tenga en cuenta que Unlua no admite el método de pasar direcciones de parámetros para transmitir datos y solo puede
obtener datos a través del valor de retorno. En el siguiente código, los datos procesados no se pueden obtener a través de TarStr, y el Los datos solo se pueden obtener a través de los datos devueltos
(no me pregunten cómo lo sé.
Puede que esté mal. Después de todo, solo encontré este problema cuando lo estaba usando. Tampoco conozco a otras personas)
.
//Unlua Json脚本
UFUNCTION(BlueprintImplementableEvent, BlueprintCallable)
FString AnalysisLuaJson(const FString& OrcData, FString& TarStr);
Cómo reescribir funciones de C++ en el script Unlua
También hay tutoriales oficiales sobre cómo vincular scripts unlua. Puedes usarlo mediante la barra adhesiva. No entraré en detalles.
Creé una nueva función en el archivo lua con el mismo nombre de función y parámetros entrantes definidos en C++ para sobrescribir la función C++.
function M:AnalysisLuaJson(OrcStr,TarStr)
TarStr = AnylysisFunction.AnalysisJson(OrcStr)
return TarStr
end
Cómo llamar a un archivo lua externo
function M:ReceiveBeginPlay()
//设置lua文件路径
package.path = "D:/UnluaScript/?.lua"
//调用之前写的函数
UE.ULuaFileLoader.SetupCustomLoader(2)
--Screen.Print(string.format("FromCustomLoader2:%s", require("Analysis")))
//AnylysisFunction指向文件,Analysis给文件命名
AnylysisFunction=require("Analysis")
UE.ULuaFileLoader.SetupCustomLoader(0)
//下面这一行非常重要,是个大坑,一定要重写父项的beginplay
self.Overridden.ReceiveBeginPlay(self)
end
Captura de pantalla del contenido en un script Lua externo
//函数为需要调用的外部lua脚本中的函数
function M.AnalysisJson(OrcStr)
Elimina este código nuevamente
function M:AnalysisLuaJson(OrcStr,TarStr)
//AnalysisJson为Analysis.lua中的函数
TarStr = AnylysisFunction.AnalysisJson(OrcStr)
return TarStr
end
Código de script Lua integrado completo
local Screen = require "Screen"
local json = require("json")
local M = UnLua.Class()
function M:ReceiveBeginPlay()
package.path = "D:/UnluaScript/?.lua"
UE.ULuaFileLoader.SetupCustomLoader(2)
AnylysisFunction=require("Analysis")
UE.ULuaFileLoader.SetupCustomLoader(0)
self.Overridden.ReceiveBeginPlay(self)
end
function M:AnalysisLuaJson(OrcStr,TarStr)
TarStr = AnylysisFunction.AnalysisJson(OrcStr)
return TarStr
end
return M
Se ha completado el uso del script externo de Lua.
El plato principal ya está servido, aquí está el postre. Leyendo y escribiendo json en Lua
Cómo leer y escribir Json en lua
Sube el código directamente
//OrcStr为传入的json数据
function M.AnalysisJson(OrcStr)
local TarStr
//json decode
local DecodedStr = json.decode(OrcStr)
local AllData={
}
E1Data["pNum"]=DecodedStr.pNum
E1Data["PData"]={
}
if DecodedStr.pNum>0 then
for i, v in ipairs(DecodedStr.PData) do
local data= {
}
data["id"]=v.id
data["Name"]=v.Name
E1Data["PData"][i]=data
end
end
//json encode
TarStr=json.encode(AllData)
return TarStr
end
Eso es todo. Si tienes alguna pregunta, por favor contáctanos.
De hecho, han pasado casi dos meses desde que escribí este artículo desde que utilicé el script unlua. Sólo puedo decir que simplemente grabé el proceso y no es en profundidad. Si tienes alguna pregunta, puedes comunicarte. Si es
así Es demasiado difícil, es posible que no puedas hacerlo. Lo resumo principalmente. Uso
qq: 1264271710