UE5 utiliza un script externo de Unlua

@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
Insertar descripción de la imagen aquí

Explique brevemente cómo usarlo.
Primero, debe iniciar el programa UE a depurar.
Haga clic en ejecutar y depurar
Insertar descripción de la imagen aquí
para seleccionar el primero
. Luego seleccione el proyecto a depurar
Insertar descripción de la imagen aquí
. Espere a que se cargue durante un período de tiempo antes de depurar.
Hooker listo indica que la carga está completa.
Insertar descripción de la imagen aquí

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é.
Insertar descripción de la imagen aquí
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
Insertar descripción de la imagen aquí

//函数为需要调用的外部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

Supongo que te gusta

Origin blog.csdn.net/qq_35410135/article/details/129525001
Recomendado
Clasificación