UE5 は外部 Unlua スクリプトを使用します

@UE5 は外部 Unlua スクリプトを使用します

アンルアのダウンロード方法

git アドレスに多くのデモがありますので、チェックしてみてください。以下は、私が仕事で使用しているものの一部であり、C++ 関数の書き換えと外部スクリプトのロードです。
https://github.com/Tencent/UnLua

unlua スクリプトをデバッグする方法

vs codeのlua Boosterを使用しています
ここに画像の説明を挿入します

使い方を簡単に説明します。
まず、デバッグする ue プログラムを起動する必要があります。[
実行してデバッグ] をクリックして
ここに画像の説明を挿入します
最初のプログラムを選択
します。次に、デバッグするプロジェクトを選択します。デバッグする
ここに画像の説明を挿入します
前に、一定時間ロードを待ちます。 Hooker Ready は
読み込みが完了したことを示します。
ここに画像の説明を挿入します

unlua関数のロード方法

まず、C++ クラスの LuaLoader
.h ファイルを定義します。

#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);
};

.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;
    }
}

Lua の組み込みファイルの読み込みコードは公式デモにあり、上記 2 つのファイル コードは両方とも見つかります。

C++ 関数を書き直す方法

ブループリント リフレクションの方法が使用されます
。Unlua はパラメータ アドレスを渡してデータを送信する方法をサポートしておらず、
戻り値を通じてのみデータを取得できることに注意してください。次のコードでは、処理されたデータは TarStr を通じて取得できません。データは戻りデータを通じてのみ取得できます
(私がどうしてこれを知っている
ここに画像の説明を挿入します
かは聞かないでください。間違っているかもしれません。結局のところ、私はこの問題に遭遇したのは使用中にのみでした。他の人のことも知りません。
)

//Unlua Json脚本
	UFUNCTION(BlueprintImplementableEvent, BlueprintCallable)
		FString AnalysisLuaJson(const FString& OrcData, FString& TarStr);

Unlua スクリプトで C++ 関数を書き換える方法

unlua スクリプトのバインド方法に関する公式チュートリアルもあります。スティッキー バーで使用できます。詳細は説明しません。
同じ関数名と C++ で定義された受信パラメーターを使用して lua ファイルに新しい関数を作成し、上書きしましたC++ 関数。

function M:AnalysisLuaJson(OrcStr,TarStr)
    TarStr = AnylysisFunction.AnalysisJson(OrcStr)
    return TarStr
end

外部のluaファイルを呼び出す方法

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

外部 Lua スクリプトのコンテンツのスクリーンショット
ここに画像の説明を挿入します

//函数为需要调用的外部lua脚本中的函数
function M.AnalysisJson(OrcStr)

このコードをもう一度削除します

function M:AnalysisLuaJson(OrcStr,TarStr)
	//AnalysisJson为Analysis.lua中的函数
    TarStr = AnylysisFunction.AnalysisJson(OrcStr)
    return TarStr
end

完全な組み込み Lua スクリプト コード

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

Luaの外部スクリプトの利用が完了しました。
メインコースが提供されました。デザートはこちらです。Lua での JSON の読み取りと書き込み

lua で Json を読み書きする方法

コードを直接アップロードする

//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

ご質問がございましたら、お問い合わせください。

実は、この記事を書いてから、unlua スクリプトを使用してから約 2 か月が経ちました。ただプロセスを記録しただけであり、詳しくはありません。質問があれば、連絡してください
。難しすぎてできないかもしれませんが、主にまとめています

おすすめ

転載: blog.csdn.net/qq_35410135/article/details/129525001