@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 か月が経ちました。ただプロセスを記録しただけであり、詳しくはありません。質問があれば、連絡してください
。難しすぎてできないかもしれませんが、主にまとめています
。