国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【程序員必備】UE4 C++ 虛幻引擎:詳解JSON文件讀、寫、解析,打造高效開發(fā)!

這篇具有很好參考價(jià)值的文章主要介紹了【程序員必備】UE4 C++ 虛幻引擎:詳解JSON文件讀、寫、解析,打造高效開發(fā)!。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。


ue json,UE,ue4,ue5,c++,json
  • ???♂? 作者:海碼007
  • ?? 專欄:UE虛幻引擎專欄
  • ?? 標(biāo)題:【程序員必備】UE4 C++ 虛幻引擎:詳解JSON文件讀、寫、解析,打造高效開發(fā)!
  • ?? 寄語:人生的意義或許可以發(fā)揮自己全部的潛力,所以加油吧!
  • ?? 最后:文章作者技術(shù)和水平有限,如果文中出現(xiàn)錯(cuò)誤,希望大家能指正

0 應(yīng)用場(chǎng)景

在游戲開發(fā)中,Json 文件常被用來保存游戲數(shù)據(jù)或配置參數(shù),如把游戲?qū)ο蟮膬?nèi)部狀態(tài)存儲(chǔ)到磁盤文件,即序列化游戲?qū)ο蟮臅r(shí)候,或在文件中配置一些游戲相關(guān)的參數(shù)時(shí)。本文將詳細(xì)講解如何在 UE 中讀取與解析 Json 文件。

1 功能前瞻

創(chuàng)建一個(gè) JSONFileReadWrite 類,兩個(gè)成員函數(shù) ReadJSONFileByFN、WriteJSONFile。功能分別是讀取一個(gè) JSON 格式的文件,并可以解析其中數(shù)據(jù);另一個(gè)功能是寫入一個(gè) JSON 文件。

1.1JSON格式介紹

    {
        "Game": "LOL",
        "Year": 2023,
        "Judge": 
        {
			"name": "Uzi",
			"age": 26, 	
        }, 
        "Player": [
            {
                "name": "xiaoming",
                "levels": 22
            },
            {
                "name": "xiaohu",
                "levels": 23
            }
        ]
    }

普通類型的值:Json數(shù)據(jù)格式就是一種嵌套的關(guān)系,花括號(hào)里面其實(shí)就是保存了一個(gè)個(gè)鍵值對(duì)(學(xué)過C++map容器應(yīng)該很好理解)例如,Game和Year就是Key鍵,“LOL”、2023就是對(duì)應(yīng)的值,只不過一個(gè)是字符串類型,一個(gè)是整數(shù)類型。

 "Game": "LOL",
 "Year": 2023,

Json對(duì)象類型的值:當(dāng)然也可以是一個(gè)Json對(duì)象類型,如下Judge的值就是一個(gè)花括號(hào)包裹住的類型,也就是一個(gè)Json對(duì)象。

"Judge": 
{
    "name": "Uzi",
	"age": 26, 	
}, 

數(shù)組類型的值:如下所示,Player的值是由 [ ] 包圍住,其中數(shù)組是Json對(duì)象類型

"Player": [
    {
        "name": "xiaoming",
        "levels": 22
    },
    {
        "name": "xiaohu",
        "levels": 23
    }
]

2 功能實(shí)現(xiàn)

在了解Json數(shù)據(jù)的基本格式后,就可以對(duì)其進(jìn)行讀寫操作。

2.1 準(zhǔn)備工作

創(chuàng)建一個(gè)UE C++工程,并新建一個(gè)JSONFileReadWrite類繼承UObject類,創(chuàng)建兩個(gè)函數(shù),并且讓這個(gè)C++類和成員函數(shù)可以被藍(lán)圖調(diào)用(加入說明符即可)。

// 類是使用BlueprintType將其暴露給藍(lán)圖使用
UCLASS(BlueprintType)
class CPP_API UJSONFileReadWrite : public UObject
{
	GENERATED_BODY()
	
public:

	// 函數(shù)是使用BlueprintCallable將其暴露給藍(lán)圖使用
	UFUNCTION(BlueprintCallable)
	void ReadJSONFileByFN();

	UFUNCTION(BlueprintCallable)
	void WriteJSONFile();
};

2.2 注意事項(xiàng)

使用UE的Json功能時(shí),需要在build.cs文件中添加Json模塊依賴,不然編譯不通過。

PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "InputCore", "Json" });

2.3 具體功能實(shí)現(xiàn)

2.3.1 ReadJSONFileByFN函數(shù)實(shí)現(xiàn)

大致思路

  1. 讀取磁盤中的 JSON 文件,使用 FFileHelper::LoadFileToString 函數(shù)將文件內(nèi)容讀取到FString類型的變量中;
  2. 將 FString 變量存儲(chǔ)到一個(gè) FJsonObject 變量中;
  3. 讀取FJsonObject 對(duì)象中的數(shù)據(jù);

【提示】使用文件選擇對(duì)話框需要下面兩個(gè)頭文件

#include "Developer/DesktopPlatform/Public/IDesktopPlatform.h"
#include "Developer/DesktopPlatform/Public/DesktopPlatformModule.h"
#include "Developer/DesktopPlatform/Public/IDesktopPlatform.h"
#include "Developer/DesktopPlatform/Public/DesktopPlatformModule.h"

void UJSONFileReadWrite::ReadJSONFileByFN()
{
	//-----------------------------------------------------------------------------------------------------------------
	//1.1 選擇磁盤中的Json文件,并獲取Json文件絕對(duì)路徑
	TArray<FString>		JsonFilePaths;																//保存文件的絕對(duì)路徑
	FString				ExtensionStr	= TEXT("*.*");												//文件類型
	const FString		ProjectDirPath	= FPaths::ConvertRelativePathToFull(FPaths::ProjectDir());	//獲取工程目錄的絕對(duì)路徑
	IDesktopPlatform*	DesktopPlatform = FDesktopPlatformModule::Get();
	DesktopPlatform->OpenFileDialog(nullptr, TEXT("文件"), FPaths::ConvertRelativePathToFull(FPaths::ProjectDir()), TEXT(""), *ExtensionStr, EFileDialogFlags::None, JsonFilePaths);

	//判斷文件是否存在
	if ( !FPlatformFileManager::Get().GetPlatformFile().FileExists(*JsonFilePaths[0]) )
	{
		UE_LOG( LogTemp, Warning, TEXT("%s not exist"), *JsonFilePaths[0] );
		return;
	}

	//1.2 根據(jù)文件路徑讀取文件內(nèi)存,保存到FString變量中
	FString JsonStr;
	FFileHelper::LoadFileToString(JsonStr, *(JsonFilePaths[0]));
	//-----------------------------------------------------------------------------------------------------------------


	//-----------------------------------------------------------------------------------------------------------------
	//2.將 JsonStr 變量存儲(chǔ)到一個(gè) FJsonObject 變量中
	TSharedRef<TJsonReader<>>	JsonReader = TJsonReaderFactory<TCHAR>::Create(JsonStr);	//創(chuàng)建一個(gè)Json 閱讀器
	TSharedPtr<FJsonObject>		JsonObject;													//創(chuàng)建一個(gè)Json對(duì)象
	FJsonSerializer::Deserialize(JsonReader, JsonObject);									//反序列化,將JsonReader里面的數(shù)據(jù),傳到JsonObject中

	//-----------------------------------------------------------------------------------------------------------------
	//3.讀取Json對(duì)象中的數(shù)據(jù)(例如,讀取Game對(duì)應(yīng)的數(shù)據(jù)值)
	FString sGameValue = JsonObject->GetStringField("Game");
	UE_LOG(LogTemp, Warning, TEXT("Game Value: %s"), *sGameValue);

	return;
}

藍(lán)圖中驗(yàn)證功能

  • 在關(guān)卡藍(lán)圖中寫如下代碼ue json,UE,ue4,ue5,c++,json
  • 日志文件輸出結(jié)果如圖:結(jié)果正確打印出來。
    ue json,UE,ue4,ue5,c++,json

2.3.2 WriteJSONFile函數(shù)實(shí)現(xiàn)

大致思路

  1. 準(zhǔn)備工作:新建一個(gè)結(jié)構(gòu)體用于存放數(shù)據(jù)
  2. 開始寫入:單個(gè)數(shù)據(jù)寫入、數(shù)組數(shù)據(jù)寫入
  3. 驗(yàn)證結(jié)果:打印出存儲(chǔ)Json內(nèi)容的字符串
// 存放數(shù)據(jù)的結(jié)構(gòu)體
struct Info {
	FString name;
	int32 health;
};

void UJSONFileReadWrite::WriteJSONFile()
{
	//-----------------------------------------------------------------------------------------------------------------
	//1. 準(zhǔn)備階段
	//1.1 聲明存儲(chǔ)寫入的Json內(nèi)容的字符串
	FString JsonStr;
	//1.2創(chuàng)建一個(gè)Json編寫器
	TSharedRef<TJsonWriter<TCHAR, TCondensedJsonPrintPolicy<TCHAR>>> JsonWriter = TJsonWriterFactory<TCHAR, TCondensedJsonPrintPolicy<TCHAR>>::Create(&JsonStr);
	
	//-----------------------------------------------------------------------------------------------------------------
	//2. 寫入單個(gè)數(shù)據(jù)
	JsonWriter->WriteObjectStart();							//開始 一個(gè)Json對(duì)象的寫入(一個(gè)Json對(duì)象對(duì)應(yīng)一個(gè){}中的內(nèi)容)
	JsonWriter->WriteValue(TEXT("Time"), TEXT("1998"));		//寫入 一個(gè)鍵值對(duì)("Time" : "1998")
	JsonWriter->WriteValue(TEXT("age"), TEXT("27"));		//寫入 一個(gè)鍵值對(duì)("age" : "27")
	JsonWriter->WriteObjectEnd();							//結(jié)束 一個(gè)Json對(duì)象的寫入

	//2.1 寫入數(shù)組數(shù)據(jù)
	TArray<Info> Players;									//存放數(shù)組數(shù)據(jù)的變量
	struct Info info;
	info.name = TEXT("player1");	info.health = 30;	Players.Add(info);
	info.name = TEXT("player2");	info.health = 200;	Players.Add(info);
	info.name = TEXT("player3");	info.health = 999;	Players.Add(info);

	//JsonWriter->WriteArrayStart(L"players");		???為什么調(diào)用WriteArrayStart函數(shù)帶參數(shù)就會(huì)報(bào)錯(cuò):數(shù)組越界
	JsonWriter->WriteArrayStart();
	for (Info player : Players)
	{
		JsonWriter->WriteObjectStart();
		JsonWriter->WriteValue(L"name", player.name);
		JsonWriter->WriteValue(L"health", player.health);
		JsonWriter->WriteObjectEnd();
	}
	JsonWriter->WriteArrayEnd();

	//-----------------------------------------------------------------------------------------------------------------
	//3. 停止寫入操作
	JsonWriter->Close();
	//4. 打印結(jié)果
	UE_LOG(LogTemp, Warning, TEXT("JsonStr Value: %s"), *JsonStr);

	return;
}

LOG輸出結(jié)果:
ue json,UE,ue4,ue5,c++,json

2.3.3 疑惑

為什么調(diào)用WriteArrayStart函數(shù)時(shí)帶參數(shù)就會(huì)報(bào)錯(cuò):數(shù)組越界。我看別的博主都是帶參數(shù)調(diào)用都沒有問題。異常內(nèi)容如下,望各位大佬指點(diǎn)。
ue json,UE,ue4,ue5,c++,json文章來源地址http://www.zghlxwxcb.cn/news/detail-771004.html

到了這里,關(guān)于【程序員必備】UE4 C++ 虛幻引擎:詳解JSON文件讀、寫、解析,打造高效開發(fā)!的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【虛幻引擎】UE4/UE5 pak掛載

    【虛幻引擎】UE4/UE5 pak掛載

    ?找到:D:UEUE_4.27EngineBinariesWin64, ?WindowS+R打開CMD命令 運(yùn)行UnrealPak,運(yùn)行結(jié)果如下 ? ? ?注意如果想要加載Pak內(nèi)資源,那么這些資源必須是經(jīng)過Cook的。如果打包的是未Cook的資源,那么即使Pak掛載成功,也不可能會(huì)成功加載Pak內(nèi)資源。 ?Cook好之后,存儲(chǔ)的路徑在你的I:DBJ

    2024年02月10日
    瀏覽(109)
  • 【虛幻引擎】UE4 Spline(樣條線)

    【虛幻引擎】UE4 Spline(樣條線)

    ? ? ? ?樣條線Spline在UE中是一個(gè)很好用的工具,能夠設(shè)置物體的跟隨移動(dòng),也能夠設(shè)置物體的批量復(fù)制,還能夠設(shè)置一個(gè)特殊的模型形狀比如圓管,還可以設(shè)置特殊的粒子特效,做地形設(shè)計(jì)等等,只要你想要實(shí)現(xiàn)的效果,spline都可以實(shí)現(xiàn)。官方也提供了很多的案例,可以參考

    2023年04月10日
    瀏覽(91)
  • 【虛幻引擎UE】UE4/UE5 新人科普向

    【虛幻引擎UE】UE4/UE5 新人科普向

    Unreal Engine是當(dāng)前最為流行的游戲引擎之一,具有豐富的游戲開發(fā)功能和強(qiáng)大的游戲引擎渲染能力。 UE5官方文檔:UE5官方文檔非常詳細(xì),介紹了UE5的各個(gè)功能和應(yīng)用,適合入門學(xué)習(xí)和深入探究。鏈接:https://docs.unrealengine.com/5.1/zh-CN/ UE5中文社區(qū):該社區(qū)聚集了大量的UE5開發(fā)者,

    2024年02月09日
    瀏覽(119)
  • 【虛幻引擎】UE4 FTabmanager實(shí)現(xiàn)多窗口

    【虛幻引擎】UE4 FTabmanager實(shí)現(xiàn)多窗口

    我們先看源碼的實(shí)現(xiàn)方式:FTabmanager類實(shí)現(xiàn)了創(chuàng)建窗口的不同方法 NewLayout:創(chuàng)建新的布局方式 ?RegisterTabSpawner:注冊(cè)在模塊啟動(dòng)時(shí)的函數(shù),這個(gè)就是創(chuàng)建了一個(gè)窗口,窗口所放置的內(nèi)容 ?RestoreFrom:從窗口中顯示 調(diào)用獨(dú)立窗口需要在模塊啟動(dòng)的時(shí)候調(diào)用FGlobalTabmanager::Get()的Re

    2024年02月10日
    瀏覽(94)
  • C++學(xué)習(xí)day--11 程序員必備工具--github

    C++學(xué)習(xí)day--11 程序員必備工具--github

    github 的重要性: 網(wǎng)絡(luò)時(shí)代的程序員必備。 github 的作用: 1. 版本管理 2. 多人協(xié)作 3. 開源共享 常用方案: git+TortoiseGit+github [Tortoise ,程序員常稱其為小烏龜,小海龜 ] 安裝配置步驟 1. 注冊(cè) https://github.com/ 使用郵箱: (例如:1374784346@qq.com) 密碼需要至少包含一位小寫字母,至

    2024年02月05日
    瀏覽(24)
  • 【虛幻引擎】UE4/UE5科大訊飛文字合成語音

    【虛幻引擎】UE4/UE5科大訊飛文字合成語音

    B站視頻鏈接:https://space.bilibili.com/449549424?spm_id_from=333.1007.0.0 ? 第一步:首先進(jìn)入訊飛開放平臺(tái)注冊(cè)一個(gè)賬號(hào),然后創(chuàng)建一個(gè) 創(chuàng)建一個(gè)應(yīng)用,命名按照你自己的想法來,會(huì)產(chǎn)生一個(gè)APPID,具體參考UE4如何接入科大訊飛的語音識(shí)別_ue4 科大訊飛的語音識(shí)別_飛起的豬的博客-CSDN博

    2024年02月13日
    瀏覽(101)
  • 【虛幻引擎】UE4/UE5鼠標(biāo)點(diǎn)擊事件實(shí)現(xiàn)物體移動(dòng)

    【虛幻引擎】UE4/UE5鼠標(biāo)點(diǎn)擊事件實(shí)現(xiàn)物體移動(dòng)

    ?在UE4/UE5中,引擎有它自己的一套框架體系,虛幻就是基于這一個(gè)框架體系來實(shí)現(xiàn)的。其中就有PlayerController(玩家控制器),玩家控制器中就有對(duì)鼠標(biāo)的一系列設(shè)置,包括顯示鼠標(biāo),允許點(diǎn)擊事件等。 ?1.創(chuàng)建PlayerController,命名為MyPlayerController 2.打開MyPlayerController,勾選參數(shù)

    2024年02月10日
    瀏覽(317)
  • 【虛幻引擎】UE4 同步和異步資源加載(軟引用)

    【虛幻引擎】UE4 同步和異步資源加載(軟引用)

    虛幻引擎給我們提供了兩種引用,一個(gè)是硬引用。軟引用通常是僅儲(chǔ)存資源對(duì)象的資源路徑?jīng)]有與資源產(chǎn)生耦合關(guān)系的引用(軟引用加載到內(nèi)存中,引用對(duì)象不會(huì)被加載到內(nèi)存中,只有在需要的時(shí)候才會(huì)被加載進(jìn)內(nèi)存中)。硬引用則是擁有資源對(duì)象實(shí)際成員變量,直接與資源對(duì)

    2024年02月01日
    瀏覽(95)
  • 【虛幻引擎】UE4/UE5數(shù)字孿生與前端Web頁面匹配

    【虛幻引擎】UE4/UE5數(shù)字孿生與前端Web頁面匹配

    ? ? ? ? 數(shù)字孿生是一種多維動(dòng)態(tài)的數(shù)字映射,可大幅提高效能。數(shù)字孿生是充分利用物理模型、傳感器更新、運(yùn)行歷史等數(shù)據(jù),集成多學(xué)科、多物理量、多尺度、多概率的仿真過程,在虛擬空間中完成對(duì)現(xiàn)實(shí)體的復(fù)制和映射,從而反映物理實(shí)體的全生命周期過程。數(shù)字孿生

    2024年02月03日
    瀏覽(102)
  • 【虛幻引擎】UE4 動(dòng)畫藍(lán)圖,動(dòng)畫,狀態(tài)機(jī)三者之間的聯(lián)系

    【虛幻引擎】UE4 動(dòng)畫藍(lán)圖,動(dòng)畫,狀態(tài)機(jī)三者之間的聯(lián)系

    動(dòng)畫藍(lán)圖是將基礎(chǔ)動(dòng)作整到一起并且能夠使得動(dòng)作之間切換變得很自然的一個(gè)藍(lán)圖。 以第三人稱為例 ?動(dòng)畫:每一個(gè)基礎(chǔ)動(dòng)作都是一個(gè)動(dòng)畫資源,基礎(chǔ)動(dòng)作包括,站立,行走,跑步,蹲下,跳躍等 ?創(chuàng)建一個(gè)動(dòng)畫藍(lán)圖,需要有一套骨架才可以,對(duì)于一個(gè)有動(dòng)畫的人物,必須要

    2024年02月09日
    瀏覽(92)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包