【程序员必备】UE4 C++ 虚幻引擎:详解JSON文件读、写、解析,打造高效开发!

这篇具有很好参考价值的文章主要介绍了【程序员必备】UE4 C++ 虚幻引擎:详解JSON文件读、写、解析,打造高效开发!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


ue json,UE,ue4,ue5,c++,json
  • 🙋‍♂️ 作者:海码007
  • 📜 专栏:UE虚幻引擎专栏
  • 💥 标题:【程序员必备】UE4 C++ 虚幻引擎:详解JSON文件读、写、解析,打造高效开发!
  • ❣️ 寄语:人生的意义或许可以发挥自己全部的潜力,所以加油吧!
  • 🎈 最后:文章作者技术和水平有限,如果文中出现错误,希望大家能指正

0 应用场景

在游戏开发中,Json 文件常被用来保存游戏数据或配置参数,如把游戏对象的内部状态存储到磁盘文件,即序列化游戏对象的时候,或在文件中配置一些游戏相关的参数时。本文将详细讲解如何在 UE 中读取与解析 Json 文件。

1 功能前瞻

创建一个 JSONFileReadWrite 类,两个成员函数 ReadJSONFileByFN、WriteJSONFile。功能分别是读取一个 JSON 格式的文件,并可以解析其中数据;另一个功能是写入一个 JSON 文件。

1.1JSON格式介绍

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

普通类型的值:Json数据格式就是一种嵌套的关系,花括号里面其实就是保存了一个个键值对(学过C++map容器应该很好理解)例如,Game和Year就是Key键,“LOL”、2023就是对应的值,只不过一个是字符串类型,一个是整数类型。

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

Json对象类型的值:当然也可以是一个Json对象类型,如下Judge的值就是一个花括号包裹住的类型,也就是一个Json对象。

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

数组类型的值:如下所示,Player的值是由 [ ] 包围住,其中数组是Json对象类型

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

2 功能实现

在了解Json数据的基本格式后,就可以对其进行读写操作。

2.1 准备工作

创建一个UE C++工程,并新建一个JSONFileReadWrite类继承UObject类,创建两个函数,并且让这个C++类和成员函数可以被蓝图调用(加入说明符即可)。

// 类是使用BlueprintType将其暴露给蓝图使用
UCLASS(BlueprintType)
class CPP_API UJSONFileReadWrite : public UObject
{
	GENERATED_BODY()
	
public:

	// 函数是使用BlueprintCallable将其暴露给蓝图使用
	UFUNCTION(BlueprintCallable)
	void ReadJSONFileByFN();

	UFUNCTION(BlueprintCallable)
	void WriteJSONFile();
};

2.2 注意事项

使用UE的Json功能时,需要在build.cs文件中添加Json模块依赖,不然编译不通过。

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

2.3 具体功能实现

2.3.1 ReadJSONFileByFN函数实现

大致思路

  1. 读取磁盘中的 JSON 文件,使用 FFileHelper::LoadFileToString 函数将文件内容读取到FString类型的变量中;
  2. 将 FString 变量存储到一个 FJsonObject 变量中;
  3. 读取FJsonObject 对象中的数据;

【提示】使用文件选择对话框需要下面两个头文件

#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文件绝对路径
	TArray<FString>		JsonFilePaths;																//保存文件的绝对路径
	FString				ExtensionStr	= TEXT("*.*");												//文件类型
	const FString		ProjectDirPath	= FPaths::ConvertRelativePathToFull(FPaths::ProjectDir());	//获取工程目录的绝对路径
	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 根据文件路径读取文件内存,保存到FString变量中
	FString JsonStr;
	FFileHelper::LoadFileToString(JsonStr, *(JsonFilePaths[0]));
	//-----------------------------------------------------------------------------------------------------------------


	//-----------------------------------------------------------------------------------------------------------------
	//2.将 JsonStr 变量存储到一个 FJsonObject 变量中
	TSharedRef<TJsonReader<>>	JsonReader = TJsonReaderFactory<TCHAR>::Create(JsonStr);	//创建一个Json 阅读器
	TSharedPtr<FJsonObject>		JsonObject;													//创建一个Json对象
	FJsonSerializer::Deserialize(JsonReader, JsonObject);									//反序列化,将JsonReader里面的数据,传到JsonObject中

	//-----------------------------------------------------------------------------------------------------------------
	//3.读取Json对象中的数据(例如,读取Game对应的数据值)
	FString sGameValue = JsonObject->GetStringField("Game");
	UE_LOG(LogTemp, Warning, TEXT("Game Value: %s"), *sGameValue);

	return;
}

蓝图中验证功能

  • 在关卡蓝图中写如下代码ue json,UE,ue4,ue5,c++,json
  • 日志文件输出结果如图:结果正确打印出来。
    ue json,UE,ue4,ue5,c++,json

2.3.2 WriteJSONFile函数实现

大致思路

  1. 准备工作:新建一个结构体用于存放数据
  2. 开始写入:单个数据写入、数组数据写入
  3. 验证结果:打印出存储Json内容的字符串
// 存放数据的结构体
struct Info {
	FString name;
	int32 health;
};

void UJSONFileReadWrite::WriteJSONFile()
{
	//-----------------------------------------------------------------------------------------------------------------
	//1. 准备阶段
	//1.1 声明存储写入的Json内容的字符串
	FString JsonStr;
	//1.2创建一个Json编写器
	TSharedRef<TJsonWriter<TCHAR, TCondensedJsonPrintPolicy<TCHAR>>> JsonWriter = TJsonWriterFactory<TCHAR, TCondensedJsonPrintPolicy<TCHAR>>::Create(&JsonStr);
	
	//-----------------------------------------------------------------------------------------------------------------
	//2. 写入单个数据
	JsonWriter->WriteObjectStart();							//开始 一个Json对象的写入(一个Json对象对应一个{}中的内容)
	JsonWriter->WriteValue(TEXT("Time"), TEXT("1998"));		//写入 一个键值对("Time" : "1998")
	JsonWriter->WriteValue(TEXT("age"), TEXT("27"));		//写入 一个键值对("age" : "27")
	JsonWriter->WriteObjectEnd();							//结束 一个Json对象的写入

	//2.1 写入数组数据
	TArray<Info> Players;									//存放数组数据的变量
	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");		???为什么调用WriteArrayStart函数带参数就会报错:数组越界
	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. 打印结果
	UE_LOG(LogTemp, Warning, TEXT("JsonStr Value: %s"), *JsonStr);

	return;
}

LOG输出结果:
ue json,UE,ue4,ue5,c++,json

2.3.3 疑惑

为什么调用WriteArrayStart函数时带参数就会报错:数组越界。我看别的博主都是带参数调用都没有问题。异常内容如下,望各位大佬指点。
ue json,UE,ue4,ue5,c++,json文章来源地址https://www.toymoban.com/news/detail-771004.html

到了这里,关于【程序员必备】UE4 C++ 虚幻引擎:详解JSON文件读、写、解析,打造高效开发!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【虚幻引擎】UE4/UE5 pak挂载

     找到:D:UEUE_4.27EngineBinariesWin64,  WindowS+R打开CMD命令 运行UnrealPak,运行结果如下      注意如果想要加载Pak内资源,那么这些资源必须是经过Cook的。如果打包的是未Cook的资源,那么即使Pak挂载成功,也不可能会成功加载Pak内资源。  Cook好之后,存储的路径在你的I:DBJ

    2024年02月10日
    浏览(70)
  • 【虚幻引擎】UE4 Spline(样条线)

           样条线Spline在UE中是一个很好用的工具,能够设置物体的跟随移动,也能够设置物体的批量复制,还能够设置一个特殊的模型形状比如圆管,还可以设置特殊的粒子特效,做地形设计等等,只要你想要实现的效果,spline都可以实现。官方也提供了很多的案例,可以参考

    2023年04月10日
    浏览(63)
  • 【虚幻引擎UE】UE4/UE5 新人科普向

    Unreal Engine是当前最为流行的游戏引擎之一,具有丰富的游戏开发功能和强大的游戏引擎渲染能力。 UE5官方文档:UE5官方文档非常详细,介绍了UE5的各个功能和应用,适合入门学习和深入探究。链接:https://docs.unrealengine.com/5.1/zh-CN/ UE5中文社区:该社区聚集了大量的UE5开发者,

    2024年02月09日
    浏览(74)
  • 【虚幻引擎】UE4 FTabmanager实现多窗口

    我们先看源码的实现方式:FTabmanager类实现了创建窗口的不同方法 NewLayout:创建新的布局方式  RegisterTabSpawner:注册在模块启动时的函数,这个就是创建了一个窗口,窗口所放置的内容  RestoreFrom:从窗口中显示 调用独立窗口需要在模块启动的时候调用FGlobalTabmanager::Get()的Re

    2024年02月10日
    浏览(72)
  • C++学习day--11 程序员必备工具--github

    github 的重要性: 网络时代的程序员必备。 github 的作用: 1. 版本管理 2. 多人协作 3. 开源共享 常用方案: git+TortoiseGit+github [Tortoise ,程序员常称其为小乌龟,小海龟 ] 安装配置步骤 1. 注册 https://github.com/ 使用邮箱: (例如:1374784346@qq.com) 密码需要至少包含一位小写字母,至

    2024年02月05日
    浏览(100)
  • 【虚幻引擎】UE4/UE5科大讯飞文字合成语音

    B站视频链接:https://space.bilibili.com/449549424?spm_id_from=333.1007.0.0   第一步:首先进入讯飞开放平台注册一个账号,然后创建一个 创建一个应用,命名按照你自己的想法来,会产生一个APPID,具体参考UE4如何接入科大讯飞的语音识别_ue4 科大讯飞的语音识别_飞起的猪的博客-CSDN博

    2024年02月13日
    浏览(68)
  • 【虚幻引擎】UE4/UE5鼠标点击事件实现物体移动

     在UE4/UE5中,引擎有它自己的一套框架体系,虚幻就是基于这一个框架体系来实现的。其中就有PlayerController(玩家控制器),玩家控制器中就有对鼠标的一系列设置,包括显示鼠标,允许点击事件等。  1.创建PlayerController,命名为MyPlayerController 2.打开MyPlayerController,勾选参数

    2024年02月10日
    浏览(100)
  • 【虚幻引擎】UE4 同步和异步资源加载(软引用)

    虚幻引擎给我们提供了两种引用,一个是硬引用。软引用通常是仅储存资源对象的资源路径没有与资源产生耦合关系的引用(软引用加载到内存中,引用对象不会被加载到内存中,只有在需要的时候才会被加载进内存中)。硬引用则是拥有资源对象实际成员变量,直接与资源对

    2024年02月01日
    浏览(100)
  • 【虚幻引擎】UE4/UE5数字孪生与前端Web页面匹配

            数字孪生是一种多维动态的数字映射,可大幅提高效能。数字孪生是充分利用物理模型、传感器更新、运行历史等数据,集成多学科、多物理量、多尺度、多概率的仿真过程,在虚拟空间中完成对现实体的复制和映射,从而反映物理实体的全生命周期过程。数字孪生

    2024年02月03日
    浏览(74)
  • 虚幻引擎4崩溃?10个UE4崩溃解决方法来了

    虚幻引擎 4 在PC上运行出现不断崩溃的情况?你绝对不是一个人,成千上万的用户最近报告了同样的问题。但好消息是你可以修复它。以下是已证明对许多玩家有用的解决方案列表。 如何修复虚幻引擎4的崩溃问题,下面这10个解决办法一起来看看吧。 虚幻引擎 的开发者不断

    2024年02月04日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包