Thumbnail: ue4

UE & Json

by on under ue
2 minute read

UE & Json

项目需要将镜头脚本的一些数据序列化成 Json 格式的文件,方便在 UE Editor 之外进行修改

在这里主要涉及到了

  1. 设计 Json 内容格式
  2. 将数据转换成 Json 格式
  3. 将 Json 格式数据写入文件
  4. 反序列化文件
  5. 获取反序列化后的数据

那么在 UE 中有个最省事的办法,那就是把数据统统存到一个 struct 里面,然后直接调用 UE 提供的方法序列化这个 struct.

那么第一步设计 Json 内容格式也就变成了设计一个 struct

这里我的项目中设计的镜头脚本的 struct 是这样的

UENUM(BlueprintType)
enum class ECameraType : uint8
{
	LockedCamera = 0,
	SplineCamera = 1,
	FollowCamera = 2,
	CurveCamera = 3
};

USTRUCT()
struct FCurveStruct
{
	GENERATED_BODY()

	/** 交由 CameraFactory 生产的 CameraType */
	UPROPERTY()
	ECameraType CameraType;

	/** 相机锁定的 Actor 的序号 */
	UPROPERTY()
	int TargetKey = 0;

	/** SplineCamera 下相机移动的速度 */
	UPROPERTY()
	float CameraSpeed = 0;

	/** SplineCamera 中 Spline 点的 TArray */
	UPROPERTY()
	TArray<FVector> Points;

	/** CurveCamera 的 Location CurveVector */
	UPROPERTY()
	TArray<FRichCurveKey> LocationX;
	UPROPERTY()
	TArray<FRichCurveKey> LocationY;
	UPROPERTY()	
	TArray<FRichCurveKey> LocationZ; 

	/** CurveCamera 的 Rotation CurveVector */
	UPROPERTY()
	TArray<FRichCurveKey> RotationX;
	UPROPERTY()
	TArray<FRichCurveKey> RotationY;
	UPROPERTY()
	TArray<FRichCurveKey> RotationZ;
};

下一步是把一个实例化的 struct 转成一个 Json 格式的字符串,UE 提供了该方法(然而我花了两天的时间去琢磨怎么去序列化 UE 数据,后来才知道还有这种好东西)

/** 
* @param YourStructInstance 待序列化的 struct
* @param JsonString 序列化后存数据用的 FString&
*/
FJsonObjectConverter::UStructToJsonObjectString(YourStructInstance, JsonString, 0, 0);

然后再把 JsonString 写入到文件中

FFileHelper::SaveStringToFile(JsonString, *YourFilePath);

简单粗暴,就俩行代码,折腾了两天

接下来是反序列化

反过来先是去读文件

FFileHelper::LoadFileToString(JsonString, *FilePathString);

然后再去转换成结构体

FJsonObjectConverter::JsonObjectStringToUStruct(JsonString, &YourStructInstance, 0, 0);

两行搞定

这里值得一提的是,尽管你可以不去建一个 struct 而仅去实例化一些基础数据,但是当你涉及到需要存储大量数据以及数据结构 ( such as TArray )的时候,你需要花大量的时间去实现你自己的转化方法,只能说很麻烦而且似乎不那么有必要,这里还是乖乖用人家 UE 给你写好的函数比较省事

ue4