![Thumbnail: ue4](/imgs/icon.png)
UE & Json
2 minute read
UE & Json
项目需要将镜头脚本的一些数据序列化成 Json 格式的文件,方便在 UE Editor 之外进行修改
在这里主要涉及到了
- 设计 Json 内容格式
- 将数据转换成 Json 格式
- 将 Json 格式数据写入文件
- 反序列化文件
- 获取反序列化后的数据
那么在 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