如何通过json文件修改打包后的DataTable数据
原理
先通过FFileHelper::LoadFileToString获取json数据
再通过UDataTable::CreateTableFromJSONString改变DataTable的数据
实现步骤
创建一个类继承自UBlueprintFunctionLibrary
继承这个类可以新建静态函数在任意蓝图中直接调用
头文件
UCLASS()
class MISSILEUI_API UMyBlueprintFunctionLibrary : public UBlueprintFunctionLibrary
{
GENERATED_BODY()
public:
UFUNCTION(BlueprintCallable, DisplayName = "FillDataTablefromJSONFile", Category = "DataTable")
static bool FillDataTableFromJSONFile(UDataTable* DataTable, FString JSONFilePath);
};
cpp文件
bool UMyBlueprintFunctionLibrary::FillDataTableFromJSONFile(UDataTable * DataTable, FString JSONFilePath)
{
if (!DataTable)return false;
FString JSONString;
//这里是获取路径
JSONFilePath = FPaths::ProjectContentDir() + JSONFilePath;
//这里判断文件是否存在,如果存在则读取文件数据到JSONString
if (FPlatformFileManager::Get().GetPlatformFile().FileExists(*JSONFilePath))
{
FFileHelper::LoadFileToString(JSONString, *JSONFilePath);
}
else
{
GEngine->AddOnScreenDebugMessage(-1, 10.f, FColor::Red, FString::Printf(TEXT("FillDataTableFromJSONString -> Can't fill DataTable with JSONString: %s"), *JSONFilePath));
return false;
}
//根据JSONString覆盖掉原有的Datatable数据
TArray<FString> Errors = DataTable->CreateTableFromJSONString(JSONString);
if (Errors.Num())
{
for (const FString& Error : Errors)
{
GEngine->AddOnScreenDebugMessage(-1, 10.f, FColor::Red, FString::Printf(TEXT("%s"), *Error));
}
return false;
}
return true;
}
创建一个结构体继承自FTableRowBase
- 例如
USTRUCT(BlueprintType)
struct FMyData : public FTableRowBase
{
GENERATED_USTRUCT_BODY()
UPROPERTY(BlueprintReadWrite, EditAnywhere)
FString Name;
UPROPERTY(BlueprintReadWrite, EditAnywhere)
TArray<FString> User;
UPROPERTY(BlueprintReadWrite, EditAnywhere)
TArray<FString> TreeData;
UPROPERTY(BlueprintReadWrite, EditAnywhere)
TArray<FString> ChangeText;
};
必须要有一个Name变量,这个Name其实就是RowName
创建好之后记得在UE4中创建一个这个结构的DataTable
创建Json文件
注意要跟上面创建的那个结构体一一对应,少一个多一个或者名字打错都会报错
[
{
"Name": "0",
"User": [
"1111:222",
"1111:333"
],
"TreeData": [
"一级,二级1-1,二级1-2",
"一级2,二级2-1,二级2-2",
"一级3,二级3-1,二级3-2",
"一级4,二级4-1,二级4-2",
"一级5,二级5-1,二级5-2"
],
"ChangeText": [
"hahahahhaha"
]
}
]
最后的蓝图调用
调用很简单这里就不截图了,需要传入两个参数
第一个是要被覆盖的DataTable,注意这个DataTable的结构一定要跟Json中的结构一致
第二个是Json文件路径,填入相对路径,如./DataFile/datafile.json