UE4 C++ 利用DataTable读取CSV文件(无需在蓝图中创建DataTable)
网上有许多用C++读取CSV文件的帖子,刚开始用了一个方法可以在打开csv文件的同时,也可以读取到文件里面的内容,但是这个方法在4.26会打包报错。该方法的大概流程为:
- 在C++里面写一个继承于FTableRowBase 的结构体
- 用这个结构体在编辑器里面创建一个DataTable表
-
利用函数UDataTableFunctionLibrary::FillDataTableFromCSVFile(DataTable, CSVPath);将CSV表中的数据写入创建的表中(
该函数在4.26打包中,会报错
)
(7.12补充, 查阅该函数的属性宏标识:
UFUNCTION(BlueprintCallable, Category = "Editor Scripting | DataTable", DisplayName = "Fill Data Table from CSV File"),编辑器脚本,所以不能打包)
- 得到表的每行的名字,根据名字在表中查找到这一行的数据,从而得到在C++中得到CSV文件中的数据
下面提供一种可以打包的版本(但是该版本在CSV文件打开的时候,会出现访问冲突而读取不到CSV文件)
- 在C++文件中添加头文件
#include "Engine/DataTable.h"
2. 创建一个结构体来储存CSV文件中的信息,该结构体得继承于 FTableRowBase
USTRUCT(BlueprintType)
struct FStructInfo : public FTableRowBase
GENERATED_BODY()
UPROPERTY(EditAnywhere, BlueprintReadWrite)
FString Name;
UPROPERTY(EditAnywhere, BlueprintReadWrite)
float Speed = 1.0f;
};
3. 创建函数读取CSV中的数据创建DataTable
UDataTable* ACSVManager::ReadCSVFile(FString csvPath)
FString Data;
if (FFileHelper::LoadFileToString(Data, *csvPath))//读取CSV文件
UDataTable* Datatable = NewObject<UDataTable>();// 定义datatable
Datatable->RowStruct = FStructInfo::StaticStruct();//定义datatable的结构体
Datatable->CreateTableFromCSVString(Data);//将csv中的数据写入datatable