算了,自己解决了,论坛人太少了。
原因:源代码中UDataTableFunctionLibrary这几个函数包含在#if WITH_EDITOR ... #endif 中,只能在编辑器下调用,重写FillDataTableFromCsvString,使它可以在打包后运行。
供参考:
- bool ATableRowSetting::GetDynamicTableFromCsvFile(UDataTable* DataTable, const FString& FilePath, const FString& FileName, TArray<FTableRowStruct>& TableRowArray)
- {
- if (!DataTable)
- {
- UE_LOG(LogCsvParser, Warning, TEXT("Can't fill an invalid DataTable."));
- return false;
- }
- // 获得Csv文件绝对路径
- FString _AbsoluteFilePath = FilePath + "\" + FileName;
- // 暂存csv 字符串
- FString _CsvString;
- if (FPlatformFileManager::Get().GetPlatformFile().FileExists(*_AbsoluteFilePath))
- {
- // Supports all combination of ANSI/Unicode files and platforms.
- FFileHelper::LoadFileToString(_CsvString, *_AbsoluteFilePath);
- }
- else
- {
- UE_LOG(LogCsvParser, Warning, TEXT("Could not find file %s"), *_AbsoluteFilePath);
- return false;
- }
- if (_CsvString.Len() == 0)
- {
- // csv文件为空
- DataTable->EmptyTable();
- return false;
- }
- else
- {
- TArray<FString> Errors = DataTable->CreateTableFromCSVString(_CsvString);
- if (Errors.Num())
- {
- // 创建表失败
- for (const FString& Error : Errors)
- {
- UE_LOG(LogCsvParser, Warning, TEXT("%s"), *Error);
- }
- return false;
- }
- }
- // 定义变量保存Table的所有RowName
- TArray<FName> TableRowNames;
- // csv文件填充Table成功,获取Table的RowName
- UDataTableFunctionLibrary::GetDataTableRowNames(DataTable, TableRowNames);
- // Table每一行数据
- FTableRowStruct* _RowDataPtr;
- for (FName BaseRowName : TableRowNames)
- {
- // 遍历每一个RowName的数据
- _RowDataPtr = DataTable->FindRow<FTableRowStruct>(BaseRowName, TEXT("LookupRow"), true);
- TableRowArray.Add(*_RowDataPtr);
- }
- return true;
- }
复制代码
|