这是我想要的,但一定要通过C++完成吗?不能蓝图直接读取吗 ?
蓝图更简单一点,直接创建对应的结构体和Table..蓝图就可以把表格导入进来了 求解,在c++中调用FillDataTableFromCSVFile,vs编译通过,编辑器模式也正常运行,但是打包时报错error C2039
头文件:
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "Engine/Classes/Engine/DataTable.h"
#include "Core/Public/HAL/PlatformFilemanager.h"
#include "Core/Public/HAL/FileManagerGeneric.h"
#include "Core/Public/Misc/FileHelper.h"
#include "Engine/Classes/Kismet/DataTableFunctionLibrary.h"
#include "TableRowSetting.generated.h"
bool ATableRowSetting::GetTableFromCsvFile(UDataTable* DataTable, const FString& FilePath, const FString& FileName, TArray<FTableRowStruct>& TableRowArray)
{
if (!DataTable)
{
UE_LOG(LogTableRowSetting, Warning, TEXT("Can't fill an invalid DataTable."));
return false;
}
// 获得Csv文件绝对路径
FString _AbsoluteFilePath = FilePath + "\\" + FileName;
//检查文件是否存在
if (!FPlatformFileManager::Get().GetPlatformFile().FileExists(*_AbsoluteFilePath))
{
UE_LOG(LogTableRowSetting, Warning, TEXT("Can't find an invalid csv file."));
return false;
}
// 定义变量保存Table的所有RowName
TArray<FName> TableRowNames;
if (UDataTableFunctionLibrary::FillDataTableFromCSVFile(DataTable, _AbsoluteFilePath))
{
//csv文件填充Table成功,获取Table的RowName
UDataTableFunctionLibrary::GetDataTableRowNames(DataTable, TableRowNames);
FTableRowStruct* _RowDataPtr;
for (FName BaseRowName : TableRowNames)
{
// 遍历每一个RowName的数据
_RowDataPtr = DataTable->FindRow<FTableRowStruct>(BaseRowName, TEXT("LookupRow"), true);
TableRowArray.Add(*_RowDataPtr);
}
return true;
}
else
{
UE_LOG(LogTableRowSetting, Warning, TEXT("Can't fill Csv file to datatable."));
return false;
}
}
打包Log:
童年的琴 发表于 2020-2-20 15:57
求解,在c++中调用FillDataTableFromCSVFile,vs编译通过,编辑器模式也正常运行,但是打包时报错error C20 ...
算了,自己解决了,论坛人太少了。
原因:源代码中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;
}
页:
1
[2]