UE4读取CSV表格配置数据

[复制链接]
marktong | 2016-10-30 19:44:57 | 显示全部楼层
UE4读取CSV表格配置数据
回复 支持 反对

使用道具 举报

konnin | 2016-12-6 10:00:46 | 显示全部楼层
攒,刚好有这个需求
回复 支持 反对

使用道具 举报

jzaicn | 2016-12-14 23:20:21 | 显示全部楼层
wow,谢谢楼主。游戏配置需要大量表格
回复 支持 反对

使用道具 举报

ajhonson4 | 2016-12-30 21:35:40 | 显示全部楼层
路过,看一看。
回复 支持 反对

使用道具 举报

西卡酷龙 | 2017-5-15 10:39:36 | 显示全部楼层
谢谢分享
回复

使用道具 举报

疯跑的三 | 2017-7-3 18:19:35 | 显示全部楼层
81434712@qq.com 发表于 2016-9-14 14:04
这是我想要的,但一定要通过C++完成吗?不能蓝图直接读取吗 ?

蓝图更简单一点,直接创建对应的结构体和Table..蓝图就可以把表格导入进来了
回复 支持 反对

使用道具 举报

童年的琴 | 2020-2-20 15:57:23 | 显示全部楼层
求解,在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"


  1. bool ATableRowSetting::GetTableFromCsvFile(UDataTable* DataTable, const FString& FilePath, const FString& FileName, TArray<FTableRowStruct>& TableRowArray)
  2. {
  3.         if (!DataTable)
  4.         {
  5.                 UE_LOG(LogTableRowSetting, Warning, TEXT("Can't fill an invalid DataTable."));
  6.                 return false;
  7.         }

  8.         // 获得Csv文件绝对路径
  9.         FString _AbsoluteFilePath = FilePath + "\" + FileName;
  10.         //检查文件是否存在
  11.         if (!FPlatformFileManager::Get().GetPlatformFile().FileExists(*_AbsoluteFilePath))
  12.         {
  13.                 UE_LOG(LogTableRowSetting, Warning, TEXT("Can't find an invalid csv file."));
  14.                 return false;
  15.         }
  16.         // 定义变量保存Table的所有RowName
  17.         TArray<FName> TableRowNames;

  18.         if (UDataTableFunctionLibrary::FillDataTableFromCSVFile(DataTable, _AbsoluteFilePath))
  19.         {
  20.                 //csv文件填充Table成功,获取Table的RowName
  21.                 UDataTableFunctionLibrary::GetDataTableRowNames(DataTable, TableRowNames);

  22.                 FTableRowStruct* _RowDataPtr;

  23.                 for (FName BaseRowName : TableRowNames)
  24.                 {
  25.                         // 遍历每一个RowName的数据
  26.                         _RowDataPtr = DataTable->FindRow<FTableRowStruct>(BaseRowName, TEXT("LookupRow"), true);
  27.                         TableRowArray.Add(*_RowDataPtr);
  28.                 }
  29.                 return true;
  30.         }
  31.         else
  32.         {
  33.                 UE_LOG(LogTableRowSetting, Warning, TEXT("Can't fill Csv file to datatable."));
  34.                 return false;
  35.         }

  36. }
复制代码


打包Log:

打包日志报错:C2039和C3861

打包日志报错:C2039和C3861
回复 支持 反对

使用道具 举报

童年的琴 | 2020-2-21 17:56:33 | 显示全部楼层
童年的琴 发表于 2020-2-20 15:57
求解,在c++中调用FillDataTableFromCSVFile,vs编译通过,编辑器模式也正常运行,但是打包时报错error C20 ...

算了,自己解决了,论坛人太少了。
原因:源代码中UDataTableFunctionLibrary这几个函数包含在#if WITH_EDITOR ... #endif 中,只能在编辑器下调用,重写FillDataTableFromCsvString,使它可以在打包后运行。
供参考:

  1. bool ATableRowSetting::GetDynamicTableFromCsvFile(UDataTable* DataTable, const FString& FilePath, const FString& FileName, TArray<FTableRowStruct>& TableRowArray)
  2. {
  3.         if (!DataTable)
  4.         {
  5.                 UE_LOG(LogCsvParser, Warning, TEXT("Can't fill an invalid DataTable."));
  6.                 return false;
  7.         }

  8.         // 获得Csv文件绝对路径
  9.         FString _AbsoluteFilePath = FilePath + "\" + FileName;
  10.         // 暂存csv 字符串
  11.         FString _CsvString;
  12.         if (FPlatformFileManager::Get().GetPlatformFile().FileExists(*_AbsoluteFilePath))
  13.         {
  14.                 // Supports all combination of ANSI/Unicode files and platforms.
  15.                 FFileHelper::LoadFileToString(_CsvString, *_AbsoluteFilePath);
  16.         }
  17.         else
  18.         {
  19.                 UE_LOG(LogCsvParser, Warning, TEXT("Could not find file %s"), *_AbsoluteFilePath);
  20.                 return false;
  21.         }

  22.         if (_CsvString.Len() == 0)
  23.         {
  24.                 // csv文件为空
  25.                 DataTable->EmptyTable();
  26.                 return false;
  27.         }
  28.         else
  29.         {
  30.                 TArray<FString> Errors = DataTable->CreateTableFromCSVString(_CsvString);
  31.                 if (Errors.Num())
  32.                 {
  33.                         // 创建表失败
  34.                         for (const FString& Error : Errors)
  35.                         {
  36.                                 UE_LOG(LogCsvParser, Warning, TEXT("%s"), *Error);
  37.                         }
  38.                         return false;
  39.                 }
  40.         }

  41.         // 定义变量保存Table的所有RowName
  42.         TArray<FName> TableRowNames;
  43.         // csv文件填充Table成功,获取Table的RowName
  44.         UDataTableFunctionLibrary::GetDataTableRowNames(DataTable, TableRowNames);
  45.         // Table每一行数据
  46.         FTableRowStruct* _RowDataPtr;
  47.         for (FName BaseRowName : TableRowNames)
  48.         {
  49.                 // 遍历每一个RowName的数据
  50.                 _RowDataPtr = DataTable->FindRow<FTableRowStruct>(BaseRowName, TEXT("LookupRow"), true);
  51.                 TableRowArray.Add(*_RowDataPtr);
  52.         }
  53.         return true;

  54. }
复制代码


DataTableFunctionLibrary 源代码

DataTableFunctionLibrary 源代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则