zyx545792476 发表于 2016-10-20 14:01:02

66666,楼主乃当代之强国青年。

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"


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-21 17:56:33

童年的琴 发表于 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]
查看完整版本: UE4读取CSV表格配置数据