UE4读取CSV表格配置数据

[复制链接]
查看12296 | 回复18 | 2016-9-14 10:12:31 | 显示全部楼层 |阅读模式

开发游戏时,经常会采用表格文件来存储游戏相关配置数,比如玩家的最大健康值、魔法值等,以及NPC的属性配置等。在Unreal下,无须自己编写表格文件的读取及解析代码,可以直接使用Unreal自带的读取表格数据功能。

下面通过一个简单示例来说明如何通过Unreal来读取CVS格式的表格数据。

表格数据示例如下:



注意,表格第一个单元格必须为空,第一行为每一列的名称,该行数据也是存取每一列数据的唯一标识。表格第一列代表行ID,获取某行数据时需要根据第一列的值标识某一行数据。


首先,创建一个Actor类,头文件中添加表格变量,程序通过该Actor对象来读取表格数据。代码如下:

UCLASS()

class CVSTABLE_API ATableRowSetting : public AActor

{

    GENERATED_BODY()


public:

    // Sets default values for this actor's properties

    ATableRowSetting();


    // Called when the game starts or when spawned

    virtual void BeginPlay() override;


    // Called every frame

    virtual void Tick( floatDeltaSeconds )override;


    UPROPERTY(BlueprintReadWrite,EditAnywhere,Category ="Data SettingActor")

        UDataTable* DataTable;


};


然后在该头文件中添加与该CSV文件对应的表格数据结构,该结构从FTableRowBase结构派生,代码如下:

USTRUCT(BlueprintType)

struct FTableSettingData :publicFTableRowBase

{

    GENERATED_USTRUCT_BODY()


        UPROPERTY(BlueprintReadOnly,Category ="TableSetting")

        int32 MAX_HP;


    UPROPERTY(BlueprintReadOnly,Category ="TableSetting")

        int32 MAX_MP;


    UPROPERTY(BlueprintReadOnly,Category ="TableSetting")

        int32 MAX_LEVEL;


    UPROPERTY(BlueprintReadOnly,Category ="TableSetting")

        int32 MAX_XP;


};

注意,该结构中的属性变量必须与CSV文件中第一行中的列名保持一致。

然后在BeginPlay函数中实现表格数据的读取,代码如下:

void ATableRowSetting::BeginPlay()

{

    Super::BeginPlay();


    if (DataTable !=nullptr)

    {

        FTableSettingData* dataRow = DataTable->FindRow<FTableSettingData>(TEXT("HUMAN"),TEXT("LookupRow"));


        int32  HP = dataRow->MAX_HP;


        UE_LOG(LogTemp, Warning, TEXT(" Max HP is %d "),HP);

    }


}


至此,读取表格数据的代码工作已经全部完成,接下来需要在编辑器中完成必要的工作。

首先,将创建好的CSV文件拖至编辑器进行导入,导入时,会弹出提示框,选择DataTable,以及刚才定义的表格数据数据结构。

接下来选择刚创建的ATableRowSetting类资源,在属性中可以看到DataTable属性,将导入的CSV文件资源拖至该属性,保存工程并运行即可看到结果。
samcegreat | 2016-9-14 11:42:12 | 显示全部楼层
楼主实乃我辈楷模。
回复 支持 1 反对 0

使用道具 举报

zz_nirvana | 2016-9-14 12:12:47 | 显示全部楼层
多谢分享!!!!!!
回复

使用道具 举报

81434712@qq.com | 2016-9-14 14:04:50 | 显示全部楼层
这是我想要的,但一定要通过C++完成吗?不能蓝图直接读取吗 ?
回复 支持 反对

使用道具 举报

nameless123456 | 2016-9-14 15:32:08 | 显示全部楼层
谢谢分享,非常有用呢~~~~
回复 支持 反对

使用道具 举报

rello | 2016-9-14 16:16:10 | 显示全部楼层
支持一下
回复

使用道具 举报

剑客 | 2016-9-27 21:37:40 | 显示全部楼层
个人觉得c++ 更易于和别的数据交互。比如想把csv中的部分数据存出去看看什么的,Bp无解!
回复 支持 反对

使用道具 举报

killlu | 2016-10-14 16:08:26 | 显示全部楼层
感谢分享
回复

使用道具 举报

594270461 | 2016-10-18 14:55:15 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
我很唯一
回复 支持 反对

使用道具 举报

zyx545792476 | 2016-10-20 14:01:02 | 显示全部楼层
66666,楼主乃当代之强国青年。
回复 支持 反对

使用道具 举报

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

本版积分规则

2

主题

15

回帖

28

积分

初始化成员

积分
28