• UE 数据表 DataTable


    当项目中数据量比较大的时候,我们就可以使用到数据表来存储数据。

    创建数据表

    创建数据表之前,我们需要先定义数据表的结构,可以通过 C++ 类和蓝图类来定义数据表的结构。

    C++ 类定义表结构

    想要在 C++ 中使用数据表,我们首先在 C++ 中建立一个继承自FTableRowBase的结构体FMyTableTest

    #pragma once
    
    #include "CoreMinimal.h"
    #include "Engine/DataTable.h"
    #include "MyTableTest.generated.h"
    
    USTRUCT()
    struct FMyTableTest : public FTableRowBase
    {
        GENERATED_USTRUCT_BODY()
        
    public:
        
        UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Tabel")
        FString Name;
        
        UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Tabel")
        int32 Blood;
        
        
        UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Tabel")
        UAnimMontage* StartMontage;
        
        UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = "Tabel")
        class USoundCue* Sound;
        
        
        FMyTableTest(FString InName = "Undifine",
                     int32 InBlood = 100,
                     UAnimMontage *InStartMontage = nil,
                     USoundCue* InSound = nil): Name(InName), Blood(InBlood), StartMontage(InStartMontage), Sound(InSound) {}    
    };
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    注意:

    • 需要引入头文件:#include"Engine/Datatable.h"
    • FMyTableTest 的类型为 struct

    然后,在引擎中创建我们的数据表(Miscellaneous -> DataTable

    选中之后,我们需要选择行结构(Row Structure),在下拉框中,选中我们刚才在 C++ 中创建的接口体FMyTableTest

    在这里插入图片描述

    选择创建,然后双击打开,可以像表中添加元素。

    在这里插入图片描述

    注意:DataTable 中,除了有 FMyTableTest定义的属性外,还有一列行名称(RowName)。

    蓝图类定义表结构

    也可以通过类图结构定义数据表结构。首先创建一个蓝图结构体:MyStruct_BP

    在这里插入图片描述

    添加结构体的变量、数据类型。也可以调整变量的顺序,变量的顺序会影响数据表的排序:靠上的变量会在数据表中靠左显示。

    在这里插入图片描述

    在默认值页面,设置各个属性的默认值。

    在这里插入图片描述

    用相同的方式创建数据表(DataTable),行结构选择创建的蓝图结构体即可。

    另外,在数据表格细节(Data Table Details)->行结构体(Row Structure)中,可以快速的定位到对应的蓝图类。

    读取收据表

    当准备好数据表的数据之后,在代码中可以直接通过资源引用加载 DataTable。首先在 DataTable 上右键->复制引用,获取引用路径:DataTable'/Game/NewDataTable.NewDataTable',再根据引用获取到数据表。

    // 根据引用获取
    UDataTable* const DataTable = LoadObject<UDataTable>(nullptr, TEXT("DataTable'/Game/NewDataTable.NewDataTable'"));
    
    • 1
    • 2

    获取数据

    通过 DataTable 的 FindRow 方法根据 RowName 获取行数据:

    // 根据 RowName 获取行数据
    static const FString ContextString(TEXT("Find FMyTableTest"));
    FMyTableTest* Data = DataTable->FindRow<FMyTableTest>(TEXT("NewRow"), ContextString, true);
    if (Data)
    {
        Print_T(TEXT("NewRow Data:\n"));
        Print_T(TEXT("Name:" + Data->Name + ", Blood:") + FString::FromInt(Data->Blood));
    }
    
    void Print_T(const FString& Msg, float Time = 3, FColor Color = FColor::Red)
    {
        if (GEngine)
        {
            GEngine->AddOnScreenDebugMessage(-1, Time, Color, Msg);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    FindRow 的定义如下:

    /** Function to find the row of a table given its name. */
    template <class T>
    T* FindRow(FName RowName, const TCHAR* ContextString, bool bWarnIfRowMissing = true) const;
    
    • 1
    • 2
    • 3

    参数如下:

    • RowName:行名
    • ContextString:上下文,用于打印信息,可以传入方法名等信息。
    • bWarnIfRowMissing:行缺失时,是否打印警告信息。

    新增数据

    通过 AddRow 方法新增数据:

    // 新增行数据
    FMyTableTest NewData("MyName", 100);
    DataTable->AddRow(TEXT("MyInfo"), NewData);
    
    • 1
    • 2
    • 3

    参考

  • 相关阅读:
    java基于微信小程序的智能停车场管理系统+ssm+uinapp+Mysql+计算机毕业设计
    MyCat主从数据库集群搭建
    Windows 环境搭建 PostgreSQL 物理复制高可用架构数据库服务
    Python获取 只因 弹幕数据+制作词云分析.........就差唱、跳、rap不会了
    本地demo服务器搭建计划——(二)服务中心consul安装&防火墙配置
    [附源码]Python计算机毕业设计Django学生疫情防控信息填报系统
    【工程部署】在RK3588上部署OCR(文字检测识别)(DBNet+CRNN)
    初识数据结构-B树
    数字电路和模拟电路-4基本逻辑门电路
    Java 代码性能基准测试
  • 原文地址:https://blog.csdn.net/fuyoufang1/article/details/126601434