ue4-数据表的使用

把它做成一个插件,再写个导出二进制数据的方法导出一个二进制文件a.bin,然后在游戏运行时读取a.bin文件,这样数据就相对安全点了

1、excel中到处csv,再导入ue中(貌似可以直接认识的只有csv了)

另存为csv文件

img

img

2、c++中写个结构体对应字段属性,字段名必须完全一致

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
USTRUCT(Blueprintable)
struct FTestData : public FTableRowBase
{
GENERATED_USTRUCT_BODY()
public:
FTestData();
virtual ~FTestData();

public:
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "FTestData")
int32 mId;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "FTestData")
FString mName;
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "FTestData")
FString mDescr;
};

3、导入csv到ue中

(导入时记得关闭excel,不然文件被进程占用无法导入)

img

img

img

数据导入Done

4、c++中使用这些数据

把他丢带一个资源引用指针中,资源数据中引用好这个数据表资源,延迟加载

1
2
3
4
5
6
7
8
9
10
UCLASS()
class UResDataBase : public UDataAsset
{
GENERATED_BODY()
public:
UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "UResMgr")
TAssetPtr<UDataTable> mTestData;
private:
//TMap<int32, UBehaviorData*> mBehaviorDataMap;//存放技能数据
};

img

5、加载引用的资源

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void UResMgr::TestloadCSV()
{
UObject* obj = mAssetLoader->SynchronousLoad(mResDB->mTestData.ToStringReference());
UDataTable* data = Cast<UDataTable>(obj);
if (data != nullptr)
{
UE_LOG(ResLogger, Warning, TEXT("--- UResMgr::TestloadCSV success"));
FTestData* tmpPtr = nullptr;
for (auto it : data->RowMap)
{
// it.Key has the key from first column of the CSV file
// it.Value has a pointer to a struct of data. You can safely cast it to your actual type, e.g FMyStruct* data = (FMyStruct*)(it.Value);
tmpPtr = (FTestData*)(it.Value);
UE_LOG(ResLogger, Warning, TEXT("--- row:%s, key:%d, name:%s"), *it.Key.ToString(), tmpPtr->mId, *tmpPtr->mName);
}
}
}

ps:加载器时是这个东东 FStreamableManager* mAssetLoader;

6、遍历一下结果