题外话,如果有一块用UE4做游戏的美术,可以在评论区留下联系方式,不要求时间特别多,本人也是业余时间开发,贵在坚持。
据说在游戏开发的上古时期,策划和程序比现在还掐得厉害,往往是程序刚实现完一块功能,策划反手就是一波改需求,大需求可能还能接受,小的诸如我某某地方改个名字,改个数值,都要程序亲手操作。
于是,伟大的数据表被发明了出来。程序说我要开始偷懒啦,然后扔个策划一个数据表,让策划自己玩数值去。但是很多游戏公司,数值系统不完善,很多数值表没有专门的编辑器配置,从而成为很多策划加班加点的罪魁祸首。
为啥我改个数值,游戏崩了,为啥我加了个配置,游戏崩了。。。诸如此类的哀嚎
再完善一点的公司,终于有了自己的编辑器。
而unreal给我们提供的轮子,让我们可以简单地就造出数据表外加数据表编辑器的轮子。这篇主要讲数据表,下篇博文会讲数据表编辑器(非UE4中点开数据表自带的那种)。
unreal本身提供了数据表的类,如果我们想实现数据表,只需要#include "Engine/DataTable.h",继承FTableRowBase就行。
以游戏中最常见的货币为例,游戏中经常会存在各种货币,比如金币,点券等等。策划说,我们今天加一种货币类型,然后程序屁颠屁颠地在代码里面加了一种,策划说,我们这种货币类型不要了,程序又不耐其烦地删掉。但是我们会发现,其实多一种货币类型,其实绝大多数逻辑对于游戏都是一样的,无非就是多一个类型id,一个类型描述,但是程序那边很多情况是不需要改动的。
所以对于货币类型,完全可以让策划自己去配,只有涉及到专属货币的逻辑(很少有这种逻辑),才会有程序的事。
于是我们将货币类型做成配置表。
#pragma once
#include "CoreMinimal.h"
#include "Engine/DataTable.h"
#include "MoneyTypeConfigTableRow.generated.h"
/**
* @brief money类型配置表
*/
USTRUCT(BlueprintType)
struct GAMEFRAMEWORK_API FMoneyTypeConfigTableRow : public FTableRowBase
{
GENERATED_USTRUCT_BODY()
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "MoneyTypeConfigTable")
int32 MoneyTypeId; ///< money类型id
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "MoneyTypeConfigTable")
FString MoneyTypeName; ///< money类型名字,用于类型生成
UPROPERTY(BlueprintReadWrite, EditAnywhere, Category = "MoneyTypeConfigTable")
FString MoneyTypeDescription; ///< money类型描述
};
MoneyTypeName是我程序用于类型生成代码自己做的,在这里大家可以当作一个普通字段,忽略注释,后面会有博文单独介绍。
c++编译之后,我们在程序中就能创建数据表格了。右键Content创建数据表格,在ComboBox中我们就能找到数据表类型了。
如果只是想简单看一下效果,我们可以双击这个文件,出现unreal自带的编辑器界面,里面出现的列和我们类中定义的字段一样。
这里说一下我碰到的问题,很多时候,我们的数据表会增删字段,但是对于我们已经创建出来的数据表文件,并不会动态增加列。加入说我FMoneyTypeConfigTableRow这个结构体增加了一个叫Tag的FString的标签,我编译完项目后,现有的数据表格并不会增加Tag,甚至会出现打不开数据表格的情况。
这里我建议的是,如果你数据表里只有很少的内容(十条以下),而且字段特别简单,还是把文件删了重新创建表格,将数据加回来吧。如果你数据表里的内容特别复杂,或者行数特别多,那么你可以要程序那边先将代码回滚到与数据表一致的结构,这个时候怎么办呢,数据表都可以导出成json。
导出后文件是这样的。
是不是很熟悉,全部是表结构定义的字段,这个时候,到了程序写工具的时候了,随便用什么语言,C#、java,怎么方便怎么来,直接把文件内容转成json,然后每个jobject后面开始加东西,加的内容就是你数据表新增的字段(或者将里面老字段删掉),操作完后,将新文件重新import进来,一切就搞定啦。
数据表比较简单,下篇开始说基于数据表的编辑器扩展插件吧。
Tip:2019年11月18日记录,新发现修改表结构后,有种更快地修改已有表数据的方法,在虚幻里右击datatable文件,导出json,(这是用新表结构编译后的引擎,导出旧格式的文件),虚幻会自动把新增的字段给补全,这时再把老的删掉,重新导回刚才json文件即可