官方说明:可以将游戏数据以表格(如 Microsoft Excel)的形式进行配置后,使用此模块使用这些数据表。数据表的格式是可以自定义的。
数据表编写
前面实体的调用以及实体的属性配置用到的就是数据表,但是并没有做过多了解,这里具体说一下使用。
数据表是将excel数据转换为txt,然后游戏去读取这些数据,数据包括实体的生命值、防御力、攻击力、实体对应的特效id、死亡音乐id等各种数据关系表。
表格需保存为Unicode文本(*.txt)格式
txt的编码格式,搜索其他文章或博客有提到,需用UTF-8编码格式。我没有改,使用UTF-16Little Endian编码(UTF16-LE)也是可以的。
Demo中数据表放在AssetUtility类的路径配置中,需传入文件名及后缀类型(类型为true,false)
解析数据表DR类
数据表编写完成后,接下来就是解析数据表。解析数据表的类,不用自己手写,是工具生成的,入口如下图
点击后即可生成数据表的bytes文件以及解析类“DR+表名”,代码入口如下。
跳转后即可看到脚本名的组成方式,这里只需知道是怎么来的,至于如何生成脚本,后续再研究。
加载读取数据时,DataTableExtension脚本里同样在加了DR前缀。
大概看一下解析数据表的内容,与数据表里的属性是一一对应的。
数据表加载读取
加载读取代码在ProcedurePreload流程里,代码如下:
public static readonly string[] DataTableNames = new string[]
{
"Aircraft",
"Armor",
"Asteroid",
"Entity",
"Music",
"Scene",
"Sound",
"Thruster",
"UIForm",
"UISound",
"Weapon",
};
private void PreloadResources()
{
// Preload data tables
foreach (string dataTableName in DataTableNames)
{
LoadDataTable(dataTableName);
}
}
private void LoadDataTable(string dataTableName)
{
string dataTableAssetName = AssetUtility.GetDataTableAsset(dataTableName, true);
m_LoadedFlag.Add(dataTableAssetName, false);
GameEntry.DataTable.LoadDataTable(dataTableName, dataTableAssetName, this);
}
首先通过字符串数组罗列了需要加载的数据表类型,然后循环遍历加载到框架里。
数据加载方式如下,获取到对应数据表后,须通过TypeID(即表中的ID编号)来获取某一行的数据。
IDataTable dtAircraft = GameEntry.DataTable.GetDataTable();
DRAircraft drAircraft = dtAircraft.GetDataRow(TypeId);
Entity实体部分,有一部分实体数据是动态随机生成或游戏运行时生成,或者是与其他数据表进行的组合,这一块可以根据数据逻辑扩展。