GameFramework策划配置表DataTable
介绍
这个就是策划用 excel 编辑的配置表导出来给程序用的
类介绍
生成配置表
-
作者提供了一个用 txt 配置生成 .bytes 配置,并自动生成 .cs 读取代码的工具
这个工具在 StarForce 示例的目录 Assets/GameMain/Scripts/Editor/DataTableGenerator
编辑excel表时直接保存成 .txt 文件,然后就可以用示例工具生成 .bytes 和 .cs 读取类
可以拿来改改用,比如 XR平台 增加了直接解析 .xlsx 配置表
最好的可能是直接集成 luban 导表工具 -
XR平台的配置表功能说明
DataTableConfig 中定义了相关的路径
ExcelsFolder = $“{Application.dataPath}/…/Excels/”; excel表源文件路径
DataTableFolderPath = “Assets/[Resources]/DataTables”; bytes表生成路径
CSharpCodePath = “Assets/Scripts/Logic/DataTable”; cs 类生成路径
CSharpCodeTemplateFileName = “Assets/[Resources]/Configs/DataTableCodeTemplate.txt”; cs 类模板文件
NameSpace = “MiGuFramework.Runtime”; cs 类命名空间
ExtensionDirectoryPath = “Assets/Scripts/Logic/DataTable/Extensions”; 模板数据类型读写扩展类生成路径unity菜单 GameFramework->DataTable->GenerateDataTables 定义了相关导表功能
FileSystem 和 NotFileSystem 的区别是:
使用带 FileSystem 会在文件头存储每一行的id和对应的起始位置和长度
也就是你可以快速定位某行数据,而不用先全部加载
Excel To Txt:
excel 导成 txt -
XR平台导表
在 Excels 目录下配置表
运行
使用
// 定义行类型(一般是导表的时候自动生成,默认加 DR 前缀)
class DRCsvRow : DataRowBase
{
// 定义行存储的数据
string name;
int age;
// 重载如何解析行数据
public override bool ParseDataRow(string dataRowString, object userData)
{
string[] fields = dataRowString.Split(',');
name = fields[0];
age = int.Parse(fields[1]);
}
}
DataTableComponent tableComponent = GameEntry.GetComponent<DataTableComponent>();
// 创建表
IDataTable<DRCsvRow> table = tableComponent.CreateDataTable<DRCsvRow>("TableName");
// 读取表
table.ReadData("/a/b.bytes");
// 使用表
IDataTable<DRCsvRow> table = tableComponent.GetDataTable<DRCsvRow>();
DRCsvRow[] rows = table.GetAllDataRows();
DRCsvRow row = table.GetDataRow(x=>x.id==5);
数据表解析流程
DataTableBase.ReadData(string dataTableAssetName)
{
DataProvider<DataTableBase>.ReadData(string dataAssetName)
{
// 加载资源
m_ResourceManager.LoadAsset(dataAssetName, priority, m_LoadAssetCallbacks, userData)
{
DataProvider<DataTableBase>.LoadAssetSuccessCallback(string dataAssetName, object dataAsset, float duration, object userData)
{
// 解析配置
DefaultDataTableHelper.ReadData(m_Owner, dataAssetName, dataAsset, userData)
{
DataTableBase.ParseData(byte[] dataTableBytes, object userData)
{
DataProvider<DataTableBase>.ParseData(byte[] dataBytes, int startIndex, int length, object userData)
{
DefaultDataTableHelper.ParseData(DataTableBase dataTable, string dataTableString, object userData)
{
// 读取每行数据,然后添加
while ((dataRowString = dataTableString.ReadLine(ref position)) != null)
{
// # 做为注释符
if (dataRowString[0] == '#')
continue;
dataTable.AddDataRow(dataRowString, userData)
{
DataTable<T>.AddDataRow(string dataRowString, object userData)
{
// 由行类型来解析行数据
T dataRow = new T();
dataRow.ParseDataRow(dataRowString, userData);
// 保存行
InternalAddDataRow(dataRow);
}
}
}
}
}
}
}
}
}
}
}