3.策划配置表-DataTable

本文详细介绍了Unity游戏引擎中使用GameFramework的策划配置表DataTable,包括介绍、类介绍、配置表生成方法以及数据表解析流程。作者提供了一个工具,能够将txt配置转化为.bytes配置并自动生成.cs读取代码。内容还涉及XR平台的配置表功能和Unity菜单的导表功能,解释了FileSystem和NotFileSystem的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

GameFramework策划配置表DataTable

介绍

这个就是策划用 excel 编辑的配置表导出来给程序用的

类介绍

DataTableComponent
DataTableManager
管理所有配置表,提供创建表,删除表
DataTableBase
对应excel的 sheet,存储1张数据表的内容
按行存取,数据读取和解析委托给 DataProvider<DataTableBase>
DataProvider<DataTableBase>
加载和解析整张配置表
这里没有按行解析
加载委托 IResourceManager
解析委托给 IDataProviderHelper<DataTableBase>
IDataProviderHelper<DataTableBase>
数据表解析过程
DataTableHelperBase
DefaultDataTableHelper
默认实现,解析整个配置并传给 DataTableBase 解析行
DataTable<IDataRow>
默认数据表实现
按行解析并存储配置表
IDatatable<IDataRow>
提供给外部使用
IDataRow
数据表行类型,用来解析并存储一行
DataRowBase
数据表行类型基类
MyDataRow
你的数据表行类型

生成配置表

  • 作者提供了一个用 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);
											}
										}
									}
								}
							}
						}
					}
				}
			}
		}
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值