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);
											}
										}
									}
								}
							}
						}
					}
				}
			}
		}
	}
参考资源链接:[UE4数据驱动开发实践与优势解析](https://wenku.csdn.net/doc/1m57tzgcv0?utm_source=wenku_answer2doc_content) 为了使您能够更好地掌握使用DataTable和DataAsset进行数据驱动开发的方法,并提高维护性和团队协作效率,我们建议您查阅《UE4数据驱动开发实践与优势解析》。这本书将为您提供实用的指导和深入的案例分析,直接关联到您当前的问题。 在UE4中,通过DataTable和DataAsset实现数据驱动游戏开发的最佳实践包括以下步骤和注意事项: 1. 定义数据结构:首先,您需要在编辑器中创建DataTable,用以存储需要动态配置的数据。例如,您可以创建一个角色信息,包括角色名称、等级、属性值等。 2. 数据封装:为了数据的模块化和复用,您可以创建DataAsset类,并将DataTable作为其属性。这样,DataAsset就可以作为DataTable的高级封装,便于在不同的上下文中使用。 3. 数据绑定:在C++或蓝图中绑定DataTable,通过UCLASS和USTRUCT宏定义将DataTable与C++类关联起来,或者使用蓝图中的数据获取节点来访问DataTable数据。 4. 动态读取与更新:在运行时,您可以使用诸如UGameplayDataTable等函数动态加载DataTable,以及使用UDataTable::FindRow函数根据名称查找特定行。 5. 数据热更新:利用EditorUtilities类,您可以创建编辑器扩展,使得策划人员可以直接在编辑器内更新数据,并实时看到效果,无需重新编译。 6. 维护与协作:确保所有的数据更新都有版本控制,以便团队成员能够协作并追踪每个版本的变更。 7. 安全性考虑:在设计DataAsset时,注意保护关键数据不被恶意修改,并确保数据的导入导出过程不会破坏数据的完整性。 以上步骤涵盖了从设计、实现到维护的数据驱动开发流程。如果您希望深入学习更多关于DataTable和DataAsset的高级用法,以及如何结合编辑器扩展来实现更高效的工作流,《UE4数据驱动开发实践与优势解析》将为您提供丰富的资源和深入的见解。 参考资源链接:[UE4数据驱动开发实践与优势解析](https://wenku.csdn.net/doc/1m57tzgcv0?utm_source=wenku_answer2doc_content)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值