GameFrameWork框架常用的配表类型基本都已经包含,但实际开发项目的时候,我们难免会碰到一些特殊的类型,需要自己自定义,下面记录一下GameFrameWork框架自定义配表的流程。以自定义List<int> 类型为例。
首先,我们需要自定义自己的DataTableProcessor.List_intProcessor.cs类,参照现有的提供好的自定义类型,依样画符即可。下面是详细代码.
using System.Collections.Generic;
using System.IO;
namespace FishOfHuaNong.Editor.DataTableTools
{
public sealed partial class DataTableProcessor
{
private sealed class List_intProcessor : GenericDataProcessor<List<int>>
{
//是否是系统自带的类型
public override bool IsSystem
{
get
{
return false;
}
}
/// <summary>
/// 定义的类型名称
/// </summary>
public override string LanguageKeyword
{
get
{
return "List<int>";
}
}
/// <summary>
/// 定义的类型名称
/// </summary>
public override string[] GetTypeStrings()
{
return new string[]
{
"List<int>",
};
}
/// <summary>
/// 解析输入的值,返回定义的类型值
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
public override List<int> Parse(string value)
{
string[] values = value.Split(',');
List<int> temp = new List<int>();
foreach(var VarIAble in values)
{
temp.Add(int.Parse(VarIAble));
}
return temp;
}
/// <summary>
/// 写入二进制流
/// </summary>
/// <param name="dataTableProcessor"></param>
/// <param name="binaryWriter"></param>
/// <param name="value"></param>
public override void WriteToStream(DataTableProcessor dataTableProcessor, BinaryWriter binaryWriter, string value)
{
List<int> intList = Parse(value);
foreach(var intItem in intList)
{
binaryWriter.Write(intItem);
}
}
}
}
}
然后在BinaryReaderExtension和DataTableExtension分别扩展读取自定义类型的方法
正常情况下做到这一步已经可以正常生成数据了,但因为自定义的类型比较特殊,带有< >的特殊符号,这些特殊符号无法直接作为方法名字符使用,故我们还需在代码生成类DataTableGenerator.cs中做一些特殊判断
这些操作完成后,点击工具栏的Generate DataTable即可自动生成对应的配表类,最终生成的配表类如下。
//------------------------------------------------------------
// Game Framework
// Copyright © 2013-2021 Jiang Yin. All rights reserved.
// Homepage: https://gameframework.cn/
// Feedback: mailto:ellan@gameframework.cn
//------------------------------------------------------------
// 此文件由工具自动生成,请勿直接修改。
// 生成时间:2022-01-18 00:53:04.927
//------------------------------------------------------------
using GameFramework;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using UnityEngine;
using UnityGameFramework.Runtime;
namespace FishOfHuaNong
{
/// <summary>
/// 实体表。
/// </summary>
public class DRTest : DataRowBase
{
private int m_Id = 0;
/// <summary>
/// 获取实体编号。
/// </summary>
public override int Id
{
get
{
return m_Id;
}
}
/// <summary>
/// 获取资源名称。
/// </summary>
public string AssetName
{
get;
private set;
}
/// <summary>
/// 获取资源数组。
/// </summary>
public List<int> AssetList
{
get;
private set;
}
public override bool ParseDataRow(string dataRowString, object userData)
{
string[] columnStrings = dataRowString.Split(DataTableExtension.DataSplitSeparators);
for (int i = 0; i < columnStrings.Length; i++)
{
columnStrings[i] = columnStrings[i].Trim(DataTableExtension.DataTrimSeparators);
}
int index = 0;
index++;
m_Id = int.Parse(columnStrings[index++]);
index++;
AssetName = columnStrings[index++];
//自定义的扩展方法
AssetList = DataTableExtension.ParseList_int(columnStrings[index++]);
GeneratePropertyArray();
return true;
}
public override bool ParseDataRow(byte[] dataRowBytes, int startIndex, int length, object userData)
{
using (MemoryStream memoryStream = new MemoryStream(dataRowBytes, startIndex, length, false))
{
using (BinaryReader binaryReader = new BinaryReader(memoryStream, Encoding.UTF8))
{
m_Id = binaryReader.Read7BitEncodedInt32();
AssetName = binaryReader.ReadString();
//自定义的扩展方法
AssetList = binaryReader.ReadList_int();
}
}
GeneratePropertyArray();
return true;
}
private void GeneratePropertyArray()
{
}
}
}