0. 前言
昨天为了做配表多语言导出处理,重新写了一边导出工具,基本重构了一下导出工具,写出来以供参考。老规矩,程序和项目源码链接在下面,就不上传git了。然后,后面可能会再写博客,讲述一下这个具体项目结构和实现,不然可能源码也不好看懂。
链接:https://pan.baidu.com/s/1VHAtJBjUhjI-BPOBnhwv1g
提取码:wsad
1. 导出效果
加入表格数据如下
将会导出数据Map.txt,导出文件名字是可更改配置的
1000001 1000002 1 Map_Name_1000001 0 100010
1000002 1000003 1 Map_Name_1000002 0 100030
1000003 101 1 Map_Name_1000003 0 100040
101 102 1 Map_Name_101 0 0
102 102 1 Map_Name_102 0 0
103 102 1 Map_Name_103 0 0
导出代码DRMap.cs,导出文件名字和代码模板是可配置的
using GameFramework.DataTable;
using System.Collections.Generic;
namespace GDT
{
/// <summary>
/// Map data,Map.xlsx
/// </summary>
public class DRMap: IDataRow
{
/// <summary>
/// 序号int
/// </summary>
public int Id {
get; protected set; }
/// <summary>
/// 序号int
/// </summary>
public int NextId {
get; protected set; }
/// <summary>
/// 地图类型int
/// </summary>
public int MapType {
get; protected set; }
/// <summary>
/// 名字string
/// </summary>
public string Name {
get; protected set; }
/// <summary>
/// 背景音乐编号(没有就设置为0)int
/// </summary>
public int BgmId {
get; protected set; }
/// <summary>
/// 动作参数int
/// </summary>
public int StartDailog {
get; protected set; }
public void ParseDataRow(string input)
{
string[] text = input.Split('\t');
int index = 0;
Id = int.Parse(text[index++]);
NextId = int.Parse(text[index++]);
MapType = int.Parse(text[index++]);
Name = (DataTableExtension.GetStringFromKey(text[index++]));
BgmId = int.Parse(text[index++]);
StartDailog = int.Parse(text[index++]);
}
private void AvoidJIT()
{
new Dictionary<int, DRMap>();
}
}
}
导出多语言文件,导出模板和注释、key内容是都是可配置的
<?xml version="1.0" encoding="UTF-8"?>
<Dictionaries>
<Dictionary Language="ChineseSimplified">
<!-- sheet = Map name = Name -->
<String Key="Map_Name_1000001" Value="射击引导" />
<String Key="Map_Name_1000002" Value="方块引导" />
<String Key="Map_Name_1000003" Value="技能引导" />
<String Key="Map_Name_101" Value="测试关" />
<String Key="Map_Name_102" Value="测试关2" />
<String Key="Map_Name_103" Value="卡片关" />
</Dictionary>
</Dictionaries>
2. 配置方式
所有的配置和导出模板,都在Config.xlsx中
(1)配置路径
首先我们一定要配置一下工作路径,文件Config.xlsx中的Config工作表的前四项,对应配置到Unity的Assets中就可以了,可以使用相对地址。
- 表格文件加载路径 LoadPath
UnityProject_funnyEn\Assets\GameMain\DataTables\Excel - 导出数据保存路径 SaveDataPath
UnityProject_funnyEn\Assets\GameMain\DataTables - 导出代码保存路径 SaveCodePath
UnityProject_funnyEn\Assets\GameMain\Scripts\DataTable - 导出key保存文件 SaveOutputKeyFile
UnityProject_funnyEn\Assets\GameMain\Localization\ChineseSimplified\Dictionaries\Default.xml
(2)其他配置
配置完路径就可以使用了,如果有其他调整,比如希望更改分隔符等,也可以调整,具体的调整项有这些。
(3)模板配置
模板配置在Config.xlsx的Template工作表中,模板的替换规则说明,我写在了“Template解释”工作表中,如果有不清楚的可以对照看看。
3. 配表规则
配表需要按照如下的规则来处理
- 设置项
可以为空或者其他,则没有限制
如果为different,则要求此属性的所有属性值不能重复,否则将报错
如果为outputKey,则此属性将会导出为key,并导出到多语言xml中 - 属性类型
可以处理 bool,int,float,double,string,还有对应的数组比如bool[]
属性值在导出的时,会按照属性类型会进行一个检查,如果错误将报错
属性值不填时,bool默认为false,int\float\double默认为false,string为"",数组默认为0长度数组.
4. DataTableExtension
如果按照上面的配置直接导出,导出后会有函数找不到,是因为,我把多语言和数组转换的处理写在了DataTableExtension中,这个也可以自己写,我放一下我的以供参考。
using GameFramework;
using System;
using UnityGameFramework.Runtime;
namespace GDT
{
public static class DataTableExtension
{
private const char ArraySplitChar = '|';
public static int[] ParseIntArr(string text)
{
string[] texts = text.Split(ArraySplitChar);
if (texts.Length == 1 && texts[0] == "")
{
return new int[0];
}
else
{
int length = texts.Length;
int[] arr = new int[length];
for (int i = 0; i < length; i++)
{
arr[i] = int.Parse(texts[i]);
}
return arr;
}
}
public static float[] ParseFloatArr(string text)
{
string[] texts = text.Split(ArraySplitChar);
if (texts.Length == 1 && texts[0] == "")
{
return new float[0];
}
else
{
int length = texts.Length;
float[] arr = new float[length];
for (int i = 0; i < length; i++)
{
arr[i] = float.Parse(texts[i]);
}
return arr;
}
}
public static double[] ParseDoubleArr(string text)
{
string[] texts = text.Split(ArraySplitChar);
if (texts.Length == 1 && texts[0] == "")
{
return new double[0];
}
else
{
int length = texts.Length;
double[] arr = new double[length];
for (int i = 0; i < length; i++)
{
arr[i] = double.Parse(texts[i]);
}
return arr;
}
}
public static bool[] ParseBoolArr(string text)
{
string[] texts = text.Split(ArraySplitChar);
if (texts.Length == 1 && texts[0] == "")
{
return new bool[0];
}
else
{
int length = texts.Length;
bool[] arr = new bool[length];
for (int i = 0; i < length; i++)
{
arr[i] = bool.Parse(texts[i]);
}
return arr;
}
}
public static string[] ParseStringArr(string text)
{
string[] texts = text.Split(ArraySplitChar);
return texts;
}
public static string GetStringFromKey(string key)
{
if (key == "")
{
return "";
}
else
{
return GameEntry.Localization.GetRawString(key);
}
}
}
}