准备工作
创建数据Excel表
在这个方案中,我希望Text组件所使用的文本,字体样式等都通过读表的形式完成,这样的话策划有啥需求就能通过修改配置表的形式实现。配置表会有两个:
- 字体样式表
StyleName | Font | FontStyle | Size | RichText | CororR | CororG | CororB | CororA |
---|---|---|---|---|---|---|---|---|
Main | Arial | Bold | 30 | True | 50 | 50 | 50 | 255 |
Battle | Arial | Normal | 40 | True | 100 | 100 | 100 | 255 |
StyleName:表示样式名称,同时用作键值
Font:表示需要使用的字体
FontStyle:表示需要使用的字体样式
Size:表示字体的大小
RichText:表示是否支持富文本
ColorRGBA:表示字体的颜色
2.文本表
Style | Language_CN | LanguageEN |
---|---|---|
Main | 中文 | 英语 |
Style:表示样式,需要和字体样式表中的StyleName对应
生成bin文件
这里并非一定要使用bin文件,可根据需求及喜好也可以使用json等形式。为了方便,我使用了ExcelDataReader和ExcelDataReader.DataSet两个插件来读取Excel表,这两个插件可通过Nuget安装到解决方案中。
//bin文件存放路径
private const string _outputPath = "../../../Output/";
//Excel表路径
string _inputPath = string.Empty;
/// <summary>
/// 生成bin文件
/// </summary>
/// <param name="inputPath"></param>
public void CreateBinaryData(string inputPath)
{
if (_inputPath != inputPath) _inputPath = inputPath;
var styleDatas = ReadStyle();
WriteStyle(styleDatas);
ReadTextConfig();
}
/// <summary>
/// 从Excel表中读取多语言文本数据
/// </summary>
void ReadTextConfig()
{
List<TextData> datas = new List<TextData>();
using (var stream = File.Open(_inputPath, FileMode.Open, FileAccess.Read))
{
using (var reader = ExcelReaderFactory.CreateReader(stream))
{
DataSet dataSet = reader.AsDataSet();
DataTable textTable = dataSet.Tables[(int)Sheet.TEXT_CONFIG];
for (int i = 1; i < textTable.Columns.Count; i++)
{
for (int j = 1; j < textTable.Rows.Count; j++)
{
TextData data = new TextData();
data.ID = j + 1;
data.Style = textTable.Rows[j][0].ToString();
data.Content = textTable.Rows[j][i].ToString();
datas.Add(data);
}
//保存数据
WriteLanuage(textTable.Rows[0][i].ToString(), datas);
datas.Clear();
}
}
}
}
/// <summary>
/// 将读取到的多语言数据写成二进制文件
/// </summary>
/// <param name="tableName"></param>
/// <param name="datas"></param>
void WriteLanuage(string tableName, List<TextData> datas)
{
using (var steam = new FileStream(_outputPath + tableName, FileMode.Create, FileAccess.Write))
{
using (var writer = new BinaryWriter(steam))
{
//先写人Count,读取的使用才知道需要几次才能读完全部数据
writer.Write(datas.Count);
foreach (var data in datas)
{
writer.Write(data.ID);
writer.