[编程工具]UnityGameFramework配表多语言导出工具(零)使用概述以及源码

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);
            }
        }
    }
}

猜你喜欢

转载自blog.csdn.net/Blue_carrot_/article/details/130280639
今日推荐