少年修仙传客户端基础资源
client_Wu Xijin
2019-02-14 69bfdba542771981367ccad20316866bee3a5599
3335 配置表读取重构.
23个文件已修改
6个文件已添加
643 ■■■■ 已修改文件
Assets/Art @ fe3619 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/Actor/ActorEditor.cs 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/Actor/ModelResourcesBuilder.cs 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/Actor/NpcResourcesBuilder.cs 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/Logo/lxj_android/Launch_1.png.meta 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/Logo/taptap.meta 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/Logo/taptap/Icon.png.meta 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/Logo/taptap/Launch_1.png.meta 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/Logo/taptap/SplashImage.png.meta 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/Logo/taptap/TB_DL_Logo.png.meta 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/Logo/xiaomi.meta 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/Logo/xjaz_zwx.meta 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/Logo/xjaz_zwx/Icon.png.meta 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/Logo/xjaz_zwx/Launch_1.png.meta 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/Logo/xjaz_zwx/SplashImage.png.meta 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/Logo/xjaz_zwx/TB_DL_Logo.png.meta 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/Logo/yilegame.meta 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/Logo/yilegame_ios.meta 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/Logo/yjgame.meta 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/ScriptEditor/NewBieGuideEditorWindow.cs 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/ScriptTemplate/ConfigDataTemplate.txt 194 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/Tool/ClientPackage.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/Tool/ConfigClassGenerate.cs 289 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/Tool/CrossServerEditorWindow.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/Tool/ExcelParseTool.cs 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/Tool/SpriteManageTool.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/Tool/TableTool.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/ResourcesOut @ 9942c5 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Scripts @ 96ac92 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Art
@@ -1 +1 @@
Subproject commit 8d2b2a8e8f55c649f60fa49c29d69aa954ffd65b
Subproject commit fe3619659ba6852500e7108e172a7d1a6890f43f
Assets/Editor/Actor/ActorEditor.cs
@@ -3,7 +3,7 @@
using System.Collections.Generic;
using UnityEditor;
using UnityEditor.Animations;
using TableConfig;
using System;
public class ActorEditor : EditorWindow
@@ -19,7 +19,7 @@
    [MenuItem("程序/角色相关/卸载NPC动画状态机")]
    static void RemoveAnimator()
    {
        var _dict = Config.Instance.GetAllValues<NPCConfig>();
        var _dict = NPCConfig.GetValues();
        int i = 0;
        foreach (var _model in _dict)
        {
@@ -75,7 +75,7 @@
    private void OnEnable()
    {
        Config.Instance.SyncLoadConfigs();
        ConfigInitiator.EditorLoad();
        m_NpcResBuilder = new NpcResourcesBuilder();
        m_ModelResBuilder = new ModelResourcesBuilder();
    }
@@ -135,7 +135,7 @@
        if (GUILayout.Button("所有翅膀", GUILayout.Height(24)))
        {
            var _dict = Config.Instance.GetAllValues<ModelResConfig>();
            var _dict = ModelResConfig.GetValues();
            foreach (var _item in _dict)
            {
                if (_item.Type == (int)E_ModelResType.Wing)
@@ -148,7 +148,7 @@
        if (GUILayout.Button("所有武器", GUILayout.Height(24)))
        {
            var _dict = Config.Instance.GetAllValues<ModelResConfig>();
            var _dict = ModelResConfig.GetValues();
            foreach (var _item in _dict)
            {
                if (_item.Type == (int)E_ModelResType.Weapon)
@@ -161,7 +161,7 @@
        if (GUILayout.Button("所有副手", GUILayout.Height(24)))
        {
            var _dict = Config.Instance.GetAllValues<ModelResConfig>();
            var _dict = ModelResConfig.GetValues();
            foreach (var _item in _dict)
            {
                if (_item.Type == (int)E_ModelResType.Secondary)
@@ -174,7 +174,7 @@
        if (GUILayout.Button("所有衣服", GUILayout.Height(24)))
        {
            var _dict = Config.Instance.GetAllValues<ModelResConfig>();
            var _dict = ModelResConfig.GetValues();
            foreach (var _item in _dict)
            {
                if (_item.Type == (int)E_ModelResType.Suit)
@@ -187,7 +187,7 @@
        if (GUILayout.Button("所有坐骑", GUILayout.Height(24)))
        {
            var _dict = Config.Instance.GetAllValues<ModelResConfig>();
            var _dict = ModelResConfig.GetValues();
            foreach (var _item in _dict)
            {
                if (_item.Type == (int)E_ModelResType.Horse)
@@ -202,7 +202,7 @@
            bool _result = EditorUtility.DisplayDialog("温馨提醒", "生成所有换装资源将会耗费比较长的时间, 请记得几点, 是否是需要生成所有的资源, 如果不是, 记得可以去掉不生成的资源,是不是不需要生成已经存在的资源, 如果不需要, 记得勾选[只生成不存在的]", "确认生成", "我按错了");
            if (_result)
            {
                var _dict = Config.Instance.GetAllValues<ModelResConfig>();
                var _dict = ModelResConfig.GetValues();
                foreach (var _item in _dict)
                {
                    m_ModelResBuilder.BuildModelRes(_item.ID, m_HighMesh);
Assets/Editor/Actor/ModelResourcesBuilder.cs
@@ -1,4 +1,4 @@
using TableConfig;

using UnityEngine;
using UnityEditor;
@@ -6,7 +6,7 @@
{
    public void BuildModelRes(int id, bool isHighMesh = false)
    {
        ModelResConfig _modelRes = Config.Instance.Get<ModelResConfig>(id);
        ModelResConfig _modelRes = ModelResConfig.Get(id);
        if (_modelRes == null)
        {
            Debug.LogWarningFormat("要生成的ModelRes资源id: {0} 并不存在于配置表中, 请确认是否填写有错.", id);
@@ -78,7 +78,7 @@
            return;
        }
        ModelResConfig _modelRes = Config.Instance.Get<ModelResConfig>(id);
        ModelResConfig _modelRes = ModelResConfig.Get(id);
        string _path = _modelRes.ResourcesName;
        string _resName = _modelRes.ResourcesName;
        if (_path.IndexOf('/') != -1)
@@ -123,7 +123,7 @@
            return;
        }
        ModelResConfig _modelRes = Config.Instance.Get<ModelResConfig>(id);
        ModelResConfig _modelRes = ModelResConfig.Get(id);
        string _path = _modelRes.ResourcesName;
        if (_path.IndexOf('/') != -1)
        {
@@ -140,7 +140,7 @@
            return;
        }
        ModelResConfig _modelRes = Config.Instance.Get<ModelResConfig>(id);
        ModelResConfig _modelRes = ModelResConfig.Get(id);
        string _path = _modelRes.ResourcesName;
        if (_path.IndexOf('/') != -1)
        {
Assets/Editor/Actor/NpcResourcesBuilder.cs
@@ -1,6 +1,6 @@
using UnityEngine;
using UnityEditor;
using TableConfig;
using System.Collections.Generic;
public class NpcResourcesBuilder : ResourcesBuilder
@@ -15,7 +15,7 @@
        BuildAnimationClip1(modelName);
        BuildAnimatorController(modelName, outName, type);
        var showConfigs = Config.Instance.GetAllValues<ActorShowConfig>();
        var showConfigs = ActorShowConfig.GetValues();
        NPCConfig _npcModel = null;
        foreach (var _item in showConfigs)
        {
@@ -25,7 +25,7 @@
                {
                    continue;
                }
                _npcModel = Config.Instance.Get<NPCConfig>(_item.showNpcs[i]);
                _npcModel = NPCConfig.Get(_item.showNpcs[i]);
                if (_npcModel == null)
                {
                    continue;
@@ -39,10 +39,10 @@
            }
        }
        var realmConfigs = Config.Instance.GetAllValues<RealmConfig>();
        var realmConfigs = RealmConfig.GetValues();
        foreach (var _realmConfig in realmConfigs)
        {
            _npcModel = Config.Instance.Get<NPCConfig>(_realmConfig.BossID);
            _npcModel = NPCConfig.Get(_realmConfig.BossID);
            if (_npcModel == null)
            {
                continue;
Assets/Editor/Logo/lxj_android/Launch_1.png.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: a752b5b922fec0a41aa168d36d58a301
guid: a130bf4f92acdc94bb1648a638ca0665
timeCreated: 1539845134
licenseType: Free
TextureImporter:
Assets/Editor/Logo/taptap.meta
New file
@@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: bf1f28310450d1a47a24a0a2257b01bb
folderAsset: yes
timeCreated: 1547689614
licenseType: Pro
DefaultImporter:
  userData:
  assetBundleName:
  assetBundleVariant:
Assets/Editor/Logo/taptap/Icon.png.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: ca863e6c93f902848bd2ca58436ea6fa
guid: 98006ca0a2e85a84c85dd6b83fea0f3c
timeCreated: 1521082299
licenseType: Pro
TextureImporter:
Assets/Editor/Logo/taptap/Launch_1.png.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: a752b5b922fec0a41aa168d36d58a301
guid: 7ef4d686c0c61f245b22948330f60977
timeCreated: 1539845134
licenseType: Free
TextureImporter:
Assets/Editor/Logo/taptap/SplashImage.png.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: e99f2730749ab0f4287df1aa1c858571
guid: eecb5a4a256afb141853738371bb60f8
timeCreated: 1520997354
licenseType: Pro
TextureImporter:
Assets/Editor/Logo/taptap/TB_DL_Logo.png.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: be6affd60e5eea74dbf7323f5224e343
guid: f45a781a0f3cced4fb4a35f382375523
timeCreated: 1530257245
licenseType: Pro
TextureImporter:
Assets/Editor/Logo/xiaomi.meta
New file
@@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: 7e804c4fb6d99a0428d4e9081242b570
folderAsset: yes
timeCreated: 1550022188
licenseType: Pro
DefaultImporter:
  userData:
  assetBundleName:
  assetBundleVariant:
Assets/Editor/Logo/xjaz_zwx.meta
New file
@@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: 6ea67ba392c12344089f59def5f8285a
folderAsset: yes
timeCreated: 1546133551
licenseType: Pro
DefaultImporter:
  userData:
  assetBundleName:
  assetBundleVariant:
Assets/Editor/Logo/xjaz_zwx/Icon.png.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 21826404ab461b84ba30618689546f57
guid: 3cb031cfcc04fb444991501b19e38786
timeCreated: 1521082299
licenseType: Pro
TextureImporter:
Assets/Editor/Logo/xjaz_zwx/Launch_1.png.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 477dea815e741ac4dad0aad4dfd5df46
guid: ac51684a0a75d574ca628e7da34a98eb
timeCreated: 1535531960
licenseType: Free
TextureImporter:
Assets/Editor/Logo/xjaz_zwx/SplashImage.png.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 0b7e1b8ad42bf914d986fd7e428ea300
guid: 46c77e16078669d4a95f6860cbb643f4
timeCreated: 1520997354
licenseType: Pro
TextureImporter:
Assets/Editor/Logo/xjaz_zwx/TB_DL_Logo.png.meta
@@ -1,5 +1,5 @@
fileFormatVersion: 2
guid: 22d3129e6346ee34ca5771b9fe3ed214
guid: d2dbe89d00dfc7243b76effa2f3d553d
timeCreated: 1533883927
licenseType: Free
TextureImporter:
Assets/Editor/Logo/yilegame.meta
New file
@@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: b263547aa92e9214e84970d12575bb9a
folderAsset: yes
timeCreated: 1550022188
licenseType: Pro
DefaultImporter:
  userData:
  assetBundleName:
  assetBundleVariant:
Assets/Editor/Logo/yilegame_ios.meta
New file
@@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: be6a70a47bdb1e443bff5e2d302dd379
folderAsset: yes
timeCreated: 1547016885
licenseType: Pro
DefaultImporter:
  userData:
  assetBundleName:
  assetBundleVariant:
Assets/Editor/Logo/yjgame.meta
New file
@@ -0,0 +1,9 @@
fileFormatVersion: 2
guid: a610b24632a37ba44a366fb1bc9292d3
folderAsset: yes
timeCreated: 1550022188
licenseType: Pro
DefaultImporter:
  userData:
  assetBundleName:
  assetBundleVariant:
Assets/Editor/ScriptEditor/NewBieGuideEditorWindow.cs
@@ -4,7 +4,7 @@
using UnityEditor;
using Snxxz.UI;
using UnityEngine.UI;
using TableConfig;
public class NewBieGuideEditorWindow : EditorWindow
{
@@ -451,10 +451,10 @@
    void DrawNewbieGuides()
    {
        if (Config.Instance.inited && newbieGuides == null)
        if (ConfigInitiator.done && newbieGuides == null)
        {
            newbieGuides = new List<NewBieGuide>();
            var guides = Config.Instance.GetAllValues<GuideConfig>();
            var guides = GuideConfig.GetValues();
            foreach (var config in guides)
            {
                if (config.Type == 1)
@@ -507,10 +507,10 @@
    void DrawFunctionalGuides()
    {
        if (Config.Instance.inited && functionalGuides == null)
        if (ConfigInitiator.done && functionalGuides == null)
        {
            functionalGuides = new List<FunctionalGuide>();
            var guides = Config.Instance.GetAllValues<GuideConfig>();
            var guides = GuideConfig.GetValues();
            foreach (var config in guides)
            {
                if (config.Type == 2)
Assets/Editor/ScriptTemplate/ConfigDataTemplate.txt
@@ -1,35 +1,195 @@
//--------------------------------------------------------
//    [Author]:            第二世界
//    [  Date ]:           #DateTime#
//    [Author]:           Fish
//    [  Date ]:           #DateTime#
//--------------------------------------------------------
using UnityEngine;
using System.Collections.Generic;
using System.IO;
using System.Threading;
using System;
using UnityEngine;
namespace TableConfig {
public partial class #ClassName#
{
    public partial class #ClassName# : ConfigBase {
    #Field#
        #Field#
    public #ClassName#()
    {
    }
        public override string getKey()
    public #ClassName#(string input)
    {
        try
        {
            return #PrimaryKey#.ToString();
            var tables = input.Split('\t');
            #Read#
        }
        catch (Exception ex)
        {
            DebugEx.Log(ex);
        }
    }
    static Dictionary<string, #ClassName#> configs = new Dictionary<string, #ClassName#>();
    public static #ClassName# Get(string id)
    {
        if (!inited)
        {
            Debug.Log("#ClassName# 还未完成初始化。");
            return null;
        }
        if (configs.ContainsKey(id))
        {
            return configs[id];
        }
        public override void Parse() {
            try
        #ClassName# config = null;
        if (rawDatas.ContainsKey(id))
        {
            config = configs[id] = new #ClassName#(rawDatas[id]);
            rawDatas.Remove(id);
        }
        return config;
    }
    public static #ClassName# Get(int id)
    {
        return Get(id.ToString());
    }
    public static List<string> GetKeys()
    {
        var keys = new List<string>();
        keys.AddRange(configs.Keys);
        keys.AddRange(rawDatas.Keys);
        return keys;
    }
    public static List<#ClassName#> GetValues()
    {
        var values = new List<#ClassName#>();
        values.AddRange(configs.Values);
        var keys = new List<string>(rawDatas.Keys);
        foreach (var key in keys)
        {
            values.Add(Get(key));
        }
        return values;
    }
    public static bool Has(string id)
    {
        return configs.ContainsKey(id) || rawDatas.ContainsKey(id);
    }
    public static bool Has(int id)
    {
        return Has(id.ToString());
    }
    public static bool inited { get; private set; }
    protected static Dictionary<string, string> rawDatas = new Dictionary<string, string>();
    public static void Init(bool sync=false)
    {
        inited = false;
        var path = string.Empty;
        if (AssetSource.refdataFromEditor)
        {
            path = ResourcesPath.CONFIG_FODLER +"/#FileName#.txt";
        }
        else
        {
            path = AssetVersionUtility.GetAssetFilePath("config/#FileName#.txt");
        }
        var tempConfig = new #ClassName#();
        var preParse = tempConfig is IConfigPostProcess;
        if (sync)
        {
            var lines = File.ReadAllLines(path);
            if (!preParse)
            {
                #Read#
                rawDatas = new Dictionary<string, string>(lines.Length - 3);
            }
            catch (Exception ex)
            for (int i = 3; i < lines.Length; i++)
            {
                DebugEx.Log(ex);
                try
                {
                    var line = lines[i];
                    var index = line.IndexOf("\t");
                    if (index == -1)
                    {
                        continue;
                    }
                    var id = line.Substring(0, index);
                    if (preParse)
                    {
                        var config = new #ClassName#(line);
                        configs[id] = config;
                        (config as IConfigPostProcess).OnConfigParseCompleted();
                    }
                    else
                    {
                        rawDatas[id] = line;
                    }
                }
                catch (System.Exception ex)
                {
                    Debug.LogError(ex);
                }
            }
        }
    }
            inited = true;
        }
        else
        {
            ThreadPool.QueueUserWorkItem((object _object) =>
            {
                var lines = File.ReadAllLines(path);
                if (!preParse)
                {
                    rawDatas = new Dictionary<string, string>(lines.Length - 3);
                }
                for (int i = 3; i < lines.Length; i++)
                {
                    try
                    {
                       var line = lines[i];
                        var index = line.IndexOf("\t");
                        if (index == -1)
                        {
                            continue;
                        }
                        var id = line.Substring(0, index);
                        if (preParse)
                        {
                            var config = new #ClassName#(line);
                            configs[id] = config;
                            (config as IConfigPostProcess).OnConfigParseCompleted();
                        }
                        else
                        {
                            rawDatas[id] = line;
                        }
                    }
                    catch (System.Exception ex)
                    {
                        Debug.LogError(ex);
                    }
                }
                inited = true;
            });
        }
    }
}
Assets/Editor/Tool/ClientPackage.cs
@@ -6,7 +6,7 @@
using System.IO;
using System.Text.RegularExpressions;
using System.Text;
using TableConfig;
using Beebyte.Obfuscator;
public class ClientPackage
@@ -169,7 +169,7 @@
        if (halfPackages.Count > 0)
        {
            Config.Instance.LoadPriorBundleConfig();
            PriorBundleConfig.Init(true);
            var fromFiles = new List<FileInfo>();
            FileExtersion.GetAllDirectoryFileInfos(_assetBundlePath, fromFiles);
Assets/Editor/Tool/ConfigClassGenerate.cs
@@ -3,32 +3,51 @@
using UnityEditor.ProjectWindowCallback;
using UnityEngine;
using UnityEditor;
using System;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;
using System;
using UnityEngine.Events;
public class CreateConfigData
public class CreateConfigClassFile
{
    public static event Action fileCreateEvent;
    const string retract1 = "\t";
    const string retract2 = "\t\t";
    const string retract3 = "\t\t\t";
    const string retract4 = "\t\t\t\t";
    const string retract5 = "\t\t\t\t\t";
    public static string primaryKey = string.Empty;
    public static event UnityAction FileCreateEvent;
    public static string filedContent = string.Empty;
    public static string readContent = string.Empty;
    public static void CreateConfigClass(FileInfo fileInfo)
    [UnityEditor.MenuItem("Assets/生成配置解析类型")]
    public static void GenerateConfigClass()
    {
        //filedContent = string.Empty;
        //var obj = _obj;
        //var name = obj.name;
        //var assetPath = AssetDatabase.GetAssetPath(obj.GetInstanceID());
        if (Selection.objects != null)
        {
            foreach (var o in Selection.objects)
            {
                var path = AssetDatabase.GetAssetPath(o.GetInstanceID());
                if (path.EndsWith(".txt") || path.EndsWith(".TXT"))
                {
                    CreateConfigClass(new FileInfo(path));
                }
            }
        //var fullName = StringUtility.Contact(Directory.GetParent(Application.dataPath), "/", assetPath);
            AssetDatabase.Refresh();
        }
    }
    public static void CreateConfigClass(FileInfo fileInfo)
    {
        var lines = File.ReadAllLines(fileInfo.FullName);
        if (lines.Length > 2) {
        if (lines.Length > 2)
        {
            var typeLine = lines[0];
            var fieldLine = lines[1];
            var types = typeLine.Split('\t');
@@ -36,121 +55,197 @@
            var min = Mathf.Min(types.Length, fields.Length);
            var fieldFulls = new List<string>();
            var readFulls = new List<string>();
            primaryKey = fields[0];
            int index = 0;
            for (int j = 0; j < min; j++) {
            for (int j = 0; j < min; j++)
            {
                var type = types[j];
                var field = fields[j];
                var fieldstring = GetField(type, field);
                var readString = GetRead(type, field, index);
                if (!string.IsNullOrEmpty(fieldstring)) {
                if (!string.IsNullOrEmpty(fieldstring))
                {
                    fieldFulls.Add(fieldstring);
                }
                if (!string.IsNullOrEmpty(readString)) {
                if (!string.IsNullOrEmpty(readString))
                {
                    index++;
                    readFulls.Add(readString);
                }
            }
            filedContent = string.Join("\r\n\t\t", fieldFulls.ToArray());
            readContent = string.Join("\r\n\t\t\t\r\n\t\t\t\t", readFulls.ToArray());
            filedContent = string.Join("\r\n\t", fieldFulls.ToArray());
            readContent = string.Join("\r\n\r\n\t\t\t", readFulls.ToArray());
            CreatNewConfigClass(fileInfo.Name.Substring(0, fileInfo.Name.IndexOf('.')));
        }
    }
    public static string GetField(string _type, string _field)
    public static string GetField(string type, string field)
    {
        _field = _field.Replace(" ", "");
        if (_type.Contains("int[]")) {
            return StringUtility.Contact("public int[] ", _field.Trim(), ";");
        field = field.Replace(" ", "");
        if (type.Contains("int[]"))
        {
            return StringUtility.Contact("public readonly int[] ", field.Trim(), ";");
        }
        else if (_type.Contains("float[]")) {
            return StringUtility.Contact("public float[] ", _field.Trim(), ";");
        else if (type.Contains("Int2[]"))
        {
            return StringUtility.Contact("public readonly Int2[] ", field.Trim(), ";");
        }
        else if (_type.Contains("string[]")) {
            return StringUtility.Contact("public string[] ", _field.Trim(), ";");
        else if (type.Contains("Int3[]"))
        {
            return StringUtility.Contact("public readonly Int3[] ", field.Trim(), ";");
        }
        else if (_type.Contains("Vector3[]")) {
            return StringUtility.Contact("public Vector3[] ", _field.Trim(), ";");
        else if (type.Contains("float[]"))
        {
            return StringUtility.Contact("public readonly float[] ", field.Trim(), ";");
        }
        else if (_type.Contains("int")) {
            return StringUtility.Contact("public int ", _field.Trim(), " { get ; private set ; }");
        else if (type.Contains("string[]"))
        {
            return StringUtility.Contact("public readonly string[] ", field.Trim(), ";");
        }
        else if(_type.Contains("long")) {
            return StringUtility.Contact("public long ", _field.Trim(), " { get ; private set ; }");
        else if (type.Contains("Vector3[]"))
        {
            return StringUtility.Contact("public readonly Vector3[] ", field.Trim(), ";");
        }
        else if (_type.Contains("float")) {
            return StringUtility.Contact("public float ", _field.Trim(), " { get ; private set; } ");
        else if (type.Contains("int"))
        {
            return StringUtility.Contact("public readonly int ", field.Trim(), ";");
        }
        else if (_type.Contains("string")) {
            return StringUtility.Contact("public string ", _field.Contains("[")? _field.Substring(0, _field.IndexOf("[")): _field, " { get ; private set; } ");
        else if (type.Contains("long"))
        {
            return StringUtility.Contact("public readonly long ", field.Trim(), ";");
        }
        else if (_type.Contains("Vector3")) {
            return StringUtility.Contact("public Vector3 ", _field.Trim(), " { get ; private set; } ");
        else if (type.Contains("float"))
        {
            return StringUtility.Contact("public readonly float ", field.Trim(), ";");
        }
        else {
        else if (type.Contains("string"))
        {
            return StringUtility.Contact("public readonly string ", field, ";");
        }
        else if (type.Contains("Vector3"))
        {
            return StringUtility.Contact("public readonly Vector3 ", field.Trim(), ";");
        }
        else if (type.Contains("bool"))
        {
            return StringUtility.Contact("public readonly bool ", field.Trim(), ";");
        }
        else if (type.Contains("Int2"))
        {
            return StringUtility.Contact("public readonly Int2 ", field.Trim(), ";");
        }
        else if (type.Contains("Int3"))
        {
            return StringUtility.Contact("public readonly Int3 ", field.Trim(), ";");
        }
        else
        {
            return string.Empty;
        }
    }
    public static string GetRead(string _type, string _field, int _index)
    public static string GetRead(string type, string field, int index)
    {
        _field = _field.Replace(" ", "");
        if (_type.Contains("int[]")) {
            var line1 = StringUtility.Contact("string[] ", _field, "StringArray", " = ", "rawContents", "[", _index, "]", ".Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);", "\n");
            var line2 = StringUtility.Contact("\t\t\t\t", _field, " = ", "new int", "[", _field, "StringArray.Length]", ";", "\n");
            var line3 = StringUtility.Contact("\t\t\t\t", "for (int i=0;i<", _field, "StringArray", ".Length", ";", "i++", ")", "\n");
            var line4 = "\t\t\t\t{\n";
            var line5 = StringUtility.Contact("\t\t\t\t\t", " int.TryParse(", _field, "StringArray", "[i]", ",", "out ", _field, "[i]", ")", ";", "\n");
            var line6 = "\t\t\t\t}";
        field = field.Replace(" ", "");
        if (type.Contains("int[]"))
        {
            var line1 = StringUtility.Contact("string[] ", field, "StringArray", " = ", "tables", "[", index, "]", ".Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);", "\n");
            var line2 = StringUtility.Contact(retract3, field, " = ", "new int", "[", field, "StringArray.Length]", ";", "\n");
            var line3 = StringUtility.Contact(retract3, "for (int i=0;i<", field, "StringArray", ".Length", ";", "i++", ")", "\n");
            var line4 = StringUtility.Contact(retract3, "{\n");
            var line5 = StringUtility.Contact(retract4, " int.TryParse(", field, "StringArray", "[i]", ",", "out ", field, "[i]", ")", ";", "\n");
            var line6 = StringUtility.Contact(retract3, "}");
            return StringUtility.Contact(line1, line2, line3, line4, line5, line6);
        }
        else if (_type.Contains("float[]")) {
            var line1 = StringUtility.Contact("string[] ", _field, "StringArray", " = ", "rawContents", "[", _index, "]", ".Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);", "\n");
            var line2 = StringUtility.Contact("\t\t\t\t", _field, " = ", "new float", "[", _field, "StringArray.Length", "]", ";", "\n");
            var line3 = StringUtility.Contact("\t\t\t\t", "for (int i=0;i<", _field, "StringArray", ".Length", ";", "i++", ")", "\n");
            var line4 = "\t\t\t\t{\n";
            var line5 = StringUtility.Contact("\t\t\t\t\t", " float.TryParse(", _field, "StringArray", "[i]", ",", "out ", _field, "[i]", ")", ";", "\n");
            var line6 = "\t\t\t\t}";
        else if (type.Contains("Int2[]"))
        {
            var line1 = StringUtility.Contact("string[] ", field, "StringArray", " = ", "tables", "[", index, "]", ".Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);", "\n");
            var line2 = StringUtility.Contact(retract3, field, " = ", "new Int2", "[", field, "StringArray.Length]", ";", "\n");
            var line3 = StringUtility.Contact(retract3, "for (int i=0;i<", field, "StringArray", ".Length", ";", "i++", ")", "\n");
            var line4 = StringUtility.Contact(retract3, "{\n");
            var line5 = StringUtility.Contact(retract4, " Int2.TryParse(", field, "StringArray", "[i]", ",", "out ", field, "[i]", ")", ";", "\n");
            var line6 = StringUtility.Contact(retract3, "}");
            return StringUtility.Contact(line1, line2, line3, line4, line5, line6);
        }
        else if (_type.Contains("string[]")) {
            var line1 = StringUtility.Contact(_field, " = ", "rawContents", "[", _index, "]", ".Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);");
        else if (type.Contains("Int3[]"))
        {
            var line1 = StringUtility.Contact("string[] ", field, "StringArray", " = ", "tables", "[", index, "]", ".Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);", "\n");
            var line2 = StringUtility.Contact(retract3, field, " = ", "new Int3", "[", field, "StringArray.Length]", ";", "\n");
            var line3 = StringUtility.Contact(retract3, "for (int i=0;i<", field, "StringArray", ".Length", ";", "i++", ")", "\n");
            var line4 = StringUtility.Contact(retract3, "{\n");
            var line5 = StringUtility.Contact(retract4, " Int3.TryParse(", field, "StringArray", "[i]", ",", "out ", field, "[i]", ")", ";", "\n");
            var line6 = StringUtility.Contact(retract3, "}");
            return StringUtility.Contact(line1, line2, line3, line4, line5, line6);
        }
        else if (type.Contains("float[]"))
        {
            var line1 = StringUtility.Contact("string[] ", field, "StringArray", " = ", "tables", "[", index, "]", ".Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);", "\n");
            var line2 = StringUtility.Contact(retract3, field, " = ", "new float", "[", field, "StringArray.Length", "]", ";", "\n");
            var line3 = StringUtility.Contact(retract3, "for (int i=0;i<", field, "StringArray", ".Length", ";", "i++", ")", "\n");
            var line4 = StringUtility.Contact(retract3, "{\n");
            var line5 = StringUtility.Contact(retract4, " float.TryParse(", field, "StringArray", "[i]", ",", "out ", field, "[i]", ")", ";", "\n");
            var line6 = StringUtility.Contact(retract3, "}");
            return StringUtility.Contact(line1, line2, line3, line4, line5, line6);
        }
        else if (type.Contains("string[]"))
        {
            var line1 = StringUtility.Contact(field, " = ", "tables", "[", index, "]", ".Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);");
            return line1;
        }
        else if (_type.Contains("Vector3[]")) {
            var line1 = StringUtility.Contact("string[] ", _field, "StringArray", " = ", "rawContents", "[", _index, "]", ".Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);", "\n");
            var line2 = StringUtility.Contact("\t\t\t\t", _field, " = ", "new Vector3", "[", _field, "StringArray.Length", "]", ";", "\n");
            var line3 = StringUtility.Contact("\t\t\t\t", "for (int i=0;i<", _field, "StringArray", ".Length", ";", "i++", ")", "\n");
            var line4 = "\t\t\t\t{\n";
            var line5 = StringUtility.Contact("\t\t\t\t\t", _field, "[i]", "=", _field, "StringArray", "[i]", ".Vector3Parse()", ";", "\n");
            var line6 = "\t\t\t\t}";
        else if (type.Contains("Vector3[]"))
        {
            var line1 = StringUtility.Contact("string[] ", field, "StringArray", " = ", "tables", "[", index, "]", ".Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);", "\n");
            var line2 = StringUtility.Contact(retract3, field, " = ", "new Vector3", "[", field, "StringArray.Length", "]", ";", "\n");
            var line3 = StringUtility.Contact(retract3, "for (int i=0;i<", field, "StringArray", ".Length", ";", "i++", ")", "\n");
            var line4 = StringUtility.Contact(retract3, "{\n");
            var line5 = StringUtility.Contact(retract4, field, "[i]", "=", field, "StringArray", "[i]", ".Vector3Parse()", ";", "\n");
            var line6 = StringUtility.Contact(retract3, "}");
            return StringUtility.Contact(line1, line2, line3, line4, line5, line6);
        }
        else if (_type.Contains("int")) {
            return StringUtility.Contact(_field, "=IsNumeric(rawContents[", _index, "]) ? ", "int.Parse(rawContents", "[", _index, "]", "):0", "; ");
        else if (type.Contains("int"))
        {
            return StringUtility.Contact("int.TryParse(tables", "[", index, "]", ",", "out ", field, ")", "; ");
        }
        else if (_type.Contains("float")) {
            return StringUtility.Contact(_field, "=IsNumeric(rawContents[", _index, "]) ? ", "float.Parse(rawContents", "[", _index, "]", "):0", "; ");
        else if (type.Contains("float"))
        {
            return StringUtility.Contact("float.TryParse(tables", "[", index, "]", ",", "out ", field, ")", "; ");
        }
        else if (_type.Contains("string")) {
            return StringUtility.Contact(_field.Contains("[") ? _field.Substring(0, _field.IndexOf("[")) : _field, " = ", "rawContents", "[", _index, "]", ".Trim()", ";");
        else if (type.Contains("string"))
        {
            return StringUtility.Contact(field, " = ", "tables", "[", index, "]", ";");
        }
        else if (_type.Contains("Vector3")) {
            return StringUtility.Contact(_field, "=", "rawContents", "[", _index, "]", ".Vector3Parse()", ";");
        else if (type.Contains("Vector3"))
        {
            return StringUtility.Contact(field, "=", "tables", "[", index, "]", ".Vector3Parse()", ";");
        }
        else {
        else if (type.Contains("bool"))
        {
            var line1 = StringUtility.Contact("var ", field, "Temp", " = 0", ";", "\n");
            var line2 = StringUtility.Contact(retract3, "int.TryParse(tables", "[", index, "]", ",", "out ", field, "Temp", ")", "; ", "\n");
            var line3 = StringUtility.Contact(retract3, field, "=", field, "Temp", "!=0", ";");
            return StringUtility.Contact(line1, line2, line3);
        }
        else if (type.Contains("Int2"))
        {
            return StringUtility.Contact("Int2.TryParse(tables", "[", index, "]", ",", "out ", field, ")", "; ");
        }
        else if (type.Contains("Int3"))
        {
            return StringUtility.Contact("Int3.TryParse(tables", "[", index, "]", ",", "out ", field, ")", "; ");
        }
        else
        {
            return string.Empty;
        }
    }
    static string configClassPath = "Assets" + "/" + "Scripts/Core/GameEngine/Model/Config";
    static string templatePath = "Assets/Editor/ScriptTemplate/ConfigDataTemplate.txt";
@@ -161,10 +256,6 @@
        AssetDatabase.DeleteAsset(newConfigPath);
        UnityEngine.Object o = CreateScriptAssetFromTemplate(newConfigPath, templatePath);
        ProjectWindowUtil.ShowCreatedAsset(o);
        if (CreateConfigData.fileCreateEvent != null) {
            CreateConfigData.fileCreateEvent();
        }
    }
    internal static UnityEngine.Object CreateScriptAssetFromTemplate(string pathName, string resourceFile)
@@ -177,9 +268,9 @@
        string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(pathName);
        text = Regex.Replace(text, "#ClassName*#", fileNameWithoutExtension);
        text = Regex.Replace(text, "#DateTime#", System.DateTime.Now.ToLongDateString());
        text = Regex.Replace(text, "#PrimaryKey#", CreateConfigData.primaryKey);
        text = Regex.Replace(text, "#Field#", CreateConfigData.filedContent);
        text = Regex.Replace(text, "#Read#", CreateConfigData.readContent);
        text = Regex.Replace(text, "#Field#", CreateConfigClassFile.filedContent);
        text = Regex.Replace(text, "#Read#", CreateConfigClassFile.readContent);
        text = Regex.Replace(text, "#FileName#", fileNameWithoutExtension.Substring(0, fileNameWithoutExtension.Length - 6));
        bool encoderShouldEmitUTF8Identifier = true;
        bool throwOnInvalidBytes = false;
@@ -191,6 +282,40 @@
        AssetDatabase.ImportAsset(pathName);
        return AssetDatabase.LoadAssetAtPath(pathName, typeof(UnityEngine.Object));
    }
    internal static void AddConfigInit(string pathName)
    {
        string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(pathName);
        string add1 = string.Format("{0}.Init();taskCount++;", fileNameWithoutExtension);
        string add2 = string.Format("completeCount += {0}.inited ? 1 : 0;", fileNameWithoutExtension);
        string path = Application.dataPath + "/Scripts/Utility/ConfigInitiator.cs";
        var text = File.ReadAllText(path);
        if (!text.Contains(add1))
        {
            text = text.Replace("//初始化结束\r\n", add1 + "\r\n" + "\t\t//初始化结束\r\n");
        }
        else
        {
            Debug.Log(fileNameWithoutExtension);
        }
        if (!text.Contains(add2))
        {
            text = text.Replace("//统计配置表解析进度\r\n", add2 + "\r\n" + "\t\t//统计配置表解析进度\r\n");
        }
        bool encoderShouldEmitUTF8Identifier = true;
        bool throwOnInvalidBytes = false;
        UTF8Encoding encoding = new UTF8Encoding(encoderShouldEmitUTF8Identifier, throwOnInvalidBytes);
        bool append = false;
        StreamWriter streamWriter = new StreamWriter(path, append, encoding);
        streamWriter.Write(text);
        streamWriter.Close();
        AssetDatabase.ImportAsset(path);
    }
}
Assets/Editor/Tool/CrossServerEditorWindow.cs
@@ -7,7 +7,7 @@
using System.Net.Sockets;
using System.Threading;
using UnityEditor;
using TableConfig;
public class CrossServerTest : EditorWindow
{
@@ -134,7 +134,7 @@
        }
        var mapId = PlayerDatas.Instance.baseData.MapID;
        var config = Config.Instance.Get<MapConfig>(mapId);
        var config = MapConfig.Get(mapId);
        if (config == null)
        {
            return;
Assets/Editor/Tool/ExcelParseTool.cs
@@ -5,7 +5,7 @@
using System.Text;
using System;
using System.Text.RegularExpressions;
using TableConfig;
public class ExcelParseTool : EditorWindow
{
@@ -51,11 +51,11 @@
        if (GUILayout.Button("解析"))
        {
            m_Englishs.Clear();
            Config.Instance.SyncLoadConfigs();
            ConfigInitiator.EditorLoad();
            m_FitterKeys.Clear();
            m_FitterKeys.AddRange(Config.Instance.GetAllKeys<LanguageConfig>());
            m_FitterKeys.AddRange(Config.Instance.GetAllKeys<SysInfoConfig>());
            m_FitterKeys.AddRange(Config.Instance.GetAllKeys<IconConfig>());
            m_FitterKeys.AddRange(LanguageConfig.GetKeys());
            m_FitterKeys.AddRange(SysInfoConfig.GetKeys());
            m_FitterKeys.AddRange(IconConfig.GetKeys());
            FindEnglishLabel();
        }
@@ -84,11 +84,11 @@
            {
                DebugEx.LogError(e.ToString());
            }
            Config.Instance.SyncLoadConfigs();
            ConfigInitiator.EditorLoad();
            m_FitterKeys.Clear();
            m_FitterKeys.AddRange(Config.Instance.GetAllKeys<LanguageConfig>());
            m_FitterKeys.AddRange(Config.Instance.GetAllKeys<SysInfoConfig>());
            m_FitterKeys.AddRange(Config.Instance.GetAllKeys<IconConfig>());
            m_FitterKeys.AddRange(LanguageConfig.GetKeys());
            m_FitterKeys.AddRange(SysInfoConfig.GetKeys());
            m_FitterKeys.AddRange(IconConfig.GetKeys());
            FindEnglishLabel(true);
        }
    }
Assets/Editor/Tool/SpriteManageTool.cs
@@ -6,7 +6,7 @@
using System.Reflection;
using System.Text;
using System.Text.RegularExpressions;
using TableConfig;
using UnityEditor;
using UnityEngine;
using UnityEngine.UI;
@@ -125,8 +125,8 @@
    private void OnEnable()
    {
        Config.Instance.SyncLoadConfigs();
        m_IconCfgs = Config.Instance.GetAllValues<IconConfig>();
        ConfigInitiator.EditorLoad();
        m_IconCfgs = IconConfig.GetValues();
        m_DeleteTexture = EditorGUIUtility.FindTexture("TreeEditor.Trash");
        InitStyle();
Assets/Editor/Tool/TableTool.cs
@@ -262,7 +262,7 @@
            }
            FileStream fileStream = _tableNameLst[i].fileInfo.OpenRead();
            StreamReader sr = new StreamReader(fileStream, Encoding.Default);
            CreateConfigData.CreateConfigClass(_tableNameLst[i].fileInfo);
            CreateConfigClassFile.CreateConfigClass(_tableNameLst[i].fileInfo);
            sr.Dispose();
            sr.Close();
        }
Assets/ResourcesOut
@@ -1 +1 @@
Subproject commit fc8c1cd26a32d339cc975a36ffe87be8eac18fc2
Subproject commit 9942c53318c89f9d2339087321a9e81d3e90d59e
Assets/Scripts
@@ -1 +1 @@
Subproject commit d5bf165ef28b530ed531aed097ad301278c5fcae
Subproject commit 96ac92ee89919defe74e9a4bc981dbf328c8d476