三国卡牌客户端基础资源仓库
hch
8 天以前 fcce9ab0e54e4580569ba4ed5be0f4e3ba4d37fa
0312 优化字符串拼接 - 改名
20个文件已修改
522 ■■■■■ 已修改文件
Assets/Editor/AssetBundleBrowser/AssetBundleBuildTab.cs 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/ConfigGen/ConfigClassGenerate.cs 130 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/Tool/AssetBundleBuildExtersion.cs 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/Tool/AssetBundleBuildTool.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/Tool/AssetsVersionCmpMaker.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/Tool/AssetsVersionMaker.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/Tool/BuildExtersion.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/Tool/BytesVersionMaker.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/Tool/ClientPackage.cs 62 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/Tool/ClientPackage_Standalone.cs 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/Tool/SpriteManageTool.cs 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/Tool/UpdateSpritePackingSetting.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/Web/NetPkgTool.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Launch/Common/AssetVersion.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Launch/Common/DownLoadAndDiscompressTask.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Launch/Common/FileExtersion.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Launch/Launch.cs 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Launch/Manager/LocalResManager.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Launch/UI/LaunchWins/LaunchExWin.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Launch/Utility/StringUtility.cs 199 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/AssetBundleBrowser/AssetBundleBuildTab.cs
@@ -37,12 +37,12 @@
                switch (m_UserData.m_BuildTarget)
                {
                    case ValidBuildTarget.Android:
                        return StringUtility.Contact("Assets/StreamingAssets", "/android");
                        return StringUtility.Concat("Assets/StreamingAssets", "/android");
                    case ValidBuildTarget.iOS:
                        return StringUtility.Contact("Assets/StreamingAssets", "/ios");
                        return StringUtility.Concat("Assets/StreamingAssets", "/ios");
                    case ValidBuildTarget.StandaloneWindows:
                    case ValidBuildTarget.StandaloneWindows64:
                        return StringUtility.Contact("Assets/StreamingAssets", "/standalone");
                        return StringUtility.Concat("Assets/StreamingAssets", "/standalone");
                    default:
                        return "Assets/StreamingAssets";
                }
@@ -680,7 +680,7 @@
        {
            UpdateScriptableObjectsSetting.SetAllScriptableObjectAssetBundleName();
            ExcuteBuildAsset("config");
            TableTool.CopyConfigsToOutPutPath(StringUtility.Contact(m_UserData.m_OutputPath, "/config"));
            TableTool.CopyConfigsToOutPutPath(StringUtility.Concat(m_UserData.m_OutputPath, "/config"));
            Debug.Log("config 处理完成");
        }
        //发包时获取热更dll和裁剪AOT
@@ -690,7 +690,7 @@
            PrebuildCommand.GenerateAll();
            // 输出到AssetBundles目录
            var outputPath = Application.dataPath.Replace("Assets", m_UserData.m_OutputPath);
            outputPath = StringUtility.Contact(outputPath, "/logicbytes");
            outputPath = StringUtility.Concat(outputPath, "/logicbytes");
            if (Directory.Exists(outputPath))
                Directory.Delete(outputPath, true);
            //复制新生成的AOT dll到指定路径
@@ -712,7 +712,7 @@
            }
            // 输出到AssetBundles目录
            var outputPath = Application.dataPath.Replace("Assets", m_UserData.m_OutputPath);
            outputPath = StringUtility.Contact(outputPath, "/logicbytes");
            outputPath = StringUtility.Concat(outputPath, "/logicbytes");
            CopyHotUpdateDll(outputPath);
            MakeBytesVersionFile();
            AssetDatabase.Refresh();
@@ -721,7 +721,7 @@
        private void MakeBytesVersionFile()
        {
            var fileInfos = new List<FileInfo>();
            FileExtersion.GetAllDirectoryFileInfos(StringUtility.Contact(m_UserData.m_OutputPath, "/logicbytes"), fileInfos);
            FileExtersion.GetAllDirectoryFileInfos(StringUtility.Concat(m_UserData.m_OutputPath, "/logicbytes"), fileInfos);
            BytesVersionMaker.WriteAssetsVersionFile(Path.Combine(Directory.GetParent(Application.dataPath).FullName, m_UserData.m_OutputPath), fileInfos);
            Debug.Log("热更新代码更新完毕,生成md5文件");
        }
@@ -738,7 +738,7 @@
            //HybridCLR Settings面板上设置的裁减后AOT dll输出根目录
            string strippedAOTDllOutputRootDir = "/" + HybridCLRSettings.Instance.strippedAOTDllOutputRootDir;
            //重新生成的AOT所在路径
            string aotDir = StringUtility.Contact(rootDir, strippedAOTDllOutputRootDir, platformName);
            string aotDir = StringUtility.Concat(rootDir, strippedAOTDllOutputRootDir, platformName);
            if (Directory.Exists(checkAotDir))
            {
@@ -750,7 +750,7 @@
            for (int i = 0; i < AOTGenericReferences.PatchedAOTAssemblyList.Count; i++)
            {
                string dllFile = StringUtility.Contact(aotDir, AOTGenericReferences.PatchedAOTAssemblyList[i]);
                string dllFile = StringUtility.Concat(aotDir, AOTGenericReferences.PatchedAOTAssemblyList[i]);
                var outDllFile = outputPath + "/" + AOTGenericReferences.PatchedAOTAssemblyList[i] + ".bytes";
                if (!File.Exists(dllFile))
                {
@@ -774,7 +774,7 @@
            //HybridCLR Settings面板上设置的热更新dll编译输出根目录
            string hotUpdateDllCompileOutputRootDir = "/" + HybridCLRSettings.Instance.hotUpdateDllCompileOutputRootDir;
            //热更DLL生成目录
            string hotDllDir = StringUtility.Contact(rootDir, hotUpdateDllCompileOutputRootDir, platformName);
            string hotDllDir = StringUtility.Concat(rootDir, hotUpdateDllCompileOutputRootDir, platformName);
            //HybridCLR的Settings面板上设置的热更新Assembly Definitions 资源
            var assemblyDefinitionAsset = HybridCLRSettings.Instance.hotUpdateAssemblyDefinitions;
            for (int i = 0; i < assemblyDefinitionAsset.Length; i++)
@@ -782,7 +782,7 @@
                string assemblyPath = AssetDatabase.GetAssetPath(assemblyDefinitionAsset[i]);
                string assemblyName = Path.GetFileNameWithoutExtension(assemblyPath);
                string dllFile = StringUtility.Contact(hotDllDir, assemblyName, ".dll");
                string dllFile = StringUtility.Concat(hotDllDir, assemblyName, ".dll");
                var outDllFile = outputPath + "/" + assemblyName + ".dll.bytes";
                if (!File.Exists(dllFile))
                {
@@ -798,7 +798,7 @@
            string[] hotUpdateAssemblies = HybridCLRSettings.Instance.hotUpdateAssemblies;
            for (int i = 0; i < hotUpdateAssemblies.Length; i++)
            {
                string dllFile = StringUtility.Contact(hotDllDir, hotUpdateAssemblies[i], ".dll");
                string dllFile = StringUtility.Concat(hotDllDir, hotUpdateAssemblies[i], ".dll");
                var outDllFile = outputPath + "/" + hotUpdateAssemblies[i] + ".dll.bytes";
                if (!File.Exists(dllFile))
                {
@@ -814,7 +814,7 @@
            string[] preserveHotUpdateAssemblies = HybridCLRSettings.Instance.preserveHotUpdateAssemblies;
            for (int i = 0; i < preserveHotUpdateAssemblies.Length; i++)
            {
                string dllFile = StringUtility.Contact(hotDllDir, preserveHotUpdateAssemblies[i], ".dll");
                string dllFile = StringUtility.Concat(hotDllDir, preserveHotUpdateAssemblies[i], ".dll");
                var outDllFile = outputPath + "/" + preserveHotUpdateAssemblies[i] + ".dll.bytes";
                if (!File.Exists(dllFile))
                {
@@ -1067,7 +1067,7 @@
        private void ExecuteSwitchVersionConfig()
        {
            var newVersionConfigPath = StringUtility.Contact("Assets/Resources/ScriptableObject/Config/VersionConfig", ".asset");
            var newVersionConfigPath = StringUtility.Concat("Assets/Resources/ScriptableObject/Config/VersionConfig", ".asset");
            var versionsFilePath = Application.dataPath + Path.DirectorySeparatorChar + "Editor/VersionConfigs/Versions.txt";
            var lines = File.ReadAllLines(versionsFilePath);
Assets/Editor/ConfigGen/ConfigClassGenerate.cs
@@ -95,79 +95,79 @@
        field = field.Replace(" ", "");
        if (type.Contains("Dictionary<int, int[][]>"))
        {
            return StringUtility.Contact("public Dictionary<int, int[][]> ", field.Trim(), ";");
            return StringUtility.Concat("public Dictionary<int, int[][]> ", field.Trim(), ";");
        }
        else if (type.Contains("int[][]"))
        {
            return StringUtility.Contact("public int[][] ", field.Trim(), ";");
            return StringUtility.Concat("public int[][] ", field.Trim(), ";");
        }
        else if (type.Contains("Dictionary<int, int>"))
        {
            return StringUtility.Contact("public Dictionary<int, int> ", field.Trim(), ";");
            return StringUtility.Concat("public Dictionary<int, int> ", field.Trim(), ";");
        }
        else if (type.Contains("Dictionary<int, int[]>"))
        {
            return StringUtility.Contact("public Dictionary<int, int[]> ", field.Trim(), ";");
            return StringUtility.Concat("public Dictionary<int, int[]> ", field.Trim(), ";");
        }
        else if (type.Contains("float[][]"))
        {
            return StringUtility.Contact("public float[][] ", field.Trim(), ";");
            return StringUtility.Concat("public float[][] ", field.Trim(), ";");
        }
        else if (type.Contains("int[]"))
        {
            return StringUtility.Contact("public int[] ", field.Trim(), ";");
            return StringUtility.Concat("public int[] ", field.Trim(), ";");
        }
        else if (type.Contains("Int2[]"))
        {
            return StringUtility.Contact("public Int2[] ", field.Trim(), ";");
            return StringUtility.Concat("public Int2[] ", field.Trim(), ";");
        }
        else if (type.Contains("Int3[]"))
        {
            return StringUtility.Contact("public Int3[] ", field.Trim(), ";");
            return StringUtility.Concat("public Int3[] ", field.Trim(), ";");
        }
        else if (type.Contains("float[]"))
        {
            return StringUtility.Contact("public float[] ", field.Trim(), ";");
            return StringUtility.Concat("public float[] ", field.Trim(), ";");
        }
        else if (type.Contains("string[]"))
        {
            return StringUtility.Contact("public string[] ", field.Trim(), ";");
            return StringUtility.Concat("public string[] ", field.Trim(), ";");
        }
        else if (type.Contains("Vector3[]"))
        {
            return StringUtility.Contact("public Vector3[] ", field.Trim(), ";");
            return StringUtility.Concat("public Vector3[] ", field.Trim(), ";");
        }
        else if (type.Contains("int"))
        {
            return StringUtility.Contact("public int ", field.Trim(), ";");
            return StringUtility.Concat("public int ", field.Trim(), ";");
        }
        else if (type.Contains("long"))
        {
            return StringUtility.Contact("public long ", field.Trim(), ";");
            return StringUtility.Concat("public long ", field.Trim(), ";");
        }
        else if (type.Contains("float"))
        {
            return StringUtility.Contact("public float ", field.Trim(), ";");
            return StringUtility.Concat("public float ", field.Trim(), ";");
        }
        else if (type.Contains("string"))
        {
            return StringUtility.Contact("public string ", field, ";");
            return StringUtility.Concat("public string ", field, ";");
        }
        else if (type.Contains("Vector3"))
        {
            return StringUtility.Contact("public Vector3 ", field.Trim(), ";");
            return StringUtility.Concat("public Vector3 ", field.Trim(), ";");
        }
        else if (type.Contains("bool"))
        {
            return StringUtility.Contact("public bool ", field.Trim(), ";");
            return StringUtility.Concat("public bool ", field.Trim(), ";");
        }
        else if (type.Contains("Int2"))
        {
            return StringUtility.Contact("public Int2 ", field.Trim(), ";");
            return StringUtility.Concat("public Int2 ", field.Trim(), ";");
        }
        else if (type.Contains("Int3"))
        {
            return StringUtility.Contact("public Int3 ", field.Trim(), ";");
            return StringUtility.Concat("public Int3 ", field.Trim(), ";");
        }
        else
        {
@@ -203,11 +203,11 @@
        }
        // else if (type.Contains("Int2[]"))
        // {
        //     return StringUtility.Contact("public Int2[] ", field.Trim(), ";");
        //     return StringUtility.Concat("public Int2[] ", field.Trim(), ";");
        // }
        // else if (type.Contains("Int3[]"))
        // {
        //     return StringUtility.Contact("public Int3[] ", field.Trim(), ";");
        //     return StringUtility.Concat("public Int3[] ", field.Trim(), ";");
        // }
        else if (type.Contains("float[]"))
        {
@@ -247,11 +247,11 @@
        }
        // else if (type.Contains("Int2"))
        // {
        //     return StringUtility.Contact("public Int2 ", field.Trim(), ";");
        //     return StringUtility.Concat("public Int2 ", field.Trim(), ";");
        // }
        // else if (type.Contains("Int3"))
        // {
        //     return StringUtility.Contact("public Int3 ", field.Trim(), ";");
        //     return StringUtility.Concat("public Int3 ", field.Trim(), ";");
        // }
        else
        {
@@ -265,79 +265,79 @@
        field = field.Replace(" ", "");
        if (type.Contains("Dictionary<int, int[][]>"))
        {
            return StringUtility.Contact("public Dictionary<int, int[][]> ", field.Trim(), ";");
            return StringUtility.Concat("public Dictionary<int, int[][]> ", field.Trim(), ";");
        }
        else if (type.Contains("int[][]"))
        {
            return StringUtility.Contact("public int[][] ", field.Trim(), ";");
            return StringUtility.Concat("public int[][] ", field.Trim(), ";");
        }
        else if (type.Contains("Dictionary<int, int>"))
        {
            return StringUtility.Contact("public Dictionary<int, int> ", field.Trim(), ";");
            return StringUtility.Concat("public Dictionary<int, int> ", field.Trim(), ";");
        }
        else if (type.Contains("Dictionary<int, int[]>"))
        {
            return StringUtility.Contact("public Dictionary<int, int[]> ", field.Trim(), ";");
            return StringUtility.Concat("public Dictionary<int, int[]> ", field.Trim(), ";");
        }
        else if (type.Contains("float[][]"))
        {
            return StringUtility.Contact("public float[][] ", field.Trim(), ";");
            return StringUtility.Concat("public float[][] ", field.Trim(), ";");
        }
        else if (type.Contains("int[]"))
        {
            return StringUtility.Contact("public int[] ", field.Trim(), ";");
            return StringUtility.Concat("public int[] ", field.Trim(), ";");
        }
        else if (type.Contains("Int2[]"))
        {
            return StringUtility.Contact("public Int2[] ", field.Trim(), ";");
            return StringUtility.Concat("public Int2[] ", field.Trim(), ";");
        }
        else if (type.Contains("Int3[]"))
        {
            return StringUtility.Contact("public Int3[] ", field.Trim(), ";");
            return StringUtility.Concat("public Int3[] ", field.Trim(), ";");
        }
        else if (type.Contains("float[]"))
        {
            return StringUtility.Contact("public float[] ", field.Trim(), ";");
            return StringUtility.Concat("public float[] ", field.Trim(), ";");
        }
        else if (type.Contains("string[]"))
        {
            return StringUtility.Contact("public string[] ", field.Trim(), ";");
            return StringUtility.Concat("public string[] ", field.Trim(), ";");
        }
        else if (type.Contains("Vector3[]"))
        {
            return StringUtility.Contact("public Vector3[] ", field.Trim(), ";");
            return StringUtility.Concat("public Vector3[] ", field.Trim(), ";");
        }
        else if (type.Contains("int"))
        {
            return StringUtility.Contact("public int ", field.Trim(), ";");
            return StringUtility.Concat("public int ", field.Trim(), ";");
        }
        else if (type.Contains("long"))
        {
            return StringUtility.Contact("public long ", field.Trim(), ";");
            return StringUtility.Concat("public long ", field.Trim(), ";");
        }
        else if (type.Contains("float"))
        {
            return StringUtility.Contact("public float ", field.Trim(), ";");
            return StringUtility.Concat("public float ", field.Trim(), ";");
        }
        else if (type.Contains("string"))
        {
            return StringUtility.Contact("public string ", field, ";");
            return StringUtility.Concat("public string ", field, ";");
        }
        else if (type.Contains("Vector3"))
        {
            return StringUtility.Contact("public Vector3 ", field.Trim(), ";");
            return StringUtility.Concat("public Vector3 ", field.Trim(), ";");
        }
        else if (type.Contains("bool"))
        {
            return StringUtility.Contact("public bool ", field.Trim(), ";");
            return StringUtility.Concat("public bool ", field.Trim(), ";");
        }
        else if (type.Contains("Int2"))
        {
            return StringUtility.Contact("public Int2 ", field.Trim(), ";");
            return StringUtility.Concat("public Int2 ", field.Trim(), ";");
        }
        else if (type.Contains("Int3"))
        {
            return StringUtility.Contact("public Int3 ", field.Trim(), ";");
            return StringUtility.Concat("public Int3 ", field.Trim(), ";");
        }
        else
        {
@@ -371,19 +371,19 @@
        }
        else if (type.Contains("int[]"))
        {
            var line0 = StringUtility.Contact("if (tables", "[", index.ToString(), "].Contains(\"[\"))\n");
            var line0_1 = StringUtility.Contact(retract3, "{\n");
            var line0 = StringUtility.Concat("if (tables", "[", index.ToString(), "].Contains(\"[\"))\n");
            var line0_1 = StringUtility.Concat(retract3, "{\n");
            var line0_2 = StringUtility.Concat(retract4, field, " = JsonMapper.ToObject<int[]>(tables", "[", index.ToString(), "]);\n");
            var line0_3 = StringUtility.Contact(retract3, "}\n");
            var line0_4 = StringUtility.Contact(retract3, "else\n");
            var line0_5 = StringUtility.Contact(retract3, "{\n");
            var line0_3 = StringUtility.Concat(retract3, "}\n");
            var line0_4 = StringUtility.Concat(retract3, "else\n");
            var line0_5 = StringUtility.Concat(retract3, "{\n");
            var line1 = StringUtility.Concat(retract4, "string[] ", field, "StringArray", " = ", "tables", "[", index.ToString(), "]", ".Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);", "\n");
            var line2 = StringUtility.Concat(retract4, field, " = ", "new int", "[", field, "StringArray.Length]", ";", "\n");
            var line3 = StringUtility.Concat(retract4, "for (int i=0;i<", field, "StringArray", ".Length", ";", "i++", ")", "\n");
            var line4 = StringUtility.Contact(retract4, "{\n");
            var line4 = StringUtility.Concat(retract4, "{\n");
            var line5 = StringUtility.Concat(retract5, " int.TryParse(", field, "StringArray", "[i]", ",", "out ", field, "[i]", ")", ";", "\n");
            var line6 = StringUtility.Contact(retract4, "}\n");
            var line0_6 = StringUtility.Contact(retract3, "}");
            var line6 = StringUtility.Concat(retract4, "}\n");
            var line0_6 = StringUtility.Concat(retract3, "}");
            return StringUtility.Concat(line0, line0_1, line0_2, line0_3, line0_4, line0_5, line1, line2, line3, line4, line5, line6, line0_6);
        }
@@ -392,9 +392,9 @@
            var line1 = StringUtility.Concat("string[] ", field, "StringArray", " = ", "tables", "[", index.ToString(), "]", ".Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);", "\n");
            var line2 = StringUtility.Concat(retract3, field, " = ", "new Int2", "[", field, "StringArray.Length]", ";", "\n");
            var line3 = StringUtility.Concat(retract3, "for (int i=0;i<", field, "StringArray", ".Length", ";", "i++", ")", "\n");
            var line4 = StringUtility.Contact(retract3, "{\n");
            var line4 = StringUtility.Concat(retract3, "{\n");
            var line5 = StringUtility.Concat(retract4, " Int2.TryParse(", field, "StringArray", "[i]", ",", "out ", field, "[i]", ")", ";", "\n");
            var line6 = StringUtility.Contact(retract3, "}");
            var line6 = StringUtility.Concat(retract3, "}");
            return StringUtility.Concat(line1, line2, line3, line4, line5, line6);
        }
@@ -403,27 +403,27 @@
            var line1 = StringUtility.Concat("string[] ", field, "StringArray", " = ", "tables", "[", index.ToString(), "]", ".Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);", "\n");
            var line2 = StringUtility.Concat(retract3, field, " = ", "new Int3", "[", field, "StringArray.Length]", ";", "\n");
            var line3 = StringUtility.Concat(retract3, "for (int i=0;i<", field, "StringArray", ".Length", ";", "i++", ")", "\n");
            var line4 = StringUtility.Contact(retract3, "{\n");
            var line4 = StringUtility.Concat(retract3, "{\n");
            var line5 = StringUtility.Concat(retract4, " Int3.TryParse(", field, "StringArray", "[i]", ",", "out ", field, "[i]", ")", ";", "\n");
            var line6 = StringUtility.Contact(retract3, "}");
            var line6 = StringUtility.Concat(retract3, "}");
            return StringUtility.Concat(line1, line2, line3, line4, line5, line6);
        }
        else if (type.Contains("float[]"))
        {
            var line0 = StringUtility.Contact("if (tables", "[", index.ToString(), "].Contains(\"[\"))\n");
            var line0_1 = StringUtility.Contact(retract3, "{\n");
            var line0 = StringUtility.Concat("if (tables", "[", index.ToString(), "].Contains(\"[\"))\n");
            var line0_1 = StringUtility.Concat(retract3, "{\n");
            var line0_2 = StringUtility.Concat(retract4, field, " = JsonMapper.ToObject<float[]>(tables", "[", index.ToString(), "]);\n");
            var line0_3 = StringUtility.Contact(retract3, "}\n");
            var line0_4 = StringUtility.Contact(retract3, "else\n");
            var line0_5 = StringUtility.Contact(retract3, "{\n");
            var line0_3 = StringUtility.Concat(retract3, "}\n");
            var line0_4 = StringUtility.Concat(retract3, "else\n");
            var line0_5 = StringUtility.Concat(retract3, "{\n");
            var line1 = StringUtility.Concat(retract4, "string[] ", field, "StringArray", " = ", "tables", "[", index.ToString(), "]", ".Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);", "\n");
            var line2 = StringUtility.Concat(retract4, field, " = ", "new float", "[", field, "StringArray.Length", "]", ";", "\n");
            var line3 = StringUtility.Concat(retract4, "for (int i=0;i<", field, "StringArray", ".Length", ";", "i++", ")", "\n");
            var line4 = StringUtility.Contact(retract4, "{\n");
            var line4 = StringUtility.Concat(retract4, "{\n");
            var line5 = StringUtility.Concat(retract5, " float.TryParse(", field, "StringArray", "[i]", ",", "out ", field, "[i]", ")", ";", "\n");
            var line6 = StringUtility.Contact(retract4, "}\n");
            var line0_6 = StringUtility.Contact(retract3, "}");
            var line6 = StringUtility.Concat(retract4, "}\n");
            var line0_6 = StringUtility.Concat(retract3, "}");
            return StringUtility.Concat(line0, line0_1, line0_2, line0_3, line0_4, line0_5, line1, line2, line3, line4, line5, line6, line0_6);
        }
@@ -437,9 +437,9 @@
            var line1 = StringUtility.Concat("string[] ", field, "StringArray", " = ", "tables", "[", index.ToString(), "]", ".Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);", "\n");
            var line2 = StringUtility.Concat(retract3, field, " = ", "new Vector3", "[", field, "StringArray.Length", "]", ";", "\n");
            var line3 = StringUtility.Concat(retract3, "for (int i=0;i<", field, "StringArray", ".Length", ";", "i++", ")", "\n");
            var line4 = StringUtility.Contact(retract3, "{\n");
            var line4 = StringUtility.Concat(retract3, "{\n");
            var line5 = StringUtility.Concat(retract4, field, "[i]", "=", field, "StringArray", "[i]", ".Vector3Parse()", ";", "\n");
            var line6 = StringUtility.Contact(retract3, "}");
            var line6 = StringUtility.Concat(retract3, "}");
            return StringUtility.Concat(line1, line2, line3, line4, line5, line6);
        }
@@ -468,7 +468,7 @@
            var line1 = StringUtility.Concat("var ", field, "Temp", " = 0", ";", "\n");
            var line2 = StringUtility.Concat(retract3, "int.TryParse(tables", "[", index.ToString(), "]", ",", "out ", field, "Temp", ")", "; ", "\n");
            var line3 = StringUtility.Concat(retract3, field, "=", field, "Temp", "!=0", ";");
            return StringUtility.Contact(line1, line2, line3);
            return StringUtility.Concat(line1, line2, line3);
        }
        else if (type.Contains("Int2"))
        {
Assets/Editor/Tool/AssetBundleBuildExtersion.cs
@@ -47,11 +47,11 @@
            assets.Add(assetBundleBuild);
        }
        var rootPath = StringUtility.Contact(output, Path.AltDirectorySeparatorChar.ToString(), category);
        var mainFile = StringUtility.Contact(output, Path.AltDirectorySeparatorChar.ToString(), GetMainFestFileName(buildTarget));//改名字前
        var mainFileRename = StringUtility.Contact(output, Path.AltDirectorySeparatorChar.ToString(), AssetVersionUtility.EncodeFileName(category), "_assetbundle");//改名字后
        var manifest = StringUtility.Contact(output, Path.AltDirectorySeparatorChar.ToString(), GetMainFestFileName(buildTarget), ".manifest");
        var manifestRename = StringUtility.Contact(output, Path.AltDirectorySeparatorChar.ToString(), AssetVersionUtility.EncodeFileName(category), "_assetbundle.manifest");
        var rootPath = StringUtility.Concat(output, Path.AltDirectorySeparatorChar.ToString(), category);
        var mainFile = StringUtility.Concat(output, Path.AltDirectorySeparatorChar.ToString(), GetMainFestFileName(buildTarget));//改名字前
        var mainFileRename = StringUtility.Concat(output, Path.AltDirectorySeparatorChar.ToString(), AssetVersionUtility.EncodeFileName(category), "_assetbundle");//改名字后
        var manifest = StringUtility.Concat(output, Path.AltDirectorySeparatorChar.ToString(), GetMainFestFileName(buildTarget), ".manifest");
        var manifestRename = StringUtility.Concat(output, Path.AltDirectorySeparatorChar.ToString(), AssetVersionUtility.EncodeFileName(category), "_assetbundle.manifest");
        if (rebuild && Directory.Exists(rootPath))
            Directory.Delete(rootPath, true);
Assets/Editor/Tool/AssetBundleBuildTool.cs
@@ -13,8 +13,8 @@
    //     {
    //         BuildAssetBundleOptions opt = BuildAssetBundleOptions.ChunkBasedCompression | BuildAssetBundleOptions.DeterministicAssetBundle | BuildAssetBundleOptions.StrictMode;
    //         string outputPath = StringUtility.Contact(System.Environment.CurrentDirectory, "/AssetBundles/", EditorUserBuildSettings.activeBuildTarget.ToString());
    //         string streamingPath = StringUtility.Contact(Application.streamingAssetsPath, Path.AltDirectorySeparatorChar, EditorUserBuildSettings.activeBuildTarget.ToString());
    //         string outputPath = StringUtility.Concat(System.Environment.CurrentDirectory, "/AssetBundles/", EditorUserBuildSettings.activeBuildTarget.ToString());
    //         string streamingPath = StringUtility.Concat(Application.streamingAssetsPath, Path.AltDirectorySeparatorChar, EditorUserBuildSettings.activeBuildTarget.ToString());
    //         if (!Directory.Exists(outputPath))
    //             Directory.CreateDirectory(outputPath);
@@ -26,7 +26,7 @@
    //         AssetBundleBuildExtersion.Build(outputPath, "mobeffectshader", opt, EditorUserBuildSettings.activeBuildTarget, false);
    //         AssetBundleBuildExtersion.Build(outputPath, "config", opt, EditorUserBuildSettings.activeBuildTarget, false);
    //         TableTool.CopyConfigsToOutPutPath(StringUtility.Contact(outputPath, "/config"));
    //         TableTool.CopyConfigsToOutPutPath(StringUtility.Concat(outputPath, "/config"));
    //         LuaBuildHelper.OnPreBuild();
    //         UpdateLuaSetting.SetAllLuaAssetBundleName();
Assets/Editor/Tool/AssetsVersionCmpMaker.cs
@@ -51,7 +51,7 @@
            lines.Add(StringUtility.Concat(relativePath, "\t", extersion, "\t", fileSize.ToString(), "\t", md5));
        }
        var assetVersionFile = StringUtility.Contact(Application.dataPath, "/Resources/AssetsVersionCmp.txt");
        var assetVersionFile = StringUtility.Concat(Application.dataPath, "/Resources/AssetsVersionCmp.txt");
        if (File.Exists(assetVersionFile))
        {
            File.Delete(assetVersionFile);
Assets/Editor/Tool/AssetsVersionMaker.cs
@@ -42,13 +42,13 @@
            lines.Add(StringUtility.Concat(relativePath, "\t", extersion, "\t", fileSize.ToString(), "\t", md5));
        }
        var assetVersionFile = StringUtility.Contact(_path, Path.DirectorySeparatorChar.ToString(), "AssetsVersion.txt");
        var assetVersionFile = StringUtility.Concat(_path, Path.DirectorySeparatorChar.ToString(), "AssetsVersion.txt");
        if (File.Exists(assetVersionFile))
        {
            File.Delete(assetVersionFile);
        }
        File.WriteAllText(StringUtility.Contact(_path, Path.DirectorySeparatorChar.ToString(), "AssetsVersion.txt"), string.Join(FileExtersion.lineSplit, lines.ToArray()));
        File.WriteAllText(StringUtility.Concat(_path, Path.DirectorySeparatorChar.ToString(), "AssetsVersion.txt"), string.Join(FileExtersion.lineSplit, lines.ToArray()));
    }
}
Assets/Editor/Tool/BuildExtersion.cs
@@ -89,7 +89,7 @@
            if (!buildParameters.error)
            {
                ExcuteBuildAsset("config", buildParameters);
                TableTool.CopyConfigsToOutPutPath(StringUtility.Contact(buildParameters.GetWholeOutPutPath(), "/config"));
                TableTool.CopyConfigsToOutPutPath(StringUtility.Concat(buildParameters.GetWholeOutPutPath(), "/config"));
            }
            else
            {
@@ -295,11 +295,11 @@
            switch (buildTarget)
            {
                case BuildTarget.Android:
                    return StringUtility.Contact(outputPath, "/android");
                    return StringUtility.Concat(outputPath, "/android");
                case BuildTarget.iOS:
                    return StringUtility.Contact(outputPath, "/ios");
                    return StringUtility.Concat(outputPath, "/ios");
                case BuildTarget.StandaloneWindows:
                    return StringUtility.Contact(outputPath, "/standalone");
                    return StringUtility.Concat(outputPath, "/standalone");
                default:
                    return string.Empty;
            }
Assets/Editor/Tool/BytesVersionMaker.cs
@@ -34,13 +34,13 @@
            lines.Add(StringUtility.Concat(relativePath, "\t", extersion, "\t", fileSize.ToString(), "\t", md5));
        }
        var assetVersionFile = StringUtility.Contact(_path, Path.DirectorySeparatorChar.ToString(), "logicbytes.txt");
        var assetVersionFile = StringUtility.Concat(_path, Path.DirectorySeparatorChar.ToString(), "logicbytes.txt");
        if (File.Exists(assetVersionFile))
        {
            File.Delete(assetVersionFile);
        }
        File.WriteAllText(StringUtility.Contact(_path, Path.DirectorySeparatorChar.ToString(), "logicbytes.txt"), string.Join(FileExtersion.lineSplit, lines.ToArray()));
        File.WriteAllText(StringUtility.Concat(_path, Path.DirectorySeparatorChar.ToString(), "logicbytes.txt"), string.Join(FileExtersion.lineSplit, lines.ToArray()));
    }
}
Assets/Editor/Tool/ClientPackage.cs
@@ -162,7 +162,7 @@
                }
                var relativePath = FileExtersion.GetFileRelativePath(_assetBundlePath, item.FullName);
                var to = StringUtility.Contact(ResourcesPath.Instance.StreamingAssetPath, relativePath);
                var to = StringUtility.Concat(ResourcesPath.Instance.StreamingAssetPath, relativePath);
                var directory = Path.GetDirectoryName(to);
                if (!Directory.Exists(directory))
                {
@@ -194,7 +194,7 @@
            var excludeFileFullNames = new List<string>();
            var tempFiles = new List<FileInfo>();
            FileExtersion.GetAllDirectoryFileInfos(StringUtility.Contact(_assetBundlePath, "/hero"), tempFiles);
            FileExtersion.GetAllDirectoryFileInfos(StringUtility.Concat(_assetBundlePath, "/hero"), tempFiles);
            foreach (var file in tempFiles)
            {
                var extersion = Path.GetExtension(file.FullName);
@@ -207,7 +207,7 @@
            }
            tempFiles.Clear();
            FileExtersion.GetAllDirectoryFileInfos(StringUtility.Contact(_assetBundlePath, "/maps"), tempFiles);
            FileExtersion.GetAllDirectoryFileInfos(StringUtility.Concat(_assetBundlePath, "/maps"), tempFiles);
            foreach (var file in tempFiles)
            {
                var extersion = Path.GetExtension(file.FullName);
@@ -220,7 +220,7 @@
            }
            tempFiles.Clear();
            FileExtersion.GetAllDirectoryFileInfos(StringUtility.Contact(_assetBundlePath, "/audio"), tempFiles);
            FileExtersion.GetAllDirectoryFileInfos(StringUtility.Concat(_assetBundlePath, "/audio"), tempFiles);
            foreach (var file in tempFiles)
            {
                var extersion = Path.GetExtension(file.FullName);
@@ -233,7 +233,7 @@
            }
            tempFiles.Clear();
            FileExtersion.GetAllDirectoryFileInfos(StringUtility.Contact(_assetBundlePath, "/uieffect"), tempFiles);
            FileExtersion.GetAllDirectoryFileInfos(StringUtility.Concat(_assetBundlePath, "/uieffect"), tempFiles);
            foreach (var file in tempFiles)
            {
                var extersion = Path.GetExtension(file.FullName);
@@ -247,10 +247,10 @@
            //剔除视频资源
            tempFiles.Clear();
            var videoPath = StringUtility.Contact(_assetBundlePath, "/video");
            var videoPath = StringUtility.Concat(_assetBundlePath, "/video");
            if (File.Exists(videoPath))
            {
                FileExtersion.GetAllDirectoryFileInfos(StringUtility.Contact(_assetBundlePath, "/video"), tempFiles);
                FileExtersion.GetAllDirectoryFileInfos(StringUtility.Concat(_assetBundlePath, "/video"), tempFiles);
                foreach (var file in tempFiles)
                {
                    var extersion = Path.GetExtension(file.FullName);
@@ -269,7 +269,7 @@
            if (!includeConfig)
            {
                tempFiles.Clear();
                FileExtersion.GetAllDirectoryFileInfos(StringUtility.Contact(_assetBundlePath, "/config"), tempFiles);
                FileExtersion.GetAllDirectoryFileInfos(StringUtility.Concat(_assetBundlePath, "/config"), tempFiles);
                foreach (var file in tempFiles)
                {
                    excludeFileFullNames.Add(file.FullName);
@@ -278,7 +278,7 @@
            //剔除UI资源
            //tempFiles.Clear();
            //FileExtersion.GetAllDirectoryFileInfos(StringUtility.Contact(_assetBundlePath, "/ui/sprite"), tempFiles);
            //FileExtersion.GetAllDirectoryFileInfos(StringUtility.Concat(_assetBundlePath, "/ui/sprite"), tempFiles);
            //foreach (var file in tempFiles)
            //{
            //    var fileName = Path.GetFileName(file.FullName);
@@ -290,7 +290,7 @@
            if (!includeUI)
            {
                tempFiles.Clear();
                FileExtersion.GetAllDirectoryFileInfos(StringUtility.Contact(_assetBundlePath, "/ui"), tempFiles);
                FileExtersion.GetAllDirectoryFileInfos(StringUtility.Concat(_assetBundlePath, "/ui"), tempFiles);
                foreach (var file in tempFiles)
                {
                    excludeFileFullNames.Add(file.FullName);
@@ -301,7 +301,7 @@
#if !UNITY_IOS
                //剔除UI资源
                tempFiles.Clear();
                FileExtersion.GetAllDirectoryFileInfos(StringUtility.Contact(_assetBundlePath, "/ui"), tempFiles);
                FileExtersion.GetAllDirectoryFileInfos(StringUtility.Concat(_assetBundlePath, "/ui"), tempFiles);
                foreach (var file in tempFiles)
                {
                    var extersion = Path.GetExtension(file.FullName);
@@ -329,7 +329,7 @@
            foreach (var item in fromFiles)
            {
                var relativePath = FileExtersion.GetFileRelativePath(_assetBundlePath, item.FullName);
                var to = StringUtility.Contact(ResourcesPath.Instance.StreamingAssetPath, relativePath);
                var to = StringUtility.Concat(ResourcesPath.Instance.StreamingAssetPath, relativePath);
                if (relativePath.StartsWith("patch"))//不包含meta文件和补丁
                    continue;
@@ -366,7 +366,7 @@
            foreach (var item in fromFiles)
            {
                var relativePath = FileExtersion.GetFileRelativePath(_assetBundlePath, item.FullName);
                var to = StringUtility.Contact(ResourcesPath.Instance.StreamingAssetPath, relativePath);
                var to = StringUtility.Concat(ResourcesPath.Instance.StreamingAssetPath, relativePath);
                if (relativePath.StartsWith("patch"))//不包含meta文件和补丁
                    continue;
@@ -397,7 +397,7 @@
    public static void BuildApk(string _sdkPath, string _output, string _publisher, int _buildIndex, bool _development)
    {
        PreBuild(_publisher, _buildIndex);
        var auditTimeFile = StringUtility.Contact(Application.dataPath, Path.DirectorySeparatorChar.ToString(), "Resources/Config/AuditTime.txt");
        var auditTimeFile = StringUtility.Concat(Application.dataPath, Path.DirectorySeparatorChar.ToString(), "Resources/Config/AuditTime.txt");
        if (File.Exists(auditTimeFile))
        {
            File.Delete(auditTimeFile);
@@ -411,7 +411,7 @@
        // if (text.Contains("VERSION_ALTERNATIVE"))
        // {
        //     var pattern = "VERSION_ALTERNATIVE = \".*\"";
        //     text = Regex.Replace(text, pattern, StringUtility.Contact("VERSION_ALTERNATIVE = ", "\"", versionConfig.m_Version, "\""));
        //     text = Regex.Replace(text, pattern, StringUtility.Concat("VERSION_ALTERNATIVE = ", "\"", versionConfig.m_Version, "\""));
        //     bool encoderShouldEmitUTF8Identifier = true;
        //     bool throwOnInvalidBytes = false;
@@ -428,7 +428,7 @@
        // 更名原有文件
        // string _gradleTemplateUrl = EditorApplication.applicationContentsPath + "/PlaybackEngines/AndroidPlayer/Tools/GradleTemplates/";
        // string _gradleFileUrl = _gradleTemplateUrl + "mainTemplate.gradle";
        // string _diffGradleFileUrl = StringUtility.Contact(_sdkPath, "/GradleDiff/", versionConfig.appId, "/mainTemplate.gradle");
        // string _diffGradleFileUrl = StringUtility.Concat(_sdkPath, "/GradleDiff/", versionConfig.appId, "/mainTemplate.gradle");
        // FileInfo _fileInfo = new FileInfo(_diffGradleFileUrl);
        // if (!_fileInfo.Exists)
@@ -486,28 +486,28 @@
        string copySdkFile;
        channelSdkPath = StringUtility.Concat(_sdkPath, "/Channel/Android/", versionConfig.sdkFileName, "/", variant);
        copySdkFile = StringUtility.Contact(_sdkPath, "/Channel/Android/", versionConfig.sdkFileName, "/AndroidManifest.xml");
        copySdkFile = StringUtility.Concat(_sdkPath, "/Channel/Android/", versionConfig.sdkFileName, "/AndroidManifest.xml");
        File.Copy(copySdkFile, MANIFEST_PATH);
        copySdkFile = StringUtility.Contact(_sdkPath, "/Channel/Android/", versionConfig.sdkFileName, "/baseProjectTemplate.gradle");
        copySdkFile = StringUtility.Concat(_sdkPath, "/Channel/Android/", versionConfig.sdkFileName, "/baseProjectTemplate.gradle");
        File.Copy(copySdkFile, File_baseProjectTemplate);
        copySdkFile = StringUtility.Contact(_sdkPath, "/Channel/Android/", versionConfig.sdkFileName, "/deps.gradle");
        copySdkFile = StringUtility.Concat(_sdkPath, "/Channel/Android/", versionConfig.sdkFileName, "/deps.gradle");
        File.Copy(copySdkFile, File_deps);
        copySdkFile = StringUtility.Contact(_sdkPath, "/Channel/Android/", versionConfig.sdkFileName, "/google-services.json");
        copySdkFile = StringUtility.Concat(_sdkPath, "/Channel/Android/", versionConfig.sdkFileName, "/google-services.json");
        File.Copy(copySdkFile, File_google_services);
        copySdkFile = StringUtility.Contact(_sdkPath, "/Channel/Android/", versionConfig.sdkFileName, "/gradleTemplate.properties");
        copySdkFile = StringUtility.Concat(_sdkPath, "/Channel/Android/", versionConfig.sdkFileName, "/gradleTemplate.properties");
        File.Copy(copySdkFile, File_gradleTemplate);
        //copySdkFile = StringUtility.Contact(_sdkPath, "/Channel/Android/", versionConfig.appId, "/LauncherManifest.xml");
        //copySdkFile = StringUtility.Concat(_sdkPath, "/Channel/Android/", versionConfig.appId, "/LauncherManifest.xml");
        //File.Copy(copySdkFile, File_LauncherManifest);
        copySdkFile = StringUtility.Contact(_sdkPath, "/Channel/Android/", versionConfig.sdkFileName, "/launcherTemplate.gradle");
        copySdkFile = StringUtility.Concat(_sdkPath, "/Channel/Android/", versionConfig.sdkFileName, "/launcherTemplate.gradle");
        File.Copy(copySdkFile, File_launcherTemplate);
        copySdkFile = StringUtility.Contact(_sdkPath, "/Channel/Android/", versionConfig.sdkFileName, "/mainTemplate.gradle");
        copySdkFile = StringUtility.Concat(_sdkPath, "/Channel/Android/", versionConfig.sdkFileName, "/mainTemplate.gradle");
        File.Copy(copySdkFile, File_mainTemplate);
        copySdkFile = StringUtility.Contact(_sdkPath, "/Channel/Android/", versionConfig.sdkFileName, "/settingsTemplate.gradle");
        copySdkFile = StringUtility.Concat(_sdkPath, "/Channel/Android/", versionConfig.sdkFileName, "/settingsTemplate.gradle");
        File.Copy(copySdkFile, File_settingGradle);
        if (versionConfig.sdkFileName == "hyyngame_huawei")
        {
            copySdkFile = StringUtility.Contact(_sdkPath, "/Channel/Android/", versionConfig.sdkFileName, "/agconnect-services.json");
            copySdkFile = StringUtility.Concat(_sdkPath, "/Channel/Android/", versionConfig.sdkFileName, "/agconnect-services.json");
            File.Copy(copySdkFile, File_huawei_services);
        }
@@ -574,11 +574,11 @@
        if (versionConfig1.sdkFileName.Trim().Length != 0)
        {
            FileExtersion.DirectoryCopy(StringUtility.Contact(_sdkPath, "/Channel/iOS/", versionConfig1.sdkFileName, "/Plugins"), iOS_PLUGIN_PATH);
            FileExtersion.DirectoryCopy(StringUtility.Concat(_sdkPath, "/Channel/iOS/", versionConfig1.sdkFileName, "/Plugins"), iOS_PLUGIN_PATH);
        }
        else
        {
            FileExtersion.DirectoryCopy(StringUtility.Contact(_sdkPath, "/Channel/iOS/", versionConfig1.appId, "/Plugins"), iOS_PLUGIN_PATH);
            FileExtersion.DirectoryCopy(StringUtility.Concat(_sdkPath, "/Channel/iOS/", versionConfig1.appId, "/Plugins"), iOS_PLUGIN_PATH);
        }
        DateTime outTime;
@@ -630,7 +630,7 @@
    private static void PreBuild(string _publisher, int _buildIndex)
    {
        MakePackageMD5File();
        var newVersionConfigPath = StringUtility.Contact("Assets/Resources/VersionConfig", ".asset");
        var newVersionConfigPath = StringUtility.Concat("Assets/Resources/VersionConfig", ".asset");
        var versionName = string.Empty;
        var fromVersionConfig = GetVersionConfig(_publisher, out versionName);
        var newVersionConfig = ScriptableObject.CreateInstance<VersionConfig>();
@@ -723,7 +723,7 @@
    static void SetIconAndSplashImage(string _versionName)
    {
        var buildTarget = GetBuildTarget();
        var texture = AssetDatabase.LoadAssetAtPath<Texture2D>(StringUtility.Contact("Assets/Editor/Logo/", _versionName, "/Icon.png"));
        var texture = AssetDatabase.LoadAssetAtPath<Texture2D>(StringUtility.Concat("Assets/Editor/Logo/", _versionName, "/Icon.png"));
        var iconSizes = PlayerSettings.GetIconSizesForTargetGroup(buildTarget);
        var icons = new Texture2D[iconSizes.Length];
        for (int i = 0; i < iconSizes.Length; i++)
@@ -737,7 +737,7 @@
        PlayerSettings.SplashScreen.showUnityLogo = false;
        PlayerSettings.SplashScreen.unityLogoStyle = PlayerSettings.SplashScreen.UnityLogoStyle.LightOnDark;
        var splashImage = AssetDatabase.LoadAssetAtPath<Sprite>(StringUtility.Contact("Assets/Editor/Logo/", _versionName, "/SplashImage.png"));
        var splashImage = AssetDatabase.LoadAssetAtPath<Sprite>(StringUtility.Concat("Assets/Editor/Logo/", _versionName, "/SplashImage.png"));
        var splashScreenLogo = PlayerSettings.SplashScreenLogo.Create(3, splashImage);
        PlayerSettings.SplashScreen.logos = new PlayerSettings.SplashScreenLogo[] { splashScreenLogo };
Assets/Editor/Tool/ClientPackage_Standalone.cs
@@ -126,7 +126,7 @@
            }
            var relativePath = FileExtersion.GetFileRelativePath(assetPath, item.FullName);
            var to = StringUtility.Contact(ResourcesPath.Instance.StreamingAssetPath, relativePath);
            var to = StringUtility.Concat(ResourcesPath.Instance.StreamingAssetPath, relativePath);
            File.Copy(item.FullName, to, true);
        }
@@ -155,7 +155,7 @@
        var excludeFileFullNames = new List<string>();
        var tempFiles = new List<FileInfo>();
        FileExtersion.GetAllDirectoryFileInfos(StringUtility.Contact(assetPath, "/hero"), tempFiles);
        FileExtersion.GetAllDirectoryFileInfos(StringUtility.Concat(assetPath, "/hero"), tempFiles);
        foreach (var file in tempFiles)
        {
            var extersion = Path.GetExtension(file.FullName);
@@ -173,7 +173,7 @@
        }
        tempFiles.Clear();
        FileExtersion.GetAllDirectoryFileInfos(StringUtility.Contact(assetPath, "/maps"), tempFiles);
        FileExtersion.GetAllDirectoryFileInfos(StringUtility.Concat(assetPath, "/maps"), tempFiles);
        foreach (var file in tempFiles)
        {
            var extersion = Path.GetExtension(file.FullName);
@@ -191,7 +191,7 @@
        }
        tempFiles.Clear();
        FileExtersion.GetAllDirectoryFileInfos(StringUtility.Contact(assetPath, "/audio"), tempFiles);
        FileExtersion.GetAllDirectoryFileInfos(StringUtility.Concat(assetPath, "/audio"), tempFiles);
        foreach (var file in tempFiles)
        {
            var extersion = Path.GetExtension(file.FullName);
@@ -209,7 +209,7 @@
        }
        tempFiles.Clear();
        FileExtersion.GetAllDirectoryFileInfos(StringUtility.Contact(assetPath, "/uieffect"), tempFiles);
        FileExtersion.GetAllDirectoryFileInfos(StringUtility.Concat(assetPath, "/uieffect"), tempFiles);
        foreach (var file in tempFiles)
        {
            var extersion = Path.GetExtension(file.FullName);
@@ -227,7 +227,7 @@
        }
        tempFiles.Clear();
        FileExtersion.GetAllDirectoryFileInfos(StringUtility.Contact(assetPath, "/ui/sprite"), tempFiles);
        FileExtersion.GetAllDirectoryFileInfos(StringUtility.Concat(assetPath, "/ui/sprite"), tempFiles);
        foreach (var file in tempFiles)
        {
            var fileName = Path.GetFileName(file.FullName);
@@ -249,7 +249,7 @@
        foreach (var item in fromFiles)
        {
            var relativePath = FileExtersion.GetFileRelativePath(assetPath, item.FullName);
            var to = StringUtility.Contact(ResourcesPath.Instance.StreamingAssetPath, relativePath);
            var to = StringUtility.Concat(ResourcesPath.Instance.StreamingAssetPath, relativePath);
            var directory = Path.GetDirectoryName(to);
            if (!Directory.Exists(directory))
            {
@@ -281,7 +281,7 @@
        foreach (var item in fromFiles)
        {
            var relativePath = FileExtersion.GetFileRelativePath(assetPath, item.FullName);
            var to = StringUtility.Contact(ResourcesPath.Instance.StreamingAssetPath, relativePath);
            var to = StringUtility.Concat(ResourcesPath.Instance.StreamingAssetPath, relativePath);
            var directory = Path.GetDirectoryName(to);
            if (!Directory.Exists(directory))
            {
@@ -309,7 +309,7 @@
        if (text.Contains("VERSION_ALTERNATIVE"))
        {
            var pattern = "VERSION_ALTERNATIVE = \".*\"";
            text = Regex.Replace(text, pattern, StringUtility.Contact("VERSION_ALTERNATIVE = ", "\"", versionConfig.m_Version, "\""));
            text = Regex.Replace(text, pattern, StringUtility.Concat("VERSION_ALTERNATIVE = ", "\"", versionConfig.m_Version, "\""));
            var encoderShouldEmitUTF8Identifier = true;
            var throwOnInvalidBytes = false;
@@ -347,7 +347,7 @@
    {
        try
        {
            var newVersionConfigPath = StringUtility.Contact("Assets/Resources/VersionConfig", ".asset");
            var newVersionConfigPath = StringUtility.Concat("Assets/Resources/VersionConfig", ".asset");
            var versionName = string.Empty;
            var fromVersionConfig = GetVersionConfig(packageId.ToString(), out versionName);
            var newVersionConfig = ScriptableObject.CreateInstance<VersionConfig>();
@@ -416,7 +416,7 @@
    static void SetIconAndSplashImage(string _versionName)
    {
        var buildTarget = BuildTargetGroup.Standalone;
        var texture = AssetDatabase.LoadAssetAtPath<Texture2D>(StringUtility.Contact("Assets/Editor/Logo/", _versionName, "/Icon.png"));
        var texture = AssetDatabase.LoadAssetAtPath<Texture2D>(StringUtility.Concat("Assets/Editor/Logo/", _versionName, "/Icon.png"));
        var iconSizes = PlayerSettings.GetIconSizesForTargetGroup(buildTarget);
        var icons = new Texture2D[iconSizes.Length];
        for (int i = 0; i < iconSizes.Length; i++)
@@ -430,7 +430,7 @@
        PlayerSettings.SplashScreen.showUnityLogo = false;
        PlayerSettings.SplashScreen.unityLogoStyle = PlayerSettings.SplashScreen.UnityLogoStyle.LightOnDark;
        var splashImage = AssetDatabase.LoadAssetAtPath<Sprite>(StringUtility.Contact("Assets/Editor/Logo/", _versionName, "/SplashImage.png"));
        var splashImage = AssetDatabase.LoadAssetAtPath<Sprite>(StringUtility.Concat("Assets/Editor/Logo/", _versionName, "/SplashImage.png"));
        var splashScreenLogo = PlayerSettings.SplashScreenLogo.Create(3, splashImage);
        PlayerSettings.SplashScreen.logos = new PlayerSettings.SplashScreenLogo[] { splashScreenLogo };
    }
Assets/Editor/Tool/SpriteManageTool.cs
@@ -245,8 +245,8 @@
                    var _detail = _list[i];
                    var _fatherDetail = _detail.fatherDetail;
                    GUILayout.BeginHorizontal();
                    GUILayout.Label(StringUtility.Contact((i + 1).ToString(), ".", "Path: "));
                    var _path = StringUtility.Contact(_detail.fatherDetail, _fatherDetail == string.Empty ? string.Empty : "/", _detail.name);
                    GUILayout.Label(StringUtility.Concat((i + 1).ToString(), ".", "Path: "));
                    var _path = StringUtility.Concat(_detail.fatherDetail, _fatherDetail == string.Empty ? string.Empty : "/", _detail.name);
                    GUILayout.TextField(_path);
                    if (_fatherDetail != string.Empty && GUILayout.Button("Goto"))
                    {
@@ -288,8 +288,8 @@
            }
            GUILayout.BeginHorizontal();
            var _fatherDetail = _detail.fatherDetail;
            GUILayout.Label(StringUtility.Contact((i + 1).ToString(), ".", "Path: "));
            var _path = StringUtility.Contact(_detail.fatherDetail, _fatherDetail == string.Empty ? string.Empty : "/", _detail.name);
            GUILayout.Label(StringUtility.Concat((i + 1).ToString(), ".", "Path: "));
            var _path = StringUtility.Concat(_detail.fatherDetail, _fatherDetail == string.Empty ? string.Empty : "/", _detail.name);
            GUILayout.TextField(_path);
            if (_fatherDetail != string.Empty && GUILayout.Button("Goto"))
            {
@@ -425,7 +425,7 @@
                var _match = _matchs[_index - 1];
                GetRefComponent(_list[_index], _list[_index].Split('\n'), _match.Groups[1].Value);
                bool isCancel = EditorUtility.DisplayCancelableProgressBar("查找引用资源",
                    StringUtility.Contact(_index.ToString(), "/", _list.Count.ToString()), (float)_index / (float)_list.Count);
                    StringUtility.Concat(_index.ToString(), "/", _list.Count.ToString()), (float)_index / (float)_list.Count);
                _index++;
                if (isCancel || _index >= _list.Count)
                {
@@ -447,7 +447,7 @@
                            _details.Add(_detail);
                        }
                        isCancel = EditorUtility.DisplayCancelableProgressBar("查找引用资源",
                            StringUtility.Contact(_index.ToString(), "/", _keys.Count.ToString()), (float)_index / (float)_keys.Count);
                            StringUtility.Concat(_index.ToString(), "/", _keys.Count.ToString()), (float)_index / (float)_keys.Count);
                        _index++;
                        if (isCancel || _index >= _keys.Count)
                        {
@@ -575,7 +575,7 @@
            if (_detail.rectId == _fatherId)
            {
                var _father = GetFatherDetail(_detail.fatherId);
                return StringUtility.Contact(GetFatherDetail(_detail.fatherId), _father == string.Empty ? string.Empty : "/", _detail.name);
                return StringUtility.Concat(GetFatherDetail(_detail.fatherId), _father == string.Empty ? string.Empty : "/", _detail.name);
            }
        }
        return string.Empty;
@@ -635,7 +635,7 @@
    public static void DisplayExternalPath()
    {
        GUILayout.BeginHorizontal();
        GUILayout.Label(StringUtility.Contact("文件夹路径:", m_ExternalFilePath));
        GUILayout.Label(StringUtility.Concat("文件夹路径:", m_ExternalFilePath));
        if (GUILayout.Button("选择文件根路径"))
        {
            var _path = EditorUtility.OpenFolderPanel("根路径", "", "");
Assets/Editor/Tool/UpdateSpritePackingSetting.cs
@@ -26,7 +26,7 @@
        foreach (var setting in so.spriteSettings)
        {
            var directoryPath = StringUtility.Contact(rootPath, Path.DirectorySeparatorChar.ToString(), setting.folderName);
            var directoryPath = StringUtility.Concat(rootPath, Path.DirectorySeparatorChar.ToString(), setting.folderName);
            if (!Directory.Exists(directoryPath))
            {
@@ -79,7 +79,7 @@
                    count++;
                    EditorUtility.DisplayProgressBar(StringUtility.Contact("设置图集标签:", setting.folderName), file.Name, count / (float)total);
                    EditorUtility.DisplayProgressBar(StringUtility.Concat("设置图集标签:", setting.folderName), file.Name, count / (float)total);
                }
                catch (Exception ex)
                {
@@ -164,7 +164,7 @@
        int index = 0;
        foreach (SpriteSettingConfig.SpriteSetting setting in so.spriteSettings)
        {
            var directoryPath = StringUtility.Contact(rootPath, Path.DirectorySeparatorChar.ToString(), setting.folderName);
            var directoryPath = StringUtility.Concat(rootPath, Path.DirectorySeparatorChar.ToString(), setting.folderName);
            if (!Directory.Exists(directoryPath))
            {
Assets/Editor/Web/NetPkgTool.cs
@@ -87,7 +87,7 @@
            try
            {
                contain = Regex.IsMatch(package.name, StringUtility.Contact(".*(", filterNetPkgStr.Replace(" ", "|"), ").*"));
                contain = Regex.IsMatch(package.name, StringUtility.Concat(".*(", filterNetPkgStr.Replace(" ", "|"), ").*"));
            }
            catch (System.Exception ex)
            {
@@ -216,7 +216,7 @@
                        }
                        GUI.skin.button.normal.textColor = professionalSkin ? Color.white : Color.black;
                        var showName = StringUtility.Contact(package.time, "  ", package.name);
                        var showName = StringUtility.Concat(package.time, "  ", package.name);
                        EditorGUILayout.LabelField(package.socketType == ServerType.B430 ? new GUIContent($"<color=#119911>{showName}</color>") : 
                        (package.socketType == ServerType.MainFight ? new GUIContent($"<color=#9C5E13>{showName}</color>") : new GUIContent(showName)),
                         new GUIStyle(EditorStyles.label) { richText = true }, GUILayout.Width(260));
Assets/Launch/Common/AssetVersion.cs
@@ -56,7 +56,7 @@
        //checkList 用于外部检查文件下载后是否一致,不包含没有文件的情况
        public bool CheckLocalFileValid(List<bool> checkList = null)
        {
            string path = StringUtility.Contact(ResourcesPath.Instance.ExternalStorePath, m_RelativePath);
            string path = StringUtility.Concat(ResourcesPath.Instance.ExternalStorePath, m_RelativePath);
            var fileInfo = new FileInfo(path);
            if (!fileInfo.Exists)
@@ -92,7 +92,7 @@
        // 存在则比较
        public bool CheckLocalFileValid(AssetVersion otherAssetInfo)
        {
            string path = StringUtility.Contact(ResourcesPath.Instance.ExternalStorePath, m_RelativePath);
            string path = StringUtility.Concat(ResourcesPath.Instance.ExternalStorePath, m_RelativePath);
            if (!File.Exists(path))
            {
Assets/Launch/Common/DownLoadAndDiscompressTask.cs
@@ -74,8 +74,8 @@
            for (int i = 0; i < tasks.Count; i++)
            {
                var assetVersion = tasks[i];
                var remoteURL = StringUtility.Contact(LocalResManager.Instance.versionInfo.GetResourcesURL(VersionConfigEx.Get().branch), LocalResManager.fixPath, "/", assetVersion.relativePath);
                var localURL = StringUtility.Contact(LocalResManager.Instance.ExternalStorePath, assetVersion.relativePath);
                var remoteURL = StringUtility.Concat(LocalResManager.Instance.versionInfo.GetResourcesURL(VersionConfigEx.Get().branch), LocalResManager.fixPath, "/", assetVersion.relativePath);
                var localURL = StringUtility.Concat(LocalResManager.Instance.ExternalStorePath, assetVersion.relativePath);
                DownloadMgr.Instance.AddTask(new DownloadTask(remoteURL, localURL));
            }
Assets/Launch/Common/FileExtersion.cs
@@ -105,7 +105,7 @@
        {
            var startIndex = index + 9;
            fileName = fileName.Substring(startIndex, fileName.Length - startIndex);
            return StringUtility.Contact(Path.GetDirectoryName(_fullName), Path.DirectorySeparatorChar.ToString(), fileName);
            return StringUtility.Concat(Path.GetDirectoryName(_fullName), Path.DirectorySeparatorChar.ToString(), fileName);
        }
        else
        {
Assets/Launch/Launch.cs
@@ -85,6 +85,7 @@
        System.Globalization.CultureInfo.DefaultThreadCurrentCulture = culture;
        System.Globalization.CultureInfo.DefaultThreadCurrentUICulture = culture;
        System.Net.ServicePointManager.DefaultConnectionLimit = 100;
        StringUtility.WarmupPool();
#if UNITY_EDITOR
        //内网下载测试
Assets/Launch/Manager/LocalResManager.cs
@@ -236,9 +236,9 @@
    {
        Sprite sprite = null;
#if UNITY_EDITOR
        if (excludePngs.Contains(StringUtility.Contact(name, ".png")))
        if (excludePngs.Contains(StringUtility.Concat(name, ".png")))
        {
            var path = StringUtility.Contact("Assets/ResourcesOut/BuiltIn/Sprites/", name, ".png");
            var path = StringUtility.Concat("Assets/ResourcesOut/BuiltIn/Sprites/", name, ".png");
            sprite = UnityEditor.AssetDatabase.LoadAssetAtPath<Sprite>(path);
        }
        else
Assets/Launch/UI/LaunchWins/LaunchExWin.cs
@@ -117,13 +117,13 @@
        }
        if (ShowCircleView)
        {
            m_IosProgressTip.text = StringUtility.Contact(sliderText, " ", ((int)(value * 100)).ToString(), "%");
            m_IosProgressTip.text = StringUtility.Concat(sliderText, " ", ((int)(value * 100)).ToString(), "%");
            //circleImg.Rotate(Vector3.forward, -1800 * Time.deltaTime);
        }
        else
        {
            m_TotalProgressSlider.value = value;
            m_StageDescription.text = StringUtility.Contact(sliderText, " ", ((int)(value * 100)).ToString(), "%");
            m_StageDescription.text = StringUtility.Concat(sliderText, " ", ((int)(value * 100)).ToString(), "%");
        }
    }
Assets/Launch/Utility/StringUtility.cs
@@ -2,88 +2,201 @@
using System.Collections;
using System.Text;
using System;
using System.Collections.Concurrent;
// AI提醒实际在现代编辑器中,低于4个字符串的+ 操作符的性能和 string.Concat 几乎相同,会被智能优化为 string.Concat
public class StringUtility
{
    public static readonly string[] splitSeparator = new string[] { "|" };
    // 对象池方案:线程安全的StringBuilder池
    private static readonly ConcurrentQueue<StringBuilder> _stringBuilderPool = new ConcurrentQueue<StringBuilder>();
    private const int MAX_POOL_SIZE = 32;  // 增加池大小以适应高并发
    private const int DEFAULT_CAPACITY = 64;
    private const int SMALL_CAPACITY = 64;   // 适用于小规模拼接
    private const int TINY_CAPACITY = 32;    // 适用于极小规模拼接
    private const int MEDIUM_CAPACITY = 128; // 新增中等容量级别
    private const int LARGE_CAPACITY = 256;  // 新增大容量级别
    // 新增:为循环调用的优化版本(复用StringBuilder)
    [ThreadStatic]
    private static StringBuilder _threadLocalStringBuilder;
    /// <summary>
    /// 获取当前线程的StringBuilder
    /// 智能容量估算(优化版)
    /// </summary>
    private static StringBuilder GetThreadLocalStringBuilder()
    private static int EstimateCapacity(params string[] objects)
    {
        if (_threadLocalStringBuilder == null)
        if (objects == null || objects.Length == 0)
            return TINY_CAPACITY;
        int totalLength = 0;
        // 单次遍历计算总长度,提高性能
        foreach (string str in objects)
        {
            _threadLocalStringBuilder = new StringBuilder();
            if (str != null)
                totalLength += str.Length;
        }
        return _threadLocalStringBuilder;
        // 更精细的容量策略,减少内存浪费
        if (totalLength <= TINY_CAPACITY)
            return TINY_CAPACITY;
        else if (totalLength <= SMALL_CAPACITY)
            return SMALL_CAPACITY;
        else if (totalLength <= MEDIUM_CAPACITY)
            return MEDIUM_CAPACITY;
        else if (totalLength <= LARGE_CAPACITY)
            return LARGE_CAPACITY;
        else
            // 对于超大字符串,预留25%的缓冲空间(减少内存浪费)
            return totalLength + (totalLength >> 2);
    }
    /// <summary>
    /// 智能字符串拼接方法,自动选择最优策略
    /// - 2-4个字符串:直接使用 string.Concat() (最高性能)
    /// - 5个以上字符串:使用线程本地 StringBuilder 复用 (循环优化)
    /// 从对象池获取StringBuilder
    /// </summary>
    private static StringBuilder GetPooledStringBuilder(int capacity = DEFAULT_CAPACITY)
    {
        if (_stringBuilderPool.TryDequeue(out StringBuilder sb))
        {
            sb.Clear();
            // 如果容量不足,重新创建
            if (sb.Capacity < capacity)
            {
                sb = new StringBuilder(capacity);
            }
            return sb;
        }
        return new StringBuilder(capacity);
    }
    /// <summary>
    /// 将StringBuilder归还到对象池(优化版)
    /// </summary>
    private static void ReturnToPool(StringBuilder sb)
    {
        if (sb == null)
            return;
        // 容量过大或过长,不回收以避免内存问题
        if (sb.Capacity > 2048 || sb.Length > 1024)
        {
            SecureClear(sb);
            return;
        }
        // 池未满时才回收
        if (_stringBuilderPool.Count < MAX_POOL_SIZE)
        {
            sb.Clear();
            _stringBuilderPool.Enqueue(sb);
        }
        else
        {
            // 池满时进行安全清理
            SecureClear(sb);
        }
    }
    /// <summary>
    /// 安全清理StringBuilder内容(防止敏感数据泄露)
    /// </summary>
    private static void SecureClear(StringBuilder sb)
    {
        if (sb == null || sb.Length == 0)
            return;
        // 基础清理
        sb.Clear();
        // 安全清理:用空字符覆盖缓冲区
        // #if UNITY_EDITOR || DEVELOPMENT_BUILD
        // // 仅在开发版本中执行更彻底的清理,避免影响性能
        // int originalCapacity = sb.Capacity;
        // if (originalCapacity <= 1024) // 仅对小容量StringBuilder进行安全清理
        // {
        //     sb.Capacity = originalCapacity;
        //     for (int i = 0; i < originalCapacity; i++)
        //     {
        //         sb.Append('\0');
        //     }
        //     sb.Clear();
        // }
        // #endif
    }
    /// <summary>
    /// 智能字符串拼接方法(优化版),自动选择最优策略
    /// - 1-4个字符串:直接使用 string.Concat() (最高性能)
    /// - 4-8个字符串:使用对象池 StringBuilder,容量预分配
    /// - 9个以上字符串:使用对象池 StringBuilder + 容量估算
    /// </summary>
    public static string Concat(params string[] _objects)
    {
        if (_objects == null || _objects.Length == 0)
            return string.Empty;
        // 少量字符串直接使用Concat,性能最佳
        if (_objects.Length <= 4)
        {
            return string.Concat(_objects);
        }
        // 大量字符串使用线程本地StringBuilder,避免重复创建
        var sb = GetThreadLocalStringBuilder();
        sb.Clear();
        foreach (string str in _objects)
        // 中等数量字符串使用简单容量策略
        int estimatedCapacity;
        if (_objects.Length <= 8)
        {
            sb.Append(str);
            estimatedCapacity = DEFAULT_CAPACITY;
        }
        return sb.ToString();
    }
    // AI提醒实际在现代编辑器中,低于4个字符串的+ 操作符的性能和 string.Concat 几乎相同,会被智能优化为 string.Concat
    // 添加常用2个字符串拼接的优化版本
    public static string Contact(string str1, string str2)
    {
        return string.Concat(str1, str2);
    }
    // 添加常用3个字符串拼接的优化版本
    public static string Contact(string str1, string str2, string str3)
    {
        return string.Concat(str1, str2, str3);
    }
    // 添加常用4个字符串拼接的优化版本
    public static string Contact(string str1, string str2, string str3, string str4)
    {
        return string.Concat(str1, str2, str3, str4);
    }
        else
        {
            // 大量字符串才进行容量估算(优化性能)
            estimatedCapacity = EstimateCapacity(_objects);
        }
        var sb = GetPooledStringBuilder(estimatedCapacity);
        try
        {
            foreach (string str in _objects)
            {
                sb.Append(str);
            }
            return sb.ToString();
        }
        finally
        {
            ReturnToPool(sb);
        }
    }
    public static string FormatSpeed(float speed)
    {
        if (speed > 1048576f)
        {
            return Contact((speed / 1048576f).ToString("f1"), " M/S");
            return Concat((speed / 1048576f).ToString("f1"), " M/S");
        }
        else if (speed > 1024f)
        {
            return Contact((speed / 1024f).ToString("f1"), " KB/S");
            return Concat((speed / 1024f).ToString("f1"), " KB/S");
        }
        else
        {
            return Contact(speed.ToString("f1"), " B/S");
            return Concat(speed.ToString("f1"), " B/S");
        }
    }
    /// <summary>
    /// 预热对象池(在应用启动时调用)
    /// </summary>
    public static void WarmupPool(int count = 4)
    {
        // 预热不同容量的StringBuilder以适应不同场景
        for (int i = 0; i < count && _stringBuilderPool.Count < MAX_POOL_SIZE; i++)
        {
            _stringBuilderPool.Enqueue(new StringBuilder(DEFAULT_CAPACITY));
        }
    }
}