三国卡牌客户端基础资源仓库
hch
8 天以前 d1d7a6dcbd4bd0d689d0d379d2d887d01b0beacb
0312 优化字符串拼接函数
12个文件已修改
223 ■■■■■ 已修改文件
Assets/Editor/ConfigGen/ConfigClassGenerate.cs 90 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/Tool/AssetBundleBuildExtersion.cs 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/Tool/AssetsVersionCmpMaker.cs 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/Tool/AssetsVersionMaker.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/Tool/BytesVersionMaker.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/Tool/ClientPackage.cs 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/Tool/ClientPackage_Standalone.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/Tool/SpriteManageTool.cs 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/Tool/UpdateSpritePackingSetting.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Launch/Common/FileExtersion.cs 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Launch/UI/LaunchWins/LaunchExWin.cs 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Launch/Utility/StringUtility.cs 73 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/ConfigGen/ConfigClassGenerate.cs
@@ -351,132 +351,132 @@
        field = field.Replace(" ", "");
        if (type.Contains("Dictionary<int, int[][]>"))
        {
            return StringUtility.Contact(field, " = ConfigParse.ParseIntArray2Dict(tables", "[", index, "].Replace(\"(\", \"[\").Replace(\")\", \"]\")); ");
            return StringUtility.Concat(field, " = ConfigParse.ParseIntArray2Dict(tables", "[", index.ToString(), "].Replace(\"(\", \"[\").Replace(\")\", \"]\")); ");
        }
        else if (type.Contains("int[][]"))
        {
            return StringUtility.Contact(field, " = JsonMapper.ToObject<int[][]>(tables", "[", index, "].Replace(\"(\", \"[\").Replace(\")\", \"]\")); ");
            return StringUtility.Concat(field, " = JsonMapper.ToObject<int[][]>(tables", "[", index.ToString(), "].Replace(\"(\", \"[\").Replace(\")\", \"]\")); ");
        }
        else if (type.Contains("Dictionary<int, int>"))
        {
            return StringUtility.Contact(field, " = ConfigParse.ParseIntDict(tables", "[", index, "]); ");
            return StringUtility.Concat(field, " = ConfigParse.ParseIntDict(tables", "[", index.ToString(), "]); ");
        }
        else if (type.Contains("Dictionary<int, int[]>"))
        {
            return StringUtility.Contact(field, " = ConfigParse.ParseIntArrayDict(tables", "[", index, "]); ");
            return StringUtility.Concat(field, " = ConfigParse.ParseIntArrayDict(tables", "[", index.ToString(), "]); ");
        }
        else if (type.Contains("float[][]"))
        {
            return StringUtility.Contact(field, " = JsonMapper.ToObject<float[][]>(tables", "[", index, "].Replace(\"(\", \"[\").Replace(\")\", \"]\")); ");
            return StringUtility.Concat(field, " = JsonMapper.ToObject<float[][]>(tables", "[", index.ToString(), "].Replace(\"(\", \"[\").Replace(\")\", \"]\")); ");
        }
        else if (type.Contains("int[]"))
        {
            var line0 = StringUtility.Contact("if (tables", "[", index, "].Contains(\"[\"))\n");
            var line0 = StringUtility.Contact("if (tables", "[", index.ToString(), "].Contains(\"[\"))\n");
            var line0_1 = StringUtility.Contact(retract3, "{\n");
            var line0_2 = StringUtility.Contact(retract4, field, " = JsonMapper.ToObject<int[]>(tables", "[", index, "]);\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 line1 = StringUtility.Contact(retract4, "string[] ", field, "StringArray", " = ", "tables", "[", index, "]", ".Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);", "\n");
            var line2 = StringUtility.Contact(retract4, field, " = ", "new int", "[", field, "StringArray.Length]", ";", "\n");
            var line3 = StringUtility.Contact(retract4, "for (int i=0;i<", field, "StringArray", ".Length", ";", "i++", ")", "\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 line5 = StringUtility.Contact(retract5, " int.TryParse(", field, "StringArray", "[i]", ",", "out ", field, "[i]", ")", ";", "\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, "}");
            return StringUtility.Contact(line0, line0_1, line0_2, line0_3, line0_4, line0_5, line1, line2, line3, line4, line5, line6, line0_6);
            return StringUtility.Concat(line0, line0_1, line0_2, line0_3, line0_4, line0_5, line1, line2, line3, line4, line5, line6, line0_6);
        }
        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 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 line5 = StringUtility.Contact(retract4, " Int2.TryParse(", field, "StringArray", "[i]", ",", "out ", field, "[i]", ")", ";", "\n");
            var line5 = StringUtility.Concat(retract4, " Int2.TryParse(", field, "StringArray", "[i]", ",", "out ", field, "[i]", ")", ";", "\n");
            var line6 = StringUtility.Contact(retract3, "}");
            return StringUtility.Contact(line1, line2, line3, line4, line5, line6);
            return StringUtility.Concat(line1, line2, line3, line4, line5, line6);
        }
        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 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 line5 = StringUtility.Contact(retract4, " Int3.TryParse(", field, "StringArray", "[i]", ",", "out ", field, "[i]", ")", ";", "\n");
            var line5 = StringUtility.Concat(retract4, " Int3.TryParse(", field, "StringArray", "[i]", ",", "out ", field, "[i]", ")", ";", "\n");
            var line6 = StringUtility.Contact(retract3, "}");
            return StringUtility.Contact(line1, line2, line3, line4, line5, line6);
            return StringUtility.Concat(line1, line2, line3, line4, line5, line6);
        }
        else if (type.Contains("float[]"))
        {
            var line0 = StringUtility.Contact("if (tables", "[", index, "].Contains(\"[\"))\n");
            var line0 = StringUtility.Contact("if (tables", "[", index.ToString(), "].Contains(\"[\"))\n");
            var line0_1 = StringUtility.Contact(retract3, "{\n");
            var line0_2 = StringUtility.Contact(retract4, field, " = JsonMapper.ToObject<float[]>(tables", "[", index, "]);\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 line1 = StringUtility.Contact(retract4, "string[] ", field, "StringArray", " = ", "tables", "[", index, "]", ".Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);", "\n");
            var line2 = StringUtility.Contact(retract4, field, " = ", "new float", "[", field, "StringArray.Length", "]", ";", "\n");
            var line3 = StringUtility.Contact(retract4, "for (int i=0;i<", field, "StringArray", ".Length", ";", "i++", ")", "\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 line5 = StringUtility.Contact(retract5, " float.TryParse(", field, "StringArray", "[i]", ",", "out ", field, "[i]", ")", ";", "\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, "}");
            return StringUtility.Contact(line0, line0_1, line0_2, line0_3, line0_4, line0_5, line1, line2, line3, line4, line5, line6, line0_6);
            return StringUtility.Concat(line0, line0_1, line0_2, line0_3, line0_4, line0_5, line1, line2, line3, line4, line5, line6, line0_6);
        }
        else if (type.Contains("string[]"))
        {
            var line1 = StringUtility.Contact(field, " = ", "tables", "[", index, "]", ".Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);");
            var line1 = StringUtility.Concat(field, " = ", "tables", "[", index.ToString(), "]", ".Trim().Split(StringUtility.splitSeparator,StringSplitOptions.RemoveEmptyEntries);");
            return line1;
        }
        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 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 line5 = StringUtility.Contact(retract4, field, "[i]", "=", field, "StringArray", "[i]", ".Vector3Parse()", ";", "\n");
            var line5 = StringUtility.Concat(retract4, field, "[i]", "=", field, "StringArray", "[i]", ".Vector3Parse()", ";", "\n");
            var line6 = StringUtility.Contact(retract3, "}");
            return StringUtility.Contact(line1, line2, line3, line4, line5, line6);
            return StringUtility.Concat(line1, line2, line3, line4, line5, line6);
        }
        else if (type.Contains("int"))
        {
            return StringUtility.Contact("int.TryParse(tables", "[", index, "]", ",", "out ", field, ")", "; ");
            return StringUtility.Concat("int.TryParse(tables", "[", index.ToString(), "]", ",", "out ", field, ")", "; ");
        }
        else if (type.Contains("long"))
        {
            return StringUtility.Contact("long.TryParse(tables", "[", index, "]", ",", "out ", field, ")", "; ");
            return StringUtility.Concat("long.TryParse(tables", "[", index.ToString(), "]", ",", "out ", field, ")", "; ");
        }
        else if (type.Contains("float"))
        {
            return StringUtility.Contact("float.TryParse(tables", "[", index, "]", ",", "out ", field, ")", "; ");
            return StringUtility.Concat("float.TryParse(tables", "[", index.ToString(), "]", ",", "out ", field, ")", "; ");
        }
        else if (type.Contains("string"))
        {
            return StringUtility.Contact(field, " = ", "tables", "[", index, "]", ";");
            return StringUtility.Concat(field, " = ", "tables", "[", index.ToString(), "]", ";");
        }
        else if (type.Contains("Vector3"))
        {
            return StringUtility.Contact(field, "=", "tables", "[", index, "]", ".Vector3Parse()", ";");
            return StringUtility.Concat(field, "=", "tables", "[", index.ToString(), "]", ".Vector3Parse()", ";");
        }
        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", ";");
            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);
        }
        else if (type.Contains("Int2"))
        {
            return StringUtility.Contact("Int2.TryParse(tables", "[", index, "]", ",", "out ", field, ")", "; ");
            return StringUtility.Concat("Int2.TryParse(tables", "[", index.ToString(), "]", ",", "out ", field, ")", "; ");
        }
        else if (type.Contains("Int3"))
        {
            return StringUtility.Contact("Int3.TryParse(tables", "[", index, "]", ",", "out ", field, ")", "; ");
            return StringUtility.Concat("Int3.TryParse(tables", "[", index.ToString(), "]", ",", "out ", field, ")", "; ");
        }
        else
        {
Assets/Editor/Tool/AssetBundleBuildExtersion.cs
@@ -47,11 +47,11 @@
            assets.Add(assetBundleBuild);
        }
        var rootPath = StringUtility.Contact(output, Path.AltDirectorySeparatorChar, category);
        var mainFile = StringUtility.Contact(output, Path.AltDirectorySeparatorChar, GetMainFestFileName(buildTarget));//改名字前
        var mainFileRename = StringUtility.Contact(output, Path.AltDirectorySeparatorChar, AssetVersionUtility.EncodeFileName(category), "_assetbundle");//改名字后
        var manifest = StringUtility.Contact(output, Path.AltDirectorySeparatorChar, GetMainFestFileName(buildTarget), ".manifest");
        var manifestRename = StringUtility.Contact(output, Path.AltDirectorySeparatorChar, AssetVersionUtility.EncodeFileName(category), "_assetbundle.manifest");
        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");
        if (rebuild && Directory.Exists(rootPath))
            Directory.Delete(rootPath, true);
Assets/Editor/Tool/AssetsVersionCmpMaker.cs
@@ -48,7 +48,7 @@
            fileSize = fileInfo.Length;
            md5 = FileExtersion.GetMD5HashFromFile(fileInfo.FullName);
            lines.Add(StringUtility.Contact(relativePath, "\t", extersion, "\t", fileSize, "\t", md5));
            lines.Add(StringUtility.Concat(relativePath, "\t", extersion, "\t", fileSize.ToString(), "\t", md5));
        }
        var assetVersionFile = StringUtility.Contact(Application.dataPath, "/Resources/AssetsVersionCmp.txt");
Assets/Editor/Tool/AssetsVersionMaker.cs
@@ -39,16 +39,16 @@
            fileSize = fileInfo.Length;
            md5 = FileExtersion.GetMD5HashFromFile(fileInfo.FullName);
            lines.Add(StringUtility.Contact(relativePath, "\t", extersion, "\t", fileSize, "\t", md5));
            lines.Add(StringUtility.Concat(relativePath, "\t", extersion, "\t", fileSize.ToString(), "\t", md5));
        }
        var assetVersionFile = StringUtility.Contact(_path, Path.DirectorySeparatorChar, "AssetsVersion.txt");
        var assetVersionFile = StringUtility.Contact(_path, Path.DirectorySeparatorChar.ToString(), "AssetsVersion.txt");
        if (File.Exists(assetVersionFile))
        {
            File.Delete(assetVersionFile);
        }
        File.WriteAllText(StringUtility.Contact(_path, Path.DirectorySeparatorChar, "AssetsVersion.txt"), string.Join(FileExtersion.lineSplit, lines.ToArray()));
        File.WriteAllText(StringUtility.Contact(_path, Path.DirectorySeparatorChar.ToString(), "AssetsVersion.txt"), string.Join(FileExtersion.lineSplit, lines.ToArray()));
    }
}
Assets/Editor/Tool/BytesVersionMaker.cs
@@ -31,16 +31,16 @@
            fileSize = fileInfo.Length;
            md5 = FileExtersion.GetMD5HashFromFile(fileInfo.FullName);
            lines.Add(StringUtility.Contact(relativePath, "\t", extersion, "\t", fileSize, "\t", md5));
            lines.Add(StringUtility.Concat(relativePath, "\t", extersion, "\t", fileSize.ToString(), "\t", md5));
        }
        var assetVersionFile = StringUtility.Contact(_path, Path.DirectorySeparatorChar, "logicbytes.txt");
        var assetVersionFile = StringUtility.Contact(_path, Path.DirectorySeparatorChar.ToString(), "logicbytes.txt");
        if (File.Exists(assetVersionFile))
        {
            File.Delete(assetVersionFile);
        }
        File.WriteAllText(StringUtility.Contact(_path, Path.DirectorySeparatorChar, "logicbytes.txt"), string.Join(FileExtersion.lineSplit, lines.ToArray()));
        File.WriteAllText(StringUtility.Contact(_path, Path.DirectorySeparatorChar.ToString(), "logicbytes.txt"), string.Join(FileExtersion.lineSplit, lines.ToArray()));
    }
}
Assets/Editor/Tool/ClientPackage.cs
@@ -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, "Resources/Config/AuditTime.txt");
        var auditTimeFile = StringUtility.Contact(Application.dataPath, Path.DirectorySeparatorChar.ToString(), "Resources/Config/AuditTime.txt");
        if (File.Exists(auditTimeFile))
        {
            File.Delete(auditTimeFile);
@@ -485,7 +485,7 @@
        string channelSdkPath;
        string copySdkFile;
        channelSdkPath = StringUtility.Contact(_sdkPath, "/Channel/Android/", versionConfig.sdkFileName, "/", variant);
        channelSdkPath = StringUtility.Concat(_sdkPath, "/Channel/Android/", versionConfig.sdkFileName, "/", variant);
        copySdkFile = StringUtility.Contact(_sdkPath, "/Channel/Android/", versionConfig.sdkFileName, "/AndroidManifest.xml");
        File.Copy(copySdkFile, MANIFEST_PATH);
        copySdkFile = StringUtility.Contact(_sdkPath, "/Channel/Android/", versionConfig.sdkFileName, "/baseProjectTemplate.gradle");
@@ -539,7 +539,7 @@
        if (_development)
        {
            var apkName = StringUtility.Contact(_output, "/", versionName, "_", versionConfig.clientPackageFlag, "_v", versionConfig.m_Version, "_", _buildIndex, "_development.apk");
            var apkName = StringUtility.Concat(_output, "/", versionName, "_", versionConfig.clientPackageFlag, "_v", versionConfig.m_Version, "_", _buildIndex.ToString(), "_development.apk");
            BuildPipeline.BuildPlayer(baseLevels, apkName, BuildTarget.Android, BuildOptions.Development | BuildOptions.ConnectWithProfiler | BuildOptions.AllowDebugging);
        }
        else
@@ -548,12 +548,12 @@
            if (EditorUserBuildSettings.buildAppBundle)
            {
                Debug.Log("勾选了 Build App Bundle (Google Play) 打包aab");
                apkName = StringUtility.Contact(_output, "/", versionName, "_", versionConfig.clientPackageFlag, "_v", versionConfig.m_Version, "_", _buildIndex, ".aab");
                apkName = StringUtility.Concat(_output, "/", versionName, "_", versionConfig.clientPackageFlag, "_v", versionConfig.m_Version, "_", _buildIndex.ToString(), ".aab");
            }
            else
            {
                Debug.Log("没有勾选 Build App Bundle (Google Play) 打包apk");
                apkName = StringUtility.Contact(_output, "/", versionName, "_", versionConfig.clientPackageFlag, "_v", versionConfig.m_Version, "_", _buildIndex, ".apk");
                apkName = StringUtility.Concat(_output, "/", versionName, "_", versionConfig.clientPackageFlag, "_v", versionConfig.m_Version, "_", _buildIndex.ToString(), ".apk");
            }
            BuildPipeline.BuildPlayer(baseLevels, apkName, BuildTarget.Android, BuildOptions.None);
        }
Assets/Editor/Tool/ClientPackage_Standalone.cs
@@ -333,12 +333,12 @@
        if (development)
        {
            var name = StringUtility.Contact(output, "/", versionName, "_", versionConfig.clientPackageFlag, "_v", versionConfig.m_Version, "_", buildIndex, "_development.exe");
            var name = StringUtility.Concat(output, "/", versionName, "_", versionConfig.clientPackageFlag, "_v", versionConfig.m_Version, "_", buildIndex.ToString(), "_development.exe");
            BuildPipeline.BuildPlayer(baseLevels, name, BuildTarget.StandaloneWindows, BuildOptions.Development | BuildOptions.ConnectWithProfiler | BuildOptions.AllowDebugging);
        }
        else
        {
            var name = StringUtility.Contact(output, "/", versionName, "_", versionConfig.clientPackageFlag, "_v", versionConfig.m_Version, "_", buildIndex, ".exe");
            var name = StringUtility.Concat(output, "/", versionName, "_", versionConfig.clientPackageFlag, "_v", versionConfig.m_Version, "_", buildIndex.ToString(), ".exe");
            BuildPipeline.BuildPlayer(baseLevels, name, BuildTarget.StandaloneWindows, BuildOptions.None);
        }
    }
Assets/Editor/Tool/SpriteManageTool.cs
@@ -245,7 +245,7 @@
                    var _detail = _list[i];
                    var _fatherDetail = _detail.fatherDetail;
                    GUILayout.BeginHorizontal();
                    GUILayout.Label(StringUtility.Contact(i + 1, ".", "Path: "));
                    GUILayout.Label(StringUtility.Contact((i + 1).ToString(), ".", "Path: "));
                    var _path = StringUtility.Contact(_detail.fatherDetail, _fatherDetail == string.Empty ? string.Empty : "/", _detail.name);
                    GUILayout.TextField(_path);
                    if (_fatherDetail != string.Empty && GUILayout.Button("Goto"))
@@ -288,7 +288,7 @@
            }
            GUILayout.BeginHorizontal();
            var _fatherDetail = _detail.fatherDetail;
            GUILayout.Label(StringUtility.Contact(i + 1, ".", "Path: "));
            GUILayout.Label(StringUtility.Contact((i + 1).ToString(), ".", "Path: "));
            var _path = StringUtility.Contact(_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, "/", _list.Count), (float)_index / (float)_list.Count);
                    StringUtility.Contact(_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, "/", _keys.Count), (float)_index / (float)_keys.Count);
                            StringUtility.Contact(_index.ToString(), "/", _keys.Count.ToString()), (float)_index / (float)_keys.Count);
                        _index++;
                        if (isCancel || _index >= _keys.Count)
                        {
Assets/Editor/Tool/UpdateSpritePackingSetting.cs
@@ -26,7 +26,7 @@
        foreach (var setting in so.spriteSettings)
        {
            var directoryPath = StringUtility.Contact(rootPath, Path.DirectorySeparatorChar, setting.folderName);
            var directoryPath = StringUtility.Contact(rootPath, Path.DirectorySeparatorChar.ToString(), setting.folderName);
            if (!Directory.Exists(directoryPath))
            {
@@ -164,7 +164,7 @@
        int index = 0;
        foreach (SpriteSettingConfig.SpriteSetting setting in so.spriteSettings)
        {
            var directoryPath = StringUtility.Contact(rootPath, Path.DirectorySeparatorChar, setting.folderName);
            var directoryPath = StringUtility.Contact(rootPath, Path.DirectorySeparatorChar.ToString(), setting.folderName);
            if (!Directory.Exists(directoryPath))
            {
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, fileName);
            return StringUtility.Contact(Path.GetDirectoryName(_fullName), Path.DirectorySeparatorChar.ToString(), fileName);
        }
        else
        {
@@ -123,7 +123,7 @@
            fileName = fileName.Substring(0, index);
        }
        return StringUtility.Contact(Path.GetDirectoryName(_fullName), Path.DirectorySeparatorChar, _version, "_version_", fileName);
        return StringUtility.Concat(Path.GetDirectoryName(_fullName), Path.DirectorySeparatorChar.ToString(), _version.ToString(), "_version_", fileName);
    }
    public static void DirectoryCopy(string _from, string _to)
Assets/Launch/UI/LaunchWins/LaunchExWin.cs
@@ -67,7 +67,7 @@
            m_IosProgressContainer.gameObject.SetActive(false);
            //打包版本 + 功能版本 + 语言ID
            m_Version.text = StringUtility.Contact(VersionConfigEx.Get().version, "_", VersionConfigEx.Get().buildIndex,
            m_Version.text = StringUtility.Concat(VersionConfigEx.Get().version, "_", VersionConfigEx.Get().buildIndex.ToString(),
                "_", InitialFunctionConfig.Get("version").Numerical1, " ", LocalResManager.Id);
        }
@@ -117,13 +117,13 @@
        }
        if (ShowCircleView)
        {
            m_IosProgressTip.text = StringUtility.Contact(sliderText, " ", (int)(value * 100), "%");
            m_IosProgressTip.text = StringUtility.Contact(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), "%");
            m_StageDescription.text = StringUtility.Contact(sliderText, " ", ((int)(value * 100)).ToString(), "%");
        }
    }
Assets/Launch/Utility/StringUtility.cs
@@ -1,46 +1,89 @@
using UnityEngine;
using UnityEngine;
using System.Collections;
using System.Text;
using System;
public class StringUtility
{
    public static string[] splitSeparator = new string[] { "|" };
    public static readonly string[] splitSeparator = new string[] { "|" };
    private static StringBuilder s_CacheStringBuilder = new StringBuilder();
    static object lockObject = new object();
    // 新增:为循环调用的优化版本(复用StringBuilder)
    [ThreadStatic]
    private static StringBuilder _threadLocalStringBuilder;
    public static string Contact(params object[] _objects)
    /// <summary>
    /// 获取当前线程的StringBuilder
    /// </summary>
    private static StringBuilder GetThreadLocalStringBuilder()
    {
        lock (lockObject)
        if (_threadLocalStringBuilder == null)
        {
            s_CacheStringBuilder.Remove(0, s_CacheStringBuilder.Length);
            for (int i = 0; i < _objects.Length; ++i)
            _threadLocalStringBuilder = new StringBuilder();
        }
        return _threadLocalStringBuilder;
    }
    /// <summary>
    /// 智能字符串拼接方法,自动选择最优策略
    /// - 2-4个字符串:直接使用 string.Concat() (最高性能)
    /// - 5个以上字符串:使用线程本地 StringBuilder 复用 (循环优化)
    /// </summary>
    public static string Concat(params string[] _objects)
            {
                if (_objects[i] != null)
        // 少量字符串直接使用Concat,性能最佳
        if (_objects.Length <= 4)
                {
                    s_CacheStringBuilder.Append(_objects[i]);
            return string.Concat(_objects);
                }
        // 大量字符串使用线程本地StringBuilder,避免重复创建
        var sb = GetThreadLocalStringBuilder();
        sb.Clear();
        foreach (string str in _objects)
        {
            sb.Append(str);
            }
            return s_CacheStringBuilder.ToString();
        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);
    }
    public static string FormatSpeed(float speed)
    {
        if (speed > 1048576f)
        {
            return StringUtility.Contact((speed / 1048576f).ToString("f1"), " M/S");
            return Contact((speed / 1048576f).ToString("f1"), " M/S");
        }
        else if (speed > 1024f)
        {
            return StringUtility.Contact((speed / 1024f).ToString("f1"), " KB/S");
            return Contact((speed / 1024f).ToString("f1"), " KB/S");
        }
        else
        {
            return StringUtility.Contact(speed.ToString("f1"), " B/S");
        };
            return Contact(speed.ToString("f1"), " B/S");
        }
    }
}