三国卡牌客户端基础资源仓库
hch
2026-05-10 8b78fd8b00f2e4065df340d95c3219769b19b7b7
0312 新增导出工程给AS打包逻辑
2个文件已修改
171 ■■■■■ 已修改文件
Assets/Editor/AssetBundleBrowser/AssetBundleBuildTab.cs 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/Tool/ClientPackage.cs 101 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Assets/Editor/AssetBundleBrowser/AssetBundleBuildTab.cs
@@ -89,6 +89,12 @@
            set { LocalSave.SetString("APKOutPutPath", value); }
        }
        public string AndroidExportPath
        {
            get { return LocalSave.GetString("AndroidExportPath"); }
            set { LocalSave.SetString("AndroidExportPath", value); }
        }
        string m_Publishers;
        public string publishers
        {
@@ -229,6 +235,15 @@
            var fromVersionConfig = ClientPackage.GetVersionConfig(_publisher, out versionName);
            var versionConfig = VersionConfig.Get();
            if (fromVersionConfig == null || versionConfig == null)
            {
                Debug.LogWarningFormat("SetVersionConfig failed: fromVersionConfig={0}, versionConfig={1}, publisher={2}",
                    fromVersionConfig != null ? "ok" : "null",
                    versionConfig != null ? "ok" : "null",
                    _publisher);
                return;
            }
            VersionConfig.Copy(fromVersionConfig, versionConfig);
@@ -517,6 +532,28 @@
#endif
            GUILayout.EndHorizontal();
#if UNITY_ANDROID
            EditorGUILayout.Space();
            GUILayout.Label("Export Android Project", EditorStyles.boldLabel);
            GUILayout.BeginHorizontal();
            EditorGUILayout.TextField("Export Path", AndroidExportPath);
            if (GUILayout.Button("Browse", GUILayout.MaxWidth(75f)))
            {
                BrowseForAndroidExport();
            }
            GUILayout.EndHorizontal();
            GUILayout.BeginHorizontal();
            if (GUILayout.Button("Export Android Project"))
            {
                EditorApplication.delayCall += ExecuteExportAndroidProject;
            }
            if (GUILayout.Button("Export Android Dev"))
            {
                EditorApplication.delayCall += ExecuteExportAndroidProjectDev;
            }
            GUILayout.EndHorizontal();
#endif
            // GUILayout.Space(20);
            // if (GUILayout.Button("SwitchVersionConfig"))
@@ -1038,6 +1075,30 @@
            ClientPackage.BuildPublishers(ClientPackage.SDK_PLUGIN_PROJECT, outputPath, ApkOutputPath, publishers, packageIndex, true, false);
        }
        private void ExecuteExportAndroidProject()
        {
            if (string.IsNullOrEmpty(AndroidExportPath))
            {
                EditorUtility.DisplayDialog("提示", "请先设置 Android Export Path", "确定");
                return;
            }
            packageIndex++;
            var assetBundlePath = Application.dataPath.Replace("Assets", m_UserData.m_OutputPath);
            ClientPackage.ExportAndroidProject(publishers, packageIndex, false, AndroidExportPath, assetBundlePath);
        }
        private void ExecuteExportAndroidProjectDev()
        {
            if (string.IsNullOrEmpty(AndroidExportPath))
            {
                EditorUtility.DisplayDialog("提示", "请先设置 Android Export Path", "确定");
                return;
            }
            packageIndex++;
            var assetBundlePath = Application.dataPath.Replace("Assets", m_UserData.m_OutputPath);
            ClientPackage.ExportAndroidProject(publishers, packageIndex, true, AndroidExportPath, assetBundlePath);
        }
        private void ExecuteBuildClientPackageStandalone()
        {
            packageIndex++;
@@ -1153,6 +1214,15 @@
            }
        }
        private void BrowseForAndroidExport()
        {
            var newPath = EditorUtility.OpenFolderPanel("Android Export Folder", AndroidExportPath, string.Empty);
            if (!string.IsNullOrEmpty(newPath))
            {
                AndroidExportPath = newPath;
            }
        }
        private void ResetPathToDefault()
        {
            m_UserData.m_UseDefaultPath = true;
Assets/Editor/Tool/ClientPackage.cs
@@ -560,6 +560,107 @@
    }
    public static VersionConfig versionConfig1 = null;
    /// <summary>
    /// 导出Android工程给AS打包
    /// Unity只负责导出unityLibrary,SDK/Gradle/签名等均由AS工程处理
    /// </summary>
    public static void ExportAndroidProject(string _publisher, int _buildIndex, bool _development, string _outputPath, string _assetBundlePath)
    {
        PreBuild(_publisher, _buildIndex);
        var versionName = string.Empty;
        var versionConfig = GetVersionConfig(_publisher, out versionName);
        PlayerSettings.Android.bundleVersionCode = VersionConfig.GetVersionNumber(versionConfig.version);
        PlayerSettings.enableInternalProfiler = _development;
        // 先清理StreamingAssets,再从AssetBundles目录拷贝资源到StreamingAssets
        // 这样BuildPlayer导出工程时才会包含游戏资源
        var streamingPath = ResourcesPath.Instance.StreamingAssetPath;
        if (Directory.Exists(streamingPath))
            Directory.Delete(streamingPath, true);
        if (!string.IsNullOrEmpty(_assetBundlePath) && Directory.Exists(_assetBundlePath))
        {
            var files = new List<FileInfo>();
            FileExtersion.GetAllDirectoryFileInfos(_assetBundlePath, files);
            foreach (var file in files)
            {
                var extension = Path.GetExtension(file.FullName);
                if (extension == ".meta")
                    continue;
                var relativePath = FileExtersion.GetFileRelativePath(_assetBundlePath, file.FullName);
                if (relativePath.StartsWith("patch"))
                    continue;
                var to = StringUtility.Concat(streamingPath, relativePath);
                var directory = Path.GetDirectoryName(to);
                if (!Directory.Exists(directory))
                    Directory.CreateDirectory(directory);
                File.Copy(file.FullName, to, true);
            }
            Debug.LogFormat("资源拷贝完成,从 {0} 到 {1}", _assetBundlePath, streamingPath);
        }
        else
        {
            Debug.LogWarningFormat("AssetBundle路径为空或不存在: {0},导出工程将不包含游戏资源", _assetBundlePath);
        }
        // 清理Unity端旧的Android插件文件,避免导出工程时带入SDK相关文件(由AS处理)
        if (Directory.Exists(THE_2TH_WORLD_SDK_PATH))
            Directory.Delete(THE_2TH_WORLD_SDK_PATH, true);
        if (File.Exists(MANIFEST_PATH))
            File.Delete(MANIFEST_PATH);
        if (File.Exists(File_baseProjectTemplate))
            File.Delete(File_baseProjectTemplate);
        if (File.Exists(File_google_services))
            File.Delete(File_google_services);
        if (File.Exists(File_gradleTemplate))
            File.Delete(File_gradleTemplate);
        if (File.Exists(File_LauncherManifest))
            File.Delete(File_LauncherManifest);
        if (File.Exists(File_launcherTemplate))
            File.Delete(File_launcherTemplate);
        if (File.Exists(File_mainTemplate))
            File.Delete(File_mainTemplate);
        if (File.Exists(File_deps))
            File.Delete(File_deps);
        if (File.Exists(File_huawei_services))
            File.Delete(File_huawei_services);
        if (File.Exists(File_settingGradle))
            File.Delete(File_settingGradle);
        AssetDatabase.SaveAssets();
        AssetDatabase.Refresh();
        // 关键设置:导出为Gradle工程而非直接打APK
        EditorUserBuildSettings.exportAsGoogleAndroidProject = true;
        EditorUserBuildSettings.androidBuildSystem = AndroidBuildSystem.Gradle;
        // 导出路径
        string outputDir = Path.Combine(_outputPath, versionName + "_" + versionConfig.clientPackageFlag);
        if (Directory.Exists(outputDir))
        {
            Directory.Delete(outputDir, true);
        }
        Debug.LogFormat("开始导出Android工程,输出路径: {0}", outputDir);
        BuildPipeline.BuildPlayer(baseLevels, outputDir, BuildTarget.Android,
            _development ? BuildOptions.AcceptExternalModificationsToPlayer | BuildOptions.Development | BuildOptions.AllowDebugging
                         : BuildOptions.AcceptExternalModificationsToPlayer);
        Debug.LogFormat("导出Android工程完成!输出路径: {0}", outputDir);
        Debug.LogFormat("请将unityLibrary目录内容更新到AS工程中,然后在AS中进行打包");
        // 导出完成后恢复设置
        EditorUserBuildSettings.exportAsGoogleAndroidProject = false;
    }
    public static void BuildIpa(string _sdkPath, string _publisher, int _buildIndex, bool _replace)
    {
        PreBuild(_publisher, _buildIndex);