#if UNITY_WEBGL using UnityEditor; using UnityEditor.PackageManager; using UnityEditor.PackageManager.Requests; using UnityEngine; using System.IO; namespace LeviathanVideo.Editor { public static class WeChatMiniGameMenu { private const string SourcePath = "Assets/WX-WASM-SDK-V2-v0.1.32~"; private const string TargetPath = "Assets/WX-WASM-SDK-V2"; private const string LeviathanWasmPath = "Assets/WX-WASM-SDK-V2/Editor/template/minigame/leviathan.wasm.br"; private const string WeChatSDKGitUrl = "https://github.com/wechat-miniprogram/minigame-tuanjie-transform-sdk.git"; private static AddRequest _addRequest; // 验证函数:只在 WX-WASM-SDK-V2 文件夹不存在时启用 [MenuItem("微信小游戏/[LeviathanVideo] 安装微信SDK", true)] public static bool ValidateInstallWeChatSDK() { return !Directory.Exists(TargetPath); } [MenuItem("微信小游戏/[LeviathanVideo] 安装微信SDK", false)] public static void InstallWeChatSDK() { Debug.Log($"[LeviathanVideo] 开始安装微信SDK: {WeChatSDKGitUrl}"); _addRequest = Client.Add(WeChatSDKGitUrl); EditorApplication.update += OnInstallProgress; } private static void OnInstallProgress() { if (_addRequest == null || !_addRequest.IsCompleted) return; EditorApplication.update -= OnInstallProgress; if (_addRequest.Status == StatusCode.Success) { Debug.Log($"[LeviathanVideo] 微信SDK安装成功: {_addRequest.Result.packageId}"); EditorUtility.DisplayDialog("安装成功", $"微信小游戏SDK安装成功!\n\n包ID: {_addRequest.Result.packageId}\n\n请执行下一步操作:\n微信小游戏 -> [LeviathanVideo] ****首次安装微信SDK后需要执行此操作****", "确定"); } else if (_addRequest.Status >= StatusCode.Failure) { Debug.LogError($"[LeviathanVideo] 微信SDK安装失败: {_addRequest.Error.message}"); EditorUtility.DisplayDialog("安装失败", $"微信小游戏SDK安装失败!\n\n错误: {_addRequest.Error.message}", "确定"); } _addRequest = null; } // 验证函数:只在 leviathan.wasm.br 文件不存在时启用 [MenuItem("微信小游戏/[LeviathanVideo] ****首次安装微信SDK后需要执行此操作**** ", true)] public static bool ValidateCopyFiles() { // 需要 SDK 已安装 且 leviathan.wasm.br 文件不存在 return Directory.Exists(TargetPath) && !File.Exists(LeviathanWasmPath); } [MenuItem("微信小游戏/[LeviathanVideo] ****首次安装微信SDK后需要执行此操作**** ", false)] public static void CopyFiles() { string sourcePath = Path.GetFullPath(SourcePath); string targetPath = Path.GetFullPath(TargetPath); if (!Directory.Exists(sourcePath)) { EditorUtility.DisplayDialog("错误", $"源路径不存在: {sourcePath}", "确定"); return; } if (!Directory.Exists(targetPath)) { EditorUtility.DisplayDialog("错误", $"目标路径不存在: {targetPath}", "确定"); return; } try { CopyDirectory(sourcePath, targetPath); AssetDatabase.Refresh(); EditorUtility.DisplayDialog("完成", $"已将文件从\n{SourcePath}\n复制到\n{TargetPath}", "确定"); Debug.Log($"[Leviathan] 文件复制完成: {SourcePath} -> {TargetPath}"); } catch (System.Exception e) { EditorUtility.DisplayDialog("错误", $"复制文件时出错: {e.Message}", "确定"); Debug.LogError($"[Leviathan] 复制文件失败: {e}"); } } private static void CopyDirectory(string sourceDir, string targetDir) { // 复制所有文件 foreach (string file in Directory.GetFiles(sourceDir)) { string fileName = Path.GetFileName(file); string destFile = Path.Combine(targetDir, fileName); File.Copy(file, destFile, true); Debug.Log($"[Leviathan] 复制文件: {fileName}"); } // 递归复制所有子目录 foreach (string dir in Directory.GetDirectories(sourceDir)) { string dirName = Path.GetFileName(dir); string destDir = Path.Combine(targetDir, dirName); if (!Directory.Exists(destDir)) { Directory.CreateDirectory(destDir); } CopyDirectory(dir, destDir); } } } } #endif