using System; using System.Runtime.InteropServices; using Cysharp.Threading.Tasks; using UnityEngine; /// /// 微信小游戏平台实现 /// public class WeChatPlatform : IPlatformService { #if UNITY_WEBGL && !UNITY_EDITOR // JavaScript 插件方法声明 [DllImport("__Internal")] private static extern void WX_Init(); [DllImport("__Internal")] private static extern void WX_Login(string callbackObjectName, string callbackMethodName); [DllImport("__Internal")] private static extern void WX_GetSystemInfo(string callbackObjectName, string callbackMethodName); [DllImport("__Internal")] private static extern void WX_ShareAppMessage(string title, string imageUrl); [DllImport("__Internal")] private static extern void WX_CreateRewardedVideoAd(string adUnitId, string callbackObjectName, string callbackMethodName); [DllImport("__Internal")] private static extern void WX_SetStorageSync(string key, string value); [DllImport("__Internal")] private static extern string WX_GetStorageSync(string key); [DllImport("__Internal")] private static extern void WX_VibrateShort(); [DllImport("__Internal")] private static extern void WX_VibrateLong(); #endif private SystemInfo _cachedSystemInfo; private bool _isInitialized = false; public async UniTask InitAsync() { Debug.Log("[WeChatPlatform] 初始化微信小游戏平台"); #if UNITY_WEBGL && !UNITY_EDITOR try { WX_Init(); _isInitialized = true; Debug.Log("[WeChatPlatform] 微信SDK初始化成功"); } catch (Exception e) { Debug.LogError($"[WeChatPlatform] 微信SDK初始化失败: {e.Message}"); return false; } #else Debug.LogWarning("[WeChatPlatform] 非WebGL平台,使用模拟模式"); _isInitialized = true; #endif await UniTask.Delay(100); return true; } public PlatformType GetPlatformType() { return PlatformType.WeChat; } public async UniTask LoginAsync() { Debug.Log("[WeChatPlatform] 微信登录"); #if UNITY_WEBGL && !UNITY_EDITOR // TODO: 实现回调机制 // WX_Login("WeChatPlatform", "OnLoginCallback"); await UniTask.Delay(1000); // 等待回调 #else await UniTask.Delay(500); #endif // 模拟登录成功(实际需要通过回调获取) return new LoginResult { Success = true, UserId = "wx_user_mock", Nickname = "微信用户", AvatarUrl = "https://example.com/avatar.jpg", ErrorMessage = null }; } public async UniTask ShareAsync(ShareData shareData) { Debug.Log($"[WeChatPlatform] 分享到微信: {shareData.Title}"); #if UNITY_WEBGL && !UNITY_EDITOR try { WX_ShareAppMessage(shareData.Title, shareData.ImageUrl); await UniTask.Delay(300); return true; } catch (Exception e) { Debug.LogError($"[WeChatPlatform] 分享失败: {e.Message}"); return false; } #else await UniTask.Delay(300); return true; #endif } public async UniTask ShowAdAsync(AdType adType) { Debug.Log($"[WeChatPlatform] 显示微信广告: {adType}"); #if UNITY_WEBGL && !UNITY_EDITOR // TODO: 实现广告回调 string adUnitId = GetAdUnitId(adType); // WX_CreateRewardedVideoAd(adUnitId, "WeChatPlatform", "OnAdCallback"); await UniTask.Delay(3000); #else await UniTask.Delay(2000); #endif return new AdResult { Success = true, Completed = true, ErrorMessage = null }; } public async UniTask SaveDataAsync(string key, string value) { Debug.Log($"[WeChatPlatform] 保存数据到微信存储: {key}"); #if UNITY_WEBGL && !UNITY_EDITOR try { WX_SetStorageSync(key, value); await UniTask.Delay(50); return true; } catch (Exception e) { Debug.LogError($"[WeChatPlatform] 保存数据失败: {e.Message}"); return false; } #else await UniTask.Delay(50); PlayerPrefs.SetString(key, value); PlayerPrefs.Save(); return true; #endif } public async UniTask LoadDataAsync(string key) { Debug.Log($"[WeChatPlatform] 从微信存储加载数据: {key}"); #if UNITY_WEBGL && !UNITY_EDITOR try { await UniTask.Delay(50); return WX_GetStorageSync(key); } catch (Exception e) { Debug.LogError($"[WeChatPlatform] 加载数据失败: {e.Message}"); return null; } #else await UniTask.Delay(50); return PlayerPrefs.GetString(key, null); #endif } public async UniTask DownloadFileAsync(string url, string localPath, Action onProgress = null) { Debug.Log($"[WeChatPlatform] 下载文件: {url}"); // TODO: 实现微信文件下载API // wx.downloadFile({ url, success, fail }) // 模拟下载 for (int i = 0; i <= 10; i++) { await UniTask.Delay(100); onProgress?.Invoke(i / 10f); } return localPath; } public SystemInfo GetSystemInfo() { if (_cachedSystemInfo == null) { #if UNITY_WEBGL && !UNITY_EDITOR // TODO: 从微信API获取系统信息 // WX_GetSystemInfo("WeChatPlatform", "OnSystemInfoCallback"); #endif _cachedSystemInfo = new SystemInfo { DeviceModel = UnityEngine.SystemInfo.deviceModel, SystemVersion = UnityEngine.SystemInfo.operatingSystem, PlatformVersion = "WeChat 8.0.0", ScreenWidth = Screen.width, ScreenHeight = Screen.height, SafeArea = SafeAreaData.FromRect(Screen.safeArea), PixelRatio = Screen.dpi / 160f }; } return _cachedSystemInfo; } public void Vibrate(VibrationType vibrationType) { Debug.Log($"[WeChatPlatform] 震动: {vibrationType}"); #if UNITY_WEBGL && !UNITY_EDITOR try { if (vibrationType == VibrationType.Heavy) WX_VibrateLong(); else WX_VibrateShort(); } catch (Exception e) { Debug.LogError($"[WeChatPlatform] 震动失败: {e.Message}"); } #endif } private string GetAdUnitId(AdType adType) { // TODO: 从配置文件读取广告位ID return adType switch { AdType.Video => "adunit-xxxxxx", AdType.Banner => "adunit-yyyyyy", AdType.Interstitial => "adunit-zzzzzz", _ => "" }; } }