| | |
| | | using System; |
| | | using System.Runtime.InteropServices; |
| | | using Cysharp.Threading.Tasks; |
| | | using UnityEngine; |
| | | // using System; |
| | | // using System.Runtime.InteropServices; |
| | | // using Cysharp.Threading.Tasks; |
| | | // using UnityEngine; |
| | | |
| | | /// <summary> |
| | | /// 微信小游戏平台实现 |
| | | /// </summary> |
| | | public class WeChatPlatform : IPlatformService |
| | | { |
| | | #if UNITY_WEBGL && !UNITY_EDITOR |
| | | // JavaScript 插件方法声明 |
| | | [DllImport("__Internal")] |
| | | private static extern void WX_Init(); |
| | | // /// <summary> |
| | | // /// 微信小游戏平台实现 |
| | | // /// </summary> |
| | | // 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_Login(string callbackObjectName, string callbackMethodName); |
| | | |
| | | [DllImport("__Internal")] |
| | | private static extern void WX_GetSystemInfo(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_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_CreateRewardedVideoAd(string adUnitId, string callbackObjectName, string callbackMethodName); |
| | | |
| | | [DllImport("__Internal")] |
| | | private static extern void WX_SetStorageSync(string key, string value); |
| | | // [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 string WX_GetStorageSync(string key); |
| | | |
| | | [DllImport("__Internal")] |
| | | private static extern void WX_VibrateShort(); |
| | | // [DllImport("__Internal")] |
| | | // private static extern void WX_VibrateShort(); |
| | | |
| | | [DllImport("__Internal")] |
| | | private static extern void WX_VibrateLong(); |
| | | #endif |
| | | // [DllImport("__Internal")] |
| | | // private static extern void WX_VibrateLong(); |
| | | // #endif |
| | | |
| | | private SystemInfo _cachedSystemInfo; |
| | | private bool _isInitialized = false; |
| | | // private SystemInfo _cachedSystemInfo; |
| | | // private bool _isInitialized = false; |
| | | |
| | | public async UniTask<bool> InitAsync() |
| | | { |
| | | Debug.Log("[WeChatPlatform] 初始化微信小游戏平台"); |
| | | // public async UniTask<bool> 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 |
| | | // #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; |
| | | } |
| | | // await UniTask.Delay(100); |
| | | // return true; |
| | | // } |
| | | |
| | | public PlatformType GetPlatformType() |
| | | { |
| | | return PlatformType.WeChat; |
| | | } |
| | | // public PlatformType GetPlatformType() |
| | | // { |
| | | // return PlatformType.WeChat; |
| | | // } |
| | | |
| | | public async UniTask<LoginResult> LoginAsync() |
| | | { |
| | | Debug.Log("[WeChatPlatform] 微信登录"); |
| | | // public async UniTask<LoginResult> LoginAsync() |
| | | // { |
| | | // Debug.Log("[WeChatPlatform] 微信登录"); |
| | | |
| | | #if UNITY_WEBGL && !UNITY_EDITOR |
| | | // TODO: 实现回调机制 |
| | | // WX_Login("WeChatPlatform", "OnLoginCallback"); |
| | | await UniTask.Delay(1000); // 等待回调 |
| | | #else |
| | | await UniTask.Delay(500); |
| | | #endif |
| | | // #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 |
| | | }; |
| | | } |
| | | // // 模拟登录成功(实际需要通过回调获取) |
| | | // return new LoginResult |
| | | // { |
| | | // Success = true, |
| | | // UserId = "wx_user_mock", |
| | | // Nickname = "微信用户", |
| | | // AvatarUrl = "https://example.com/avatar.jpg", |
| | | // ErrorMessage = null |
| | | // }; |
| | | // } |
| | | |
| | | public async UniTask<bool> ShareAsync(ShareData shareData) |
| | | { |
| | | Debug.Log($"[WeChatPlatform] 分享到微信: {shareData.Title}"); |
| | | // public async UniTask<bool> 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 |
| | | } |
| | | // #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<AdResult> ShowAdAsync(AdType adType) |
| | | { |
| | | Debug.Log($"[WeChatPlatform] 显示微信广告: {adType}"); |
| | | // public async UniTask<AdResult> 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 |
| | | // #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 |
| | | }; |
| | | } |
| | | // return new AdResult |
| | | // { |
| | | // Success = true, |
| | | // Completed = true, |
| | | // ErrorMessage = null |
| | | // }; |
| | | // } |
| | | |
| | | public async UniTask<bool> SaveDataAsync(string key, string value) |
| | | { |
| | | Debug.Log($"[WeChatPlatform] 保存数据到微信存储: {key}"); |
| | | // public async UniTask<bool> 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 |
| | | } |
| | | // #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<string> LoadDataAsync(string key) |
| | | { |
| | | Debug.Log($"[WeChatPlatform] 从微信存储加载数据: {key}"); |
| | | // public async UniTask<string> 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 |
| | | } |
| | | // #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<string> DownloadFileAsync(string url, string localPath, Action<float> onProgress = null) |
| | | { |
| | | Debug.Log($"[WeChatPlatform] 下载文件: {url}"); |
| | | // public async UniTask<string> DownloadFileAsync(string url, string localPath, Action<float> onProgress = null) |
| | | // { |
| | | // Debug.Log($"[WeChatPlatform] 下载文件: {url}"); |
| | | |
| | | // TODO: 实现微信文件下载API |
| | | // wx.downloadFile({ url, success, fail }) |
| | | // // TODO: 实现微信文件下载API |
| | | // // wx.downloadFile({ url, success, fail }) |
| | | |
| | | // 模拟下载 |
| | | for (int i = 0; i <= 10; i++) |
| | | { |
| | | await UniTask.Delay(100); |
| | | onProgress?.Invoke(i / 10f); |
| | | } |
| | | // // 模拟下载 |
| | | // for (int i = 0; i <= 10; i++) |
| | | // { |
| | | // await UniTask.Delay(100); |
| | | // onProgress?.Invoke(i / 10f); |
| | | // } |
| | | |
| | | return localPath; |
| | | } |
| | | // return localPath; |
| | | // } |
| | | |
| | | public SystemInfo GetSystemInfo() |
| | | { |
| | | if (_cachedSystemInfo == null) |
| | | { |
| | | #if UNITY_WEBGL && !UNITY_EDITOR |
| | | // TODO: 从微信API获取系统信息 |
| | | // WX_GetSystemInfo("WeChatPlatform", "OnSystemInfoCallback"); |
| | | #endif |
| | | // 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 |
| | | }; |
| | | } |
| | | // _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; |
| | | } |
| | | // return _cachedSystemInfo; |
| | | // } |
| | | |
| | | public void Vibrate(VibrationType vibrationType) |
| | | { |
| | | Debug.Log($"[WeChatPlatform] 震动: {vibrationType}"); |
| | | // 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 |
| | | } |
| | | // #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", |
| | | _ => "" |
| | | }; |
| | | } |
| | | } |
| | | // private string GetAdUnitId(AdType adType) |
| | | // { |
| | | // // TODO: 从配置文件读取广告位ID |
| | | // return adType switch |
| | | // { |
| | | // AdType.Video => "adunit-xxxxxx", |
| | | // AdType.Banner => "adunit-yyyyyy", |
| | | // AdType.Interstitial => "adunit-zzzzzz", |
| | | // _ => "" |
| | | // }; |
| | | // } |
| | | // } |