yyl
2026-03-26 1ab047b5fdd933c38ba0519ec2e83a44512ea8d7
Main/Core/Platform/WeChatPlatform.cs
@@ -1,256 +1,256 @@
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",
//                 _ => ""
//             };
//         }
//     }