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",
_ => ""
};
}
}