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();
|
|
[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<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
|
|
await UniTask.Delay(100);
|
return true;
|
}
|
|
public PlatformType GetPlatformType()
|
{
|
return PlatformType.WeChat;
|
}
|
|
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
|
|
// 模拟登录成功(实际需要通过回调获取)
|
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}");
|
|
#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}");
|
|
#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<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
|
}
|
|
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
|
}
|
|
public async UniTask<string> DownloadFileAsync(string url, string localPath, Action<float> 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",
|
_ => ""
|
};
|
}
|
}
|