# unity小游戏蜜罐插件
《unity小游戏蜜罐插件》可以为游戏内的关键数值生成蜜罐,若蜜罐被外挂修改,则通过回调API通知开发者,开发者可依据文档接入到自己的游戏中。
# 接入步骤
开发者需要在tuanjie引擎中添加来自git url的插件:https://github.com/wechat-miniprogram/minigame-tuanjie-transform-sdk.git#feat-wxmonitor,然后按照如下步骤接入使用,接入后务必做好充分测试再上线。
# 0. 引入命名空间
using WeChatWASM.GameProtect.Monitor;
# 1. 基础用法
// 存储数据
WXDataPlugin.Instance.Set("coins", 1000);
WXDataPlugin.Instance.Set("playerName", "Player1");
// 读取数据
int coins = WXDataPlugin.Instance.Get<int>("coins");
string name = WXDataPlugin.Instance.Get<string>("playerName");
# 2. 安全读取(推荐)
// 安全读取,避免异常
if (WXDataPlugin.Instance.TryGet<int>("coins", out int coins))
{
Debug.Log($"金币: {coins}");
}
else
{
Debug.LogWarning("读取金币失败,可能被篡改");
}
# 3. 订阅篡改事件
using WeChatWASM.GameProtect.Monitor;
private void Start()
{
// 订阅数据篡改事件
WXDataPlugin.Instance.DataTampered += OnDataTampered;
}
private void OnDataTampered(object sender, WXDataProtectionEventArgs e)
{
Debug.LogError($"检测到数据篡改!Key: {e.Key}");
// 实现反作弊逻辑
HandleTampering(e);
}
# API 参考
# 核心方法
| 方法 | 描述 |
|---|---|
| Set(string key, object value) | 存储数据 |
| Get<T>(string key) | 获取指定类型的数据 |
| Get(string key) | 获取数据(返回object) |
| TryGet<T>(string key, out T value) | 安全获取数据 |
| HasKey(string key) | 检查key是否存在 |
| Remove(string key) | 删除指定数据 |
| Clear() | 清空所有数据 |
# 事件
| 事件 | 描述 |
|---|---|
| DataTampered | 数据被篡改时触发 |
# 事件参数 (WXDataProtectionEventArgs)
| 属性 | 类型 | 描述 |
|---|---|---|
| Key | string | 被篡改的数据key |
| ExpectedValue | object | 期望的原始值 |
| ActualValue | object | 实际检测到的值 |
| ValueType | Type | 数据类型 |
| DetectedTime | DateTime | 检测到篡改的时间 |
| TamperDescription | string | 篡改描述信息 |
# 最佳实践
# 1. 数据分类保护
// 重要货币数据
WXDataPlugin.Instance.Set("coins", playerCoins);
WXDataPlugin.Instance.Set("diamonds", playerDiamonds);
// 游戏进度数据
WXDataPlugin.Instance.Set("level", playerLevel);
WXDataPlugin.Instance.Set("experience", playerExp);
// 配置数据
WXDataPlugin.Instance.Set("settings", gameSettings);
# 2. 封装常用操作
using WeChatWASM.GameProtect.Monitor;
public static class CurrencyManager
{
public static void AddCoins(int amount)
{
int current = WXDataPlugin.Instance.Get<int>("coins");
WXDataPlugin.Instance.Set("coins", current + amount);
}
public static bool SpendCoins(int amount)
{
int current = WXDataPlugin.Instance.Get<int>("coins");
if (current >= amount)
{
WXDataPlugin.Instance.Set("coins", current - amount);
return true;
}
return false;
}
}
# 3. 篡改应对策略
private void HandleDataTampering(WXDataProtectionEventArgs e)
{
switch (e.Key)
{
case "coins":
case "diamonds":
// 货币被篡改:重置为0或从服务器同步
ResetCurrency(e.Key);
break;
case "level":
// 等级被篡改:从服务器重新获取
SyncLevelFromServer();
break;
default:
// 记录日志并上报
LogTamperAttempt(e);
break;
}
}