# 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;
    }
}
点击咨询小助手