SDK-AB实验

更新时间:2026-06-06 12:00:00OSDK

InitExperiment

void InitExperiment(string gameObjectName, string methodName, string config)

说明:用于初始化 AB 实验功能

public class ExpConfig
{
    public string game_id;
    public string api_key;
    public string user_id;
    public bool enable_auto_exposure;
}

public class GameManager : MonoBehaviour
{
    public void CallInitExperiment() {
        ExpConfig expConfig = new ExpConfig()
        {
            game_id = "***", // 必选:项目游戏 ID,联系「苏」获取
            api_key = "***", // 必选:项目 API KEY,联系「苏」获取
            user_id = "***", // 必选:玩家小游戏 openid,玩家唯一标识。开发联调时可提供 openid 给「苏」加入实验的对照组/实验组白名单进行不同组的测试验证
            enable_auto_exposure = false, // 可选:自动上报实验曝光(默认 true)。当该值为 true 时,在调用 GetVariation() 时会自动上报实验曝光,如果该值为 false 时,需要手动调用 TrackExposure() 上报实验曝光。实验曝光应该在玩家真正“看到”或“使用到”实验变体时才调用上报,比如玩家看到了变体的 UI,体验到变体的功能时才上报
        };
        #if UNITY_WEBGL && !UNITY_EDITOR
        OSDKHelper.InitExperiment(gameObject.name, "OnInitExperiment", JsonUtility.ToJson(expConfig));
        #else
        Debug.Log("InitExperiment 仅在 WebGL 运行时有效");
        #endif
    }

    public void OnInitExperiment(int initResult) {
        Debug.Log($"init experiment 回调: {initResult}");

        if (initResult == 1) {
            // 初始化成功
            Debug.Log("init experiment 回调成功");
            string expId = "实验层 ID";
            GetVariation(expId);
            TrackExposure(expId);
        } else {
            // 初始化失败
            Debug.Log("init experiment 回调失败");
        }
    }
}

GetVariation

string GetVariation(string experimentId)

【使用前,需要先调用InitExperiment进行实验的初始化】

说明:获取实验分流信息,返回玩家在某个 AB 实验下被分配的实验组/实验变体信息。variationInfo 对象包含实验变体属性,并必须使用如下代码示例来读取实验变体的配置参数。

实验的配置参数截图示例(Demo 实验):

descript

特殊说明:调试期(非正式上线)的实验,需要找「苏」加 openid 白名单到对照组/实验组,这样在开发联调时获取的「配置参数」的值才会符合预期。

// 传入实验层 id,获取实验分流信息(用户被分配到该实验的哪个实验组/实验变体)
private void GetVariation(string experimentId) {
    string variation = OSDKHelper.GetVariation(experimentId);
    if (string.IsNullOrEmpty(variation)) {
        // 如果是空字符串
        Debug.Log("该用户的流量不参与该实验(即不会分流到对照组或实验组) 或 其他异常,请执行默认版本");
    } else {
        // 用户被分流到该实验的对照组或实验组,即用户被分配到所属的实验变体了
        // 现在可以获取实验变体的配置参数并在代码中直接使用这些参数
        // 返回的 variation 为 json 字符串
         Debug.Log("info:" + variation);
        // 将 json 字符串反序列化(解析)为 C# 对象
        VariationInfo variationInfo = JsonUtility.FromJson<VariationInfo>(variation);
        // 如下 is_show_banner 为实验配置的参数 key,true 为获取不到配置参数时的默认值,默认值可自行定义,但类型要匹配。这里以配置 bool 值为例
        bool isShowBanner = variationInfo.varParams?.boolValue?.is_show_banner ?? true;
        if (isShowBanner) {
            Debug.Log("展示 Banner");
        } else {
            Debug.Log("不展示 Banner");
        }
        
        // 其他示例(请自行定义好获取不到配置参数时的默认值)
        // 1. 如果在实验平台配置 boolean 参数(必须采用 boolValue)
        bool testBoolean = variationInfo.varParams?.boolValue?.testBoolean ?? false;
        // 2. 如果在实验平台配置 string 参数(必须采用 stringValue)
        string testString = variationInfo.varParams?.stringValue?.testString ?? "red";
        // 3. 如果在实验平台配置 json 参数(json 会转为字符串,必须采用 stringValue)
        string testJson = variationInfo.varParams?.stringValue?.testJson ?? "{\"a\":1,\"b\":2}";
        // 4. 如果在实验平台配置 number 参数(必须采用 numberValue)
        // 这里以配置 int 值为例
        int testNumber = variationInfo.varParams?.numberValue?.testNumber ?? 10;
    }
}

控制台打印结果示例:

descript

TrackExposure

void TrackExposure(string experimentId)

【使用前,需要先调用InitExperiment进行实验的初始化】

说明:手动实验曝光,当初始化实验传入 enable_auto_exposure 为 false 时,使用该方法进行手动实验曝光,当 variation 为空字符串时不用曝光。注意,当enable_auto_exposure 为 true 时,调用 GetVariation 时会自动触发实验曝光,请勿再使用 TrackExposure 进行重复曝光。

// 在实验变体信息被使用时,触发上报实验曝光。实验曝光应该在玩家真正“看到”或“使用到”实验变体时才调用上报,比如玩家看到了变体的 UI,体验到变体的功能时才上报。
private void TrackExposure(string experimentId) {
    OSDKHelper.TrackExposure(experimentId);
    Debug.Log("trackExposure");
}

相关文档