小游戏聚合SDK-Unity(C#)

文档修订记录

文档版本 文档更新日期 文档更新内容
3.3.83 2025.01.16 1.「渠道平台指引」华为、vivo、OPPO小游戏新增创建桌面图标接口
3.3.82 2025.01.03 1.「渠道平台指引」新增美团小游戏 角色上报、添加快捷方式、获取启动参数、一键订阅二楼任务等特殊接口和回调
3.3.82 2025.01.03 1.「渠道平台指引」新增美团小游戏 角色上报、添加快捷方式、获取启动参数、一键订阅二楼任务等特殊接口和回调
3.3.78 2024.12.09 1.新增支付宝小游戏 2.新增特殊方法接口 3.「渠道平台指引」新增支付宝小游戏行为数据上报,设首、复访任务,游戏圈等特殊接口和回调
3.3.76 2024.11.28 1.接入华为快游戏、OPPO小游戏、vivo小游戏;2.新增「打开客服对话」接口
3.3.73 2024.11.08 1.聚合接口初版。2.接入支付宝小游戏

接入须知

1.各个渠道如何配置,请跳转到快游戏接入配置指引:

2.服务端验证接入,请查看快游戏服务端文档请查阅:点击跳转

接入准备

1.下载对接资源:点我下载

2.将NebulaQuick.unitypackage导入到您的Unity工程的Assets文件夹下。

3.将你要对接的渠道资源NebulaQuick_xxx.unitypackage导入到您的Unity工程的Assets文件夹下,例如支付宝的渠道资源名称为NebulaQuick_alipay.unitypackage注意:一个工程只能导入一种渠道资源,否则会造成不同渠道资源之间的冲突。

4.从星云开放平台下载目标渠道的 'fy-config.json' ,拷贝到Untiy工程的'Assets/Resources'目录下。下载路径:星云开放平台->对接中心->渠道打包->渠道配置->找到目标快游戏渠道->点击"下载配置文件"。注意:每个渠道要单独下载对应的配置文件,不可公用,否则无法正常使用。

接口

  • 必接接口:游戏必须要接入
  • 选接接口:按照游戏发行需求来接入
  • 回调:某些接口有相应的回调游戏需要进行处理,具体请查看本文档的「回调」章节
  • 案例:更详细案例可以参考对接资源中的范例'NBDemo/Assets/Scripts/SDKManager.cs'

初始化(必接)

1.方法

public void Init(string gameVersion)

2.说明

  • 作用:用来加载SDK的初始化配置
  • 调用时机:游戏需要在刚启动游戏的时候调用
  • 回调说明:初始化完成后会回调初始化回调,并返回星云配置参数,包括星云开放平台AppID、渠道ID等

3.调用范例

Nebula.NebulaSDKBridge.Instance.Init("1.0.0");

4.参数说明

参数 类型 说明 是否必传
gameVersion string 游戏版本号

5.回调方法

// 初始化回调
Nebula.NebulaSDKBridgeCallback.InitCallback 

登录(必接)

1.方法

public void Login() 

2.说明

  • 作用:获取用户登录信息
  • 调用时机:初始化完成后,玩家需要登录时调用
  • 登录流程:点我查看
  • 回调说明:登录后会回调LoginCallback并返回用户信息

3.调用范例

Nebula.NebulaSDKBridge.Instance.Login();

4.参数说明

5.回调方法

// 登录回调
Nebula.NebulaSDKBridgeCallback.LoginCallback

支付(必接)

1.方法

/// <summary>
/// 支付
/// </summary>
/// <param name="goodsPrice">商品价格,单位:分</param>
/// <param name="tradeNo">游戏订单号</param>
/// <param name="goodsId">商品 ID</param>
/// <param name="goodsName">商品名称</param>
/// <param name="playerId">角色 ID</param>
/// <param name="playerName">玩家名称</param>
/// <param name="playerLevel">玩家等级</param>
/// <param name="vipLevel">VIP 等级</param>
/// <param name="serverId">服务器 ID</param>
/// <param name="zoneId">分区 ID</param>
/// <param name="sandbox">沙箱支付,0=正式支付、1=沙箱支付</param>
/// <param name="notifyURL">回调地址</param>
/// <param name="notifyExt">额外参数</param>
public void Pay(NebulaSDKPayParams payParams)

2.说明

  • 作用:拉起支付界面
  • 调用时机:玩家进行商品购买时调用
  • 支付流程:点我查看
  • 服务端回调:需配置游戏服务端的支付回调地址,支付完成后会通过此地址回调支付结果,配置路径:星云开放平台->对接中心->SDK对接->SDK列表->基础接入参数->游戏支付回调地址
    图片
  • 注意事项:客户端的支付回调不能作为支付成功的依据,不能在此处发放道具,客户端的支付回调只可以用来控制游戏界面显示,例如loading框的关闭、遮罩层的关闭。判断支付是否成功要根据服务端的支付回调。具体的服务端回调请看服务端接入文档

3.调用范例

var payParams = new NebulaSDKPayParams();
payParams.goodsPrice = PayAmount;
payParams.tradeNo = GameOrderId;
payParams.goodsId = GoodsId;
payParams.goodsName = GoodsName;
payParams.playerId = PlayerID;
payParams.playerName = PlayerName;
payParams.playerLevel = PlayerLevel;
payParams.vipLevel = "1";
payParams.serverId = ServerID;
payParams.zoneId = "1";
payParams.sandbox = 0;
payParams.notifyURL = "";
payParams.notifyExt = "";

Nebula.NebulaSDKBridge.Instance.Pay(payParams);

4.参数说明

参数 类型 默认值 说明 必传
goodsPrice int - 商品价格,单位:分,对应服务端支付回调的 total_amount 参数
tradeNo string - 游戏订单号,由游戏生成并管理。服务端支付回调会回传,游戏需进行唯一性校验,防止重复下发商品给玩家,50个字符内。 对应服务端支付回调的out_trade_no参数
goodsId string - 商品 ID,对应服务端支付回调的 goods_id 参数
goodsName string - 商品名称
playerId string - 角色 ID,对应服务端支付回调的 player_id 参数
playerName string - 玩家名称
playerLevel string - 玩家等级
vipLevel string 0 VIP 等级
serverId string - 服务器 ID,对应服务端支付回调的 server_id 参数
zoneId string 1 分区 ID,对应小游戏平台的支付分区
sandbox int 0 沙箱支付,0=正式支付、1=沙箱支付
notifyUrl string - 1.通过该值能在客户端动态传递服务端支付回调地址;2.若您在客户端传递了该地址,则支付完成后会通过此地址回调支付结果;3.若您同时也在星云后台配置了支付回调地址,会优先回调客户端传递的地址;4.需要先配置支付回调可信域名,请前往"星云后台->对接中心->回调配置->支付回调可信域名"进行配置,否则无法回调成功;5.若您在客户端传递了该地址,在游戏包体发布之前,建议您仔细检查该参数是否配置正确,以防止包体发布后支付出现问题
notifyExt string - 额外参数,游戏的透传参数可通过此参数传递,支付完成后平台服务端会回调此参数给游戏服务端。对应服务端支付回调的notify_ext参数

5.回调方法

// 支付回调
Nebula.NebulaSDKBridgeCallback.PayCallback

激励视频广告(选接)

1.方法

/// <summary>
/// 展示激励视频广告
/// </summary>
/// <param name="adUnitId">广告ID</param>
public void ShowRewardedVideoAd(string adUnitId)

2.说明

  • 调用此接口将拉起展示激励视频广告
  • 在激励视频广告回调中,判断是否下发观看广告奖励
  • 在调用此接口之前请在第三方渠道后台先配置好广告,并获取到adUnitId,各个渠道的广告配置方法请查看接入须知"接入配置指引"

3.调用范例

Nebula.NebulaSDKBridge.Instance.ShowRewardedVideoAd("xxx");

4.回调方法

Nebula.NebulaSDKBridgeCallback.RewardedVideoAdCallback 

打开客服对话(选接)

1.方法

/// <summary>
/// 打开客服对话
/// </summary>
/// <param name="customerServiceParams"></param>
public void OpenCustomerServiceConversation(NebulaSDKCustomerServiceParams customerServiceParams)

2.说明

  • 调用此接口将拉起客服对话页面

3.调用范例

var csParams = new NebulaSDKCustomerServiceParams();
csParams.source = 3;
csParams.serverId = ServerID;
csParams.serverName = ServerName;
csParams.playerId = PlayerID;
csParams.playerName = PlayerName;
csParams.playerLevel = PlayerLevel;
csParams.vipLevel = "1";
Nebula.NebulaSDKBridge.Instance.OpenCustomerServiceConversation(csParams);

4.参数说明

参数 类型 默认值 说明 必传
source int - 提交入口。2:SDK登录后进入游戏前; 3:进入游戏后
serverId string - 游戏服id
serverName string - 游戏服名称
playerId string - 角色id
playerName string - 角色名称
playerLevel string - 角色等级
vipLevel string - 角色vip等级

5.回调方法

Nebula.NebulaSDKBridgeCallback.CustomerServiceCallback 

获取配置参数(选接)

1.说明

  • 如果想在初始化之前就获取到星云的配置参数,可以直接读取fy-config.json,参考如下调用范例

2.调用范例

var json = Resources.Load<TextAsset>("fy-config");
Debug.Log($"###fy-config>>{json}");
var config = JsonUtility.FromJson<Nebula.NebulaSDKConfig>(json.text);
// 星云开放平台AppID 
var appId = config.nbAppId;
// 星云开放平台渠道ID
var channelId = config.nbChannelId;
// 星云开放平台渠道模板标识
var channelTemplateCode = config.nbChannelTemplateCode;
// 星云开放平台通行证标识
var passportCode = config.passportCode;
// 星云开放平台支付标识
var paymentCode = config.paymentCode;

3.参数说明

参数 类型 说明
nbAppId string 星云开放平台AppID
nbChannelId string 星云开放平台渠道ID,如果游戏要对渠道做差异化处理时,可以使用此ID作为区分
nbChannelTemplateCode string 星云开放平台渠道模板标识,用来标明该渠道使用的是哪个渠道模板(一级渠道,在“对接中心-渠道打包-渠道配置”中添加渠道时所选的渠道模板),如果游戏要对不同渠道模板做差异化处理时,可以使用此标识作为区分,例如:针对不同渠道模板进行玩家信息隔离。所有渠道的渠道模板标识请看渠道版本信息
passportCode string 星云开放平台通行证标识,用来标明该渠道用什么通行证进行登录
paymentCode string 星云开放平台支付标识,用来标明该渠道用什么支付方式

回调

  • 说明:请在游戏代码中,设置好的相应的委托方法,并编写游戏的回调逻辑

  • 案例:更详细案例可以参考对接资源中的范例'Script/Menu.cs'

  • 统一返回对象格式如下:

属性名 说明
status 成功success、失败error
code 响应状态码,根据不同状态进行处理和错误原因排查
msg 提示消息
data 返回值,响应结果不同请求数据格式参照方法说明文档
  • code统一错误码:
错误码 说明
10001 网络请求失败
10002 初始化失败
10003 启动参数获取失败
10004 配置文件无法读取
10005 渠道类型无法获取
20001 登录失败
20002 登录取消
20003 第三方渠道登录失败
20004 服务端登录验证失败
30001 支付失败
30002 渠道支付配置关闭
30003 支付取消
30004 创建聚合订单失败
30005 支付配置获取失败
30006 第三方渠道支付失败
40001 广告播放未完成
40002 广告加载失败

初始化回调

1.方法

Nebula.NebulaSDKBridgeCallback.InitCallback

2.说明

  • 初始化后会回调此方法,并返回配置参数
  • 应在确保收到初始化成功回调后才能调用其他接口

3.参数

data参数:

4.使用方式

Nebula.NebulaSDKBridgeCallback.InitCallback = (initInfo) =>
{
    Debug.Log($"###InitCallback>>status:{initInfo.status}>>code:{initInfo.code}>>msg:{initInfo.msg}");

    if ("success".Equals(initInfo.status))
    {
        // 初始化成功

    }
    else
    {
        // 初始化失败

    }
}

登录回调

1.方法

Nebula.NebulaSDKBridgeCallback.LoginCallback

2.说明

  • 调用登录后会回调此方法,游戏在此方法中做登录的逻辑处理

3.参数

data参数:

参数 类型 说明
nbOpenId string 聚合渠道用户 openId,可作为游戏内玩家的唯一用户标识
openId string 小游戏 openId,可作为用户扩展属性值使用
token string 星云通行证凭证 Token

4.使用方式

Nebula.NebulaSDKBridgeCallback.LoginCallback = (loginInfo) =>
{
    Debug.Log("###LoginCallback>>status:"+ loginInfo.status + ">>code:" + loginInfo.code + ">>msg:" + loginInfo.msg + ">>openId:" + loginInfo.data.openId + ">>token:" + loginInfo.data.token  + ">>nbOpenId:" + loginInfo.data.nbOpenId);

    if ("success".Equals(loginInfo.status))
    {
        // 登录成功
    } 
    else
    {
        // 登录失败
    }
};

支付回调

1.方法

Nebula.NebulaSDKBridgeCallback.PayCallback

2.说明

  • 调用支付后会回调此方法,游戏在此方法中做支付的逻辑处理
  • 此回调只是客户端的支付成功回调,不能作为发放道具的依据,具体是否真正支付成功,需要等服务端的支付成功回调

3.参数

data参数:

属性 类型 说明
orderNo string 星云订单号

4.使用方法

Nebula.NebulaSDKBridgeCallback.PayCallback = (payInfo) =>
{
    Debug.Log("###PayCallback>>status:"+ payInfo.status + ">>code:" + payInfo.code + ">>msg:" + payInfo.msg + ">>orderNo:" + payInfo.data.orderNo);

    if ("success".Equals(payInfo.status))
    {
        // 支付成功   
    } else
    {
        // 支付失败
    }
};

激励视频广告回调

1.方法

Nebula.NebulaSDKBridgeCallback.RewardedVideoAdCallback

2.说明

  • 调用完成激励视频广告接口后回调,游戏在此处确定是否下发观看广告奖励

3.参数

data 参数:

属性 类型 说明
adUnitId string 广告ID

4.使用方法

Nebula.NebulaSDKBridgeCallback.RewardedVideoAdCallback = (rewardedVideoAdInfo) =>
{
    Debug.Log("###RewardedVideoAdCallback>>status:" + rewardedVideoAdInfo.status + ">>code:" + rewardedVideoAdInfo.code + ">>msg:" + rewardedVideoAdInfo.msg + ">>adUnitId:" + rewardedVideoAdInfo.data.adUnitId);

    if ("success".Equals(rewardedVideoAdInfo.status))
    {
        // 广告播放完成
        Debug.Log("###广告播放完成");
    }
    else
    {
        // 广告播放失败
        Debug.Log("###广告播放失败");
    }
};

打开客服对话回调

1.方法

Nebula.NebulaSDKBridgeCallback.CustomerServiceCallback

2.说明

  • 调用完成打开客服对话接口后回调,游戏在此处确定是否打开成功

3.参数

data 参数:无

4.使用方法

Nebula.NebulaSDKBridgeCallback.CustomerServiceCallback = (info) =>
{
    LogManager.Instance.Add("###CustomerServiceCallback>>status:" + info.status + ">>code:" + info.code + ">>msg:" + info.msg );

    if ("success".Equals(info.status))
    {
        LogManager.Instance.Add("###打开客服成功");
    }
    else
    {
        LogManager.Instance.Add("###打开客服失败");
    }
};

渠道平台指引

支付宝小游戏

特殊接口

  • 特殊回调
Nebula.NebulaSDKBridgeCallback.Callback = (method, result) =>
{
    LogManager.Instance.Add($"###Callback>>method:{method}>>result:{result}");
    // GetLaunchOptions:当调用GetLaunchOptions之后回调
    // OnShow:当从外部页面(如支付宝用户中心)返回游戏时回调
    if (method == "GetLaunchOptions" || method == "OnShow")
    {
        var jsonData = JsonMapper.ToObject(result);
        // 是否展示设首任务。true:是,false:否。如果为true,要显示设首和复访任务;如果为false,则要隐藏设首和复访任务。
        bool gameCenterBackflow = (bool)jsonData["gameCenterBackflow"];
        // 是否已设首成功,true:是,false:否。如果为true,未领取过奖励的用户可以领取奖励;如果为false,则要引导用户跳转设首
        bool addHomepageResult = (bool)jsonData["addHomepageResult"];
        // 启动小游戏的场景值
        int scene = (int)jsonData["scene"];
        // 来源渠道,游戏中心:gamecenter。如果 sourceChannel 为 gamecenter,则复访任务完成,给用户发放奖励;如果未获取到 sourceChannel 字段,则向用户提示领取失败
        string sourceChannel = (string)jsonData["sourceChannel"];
        // 支付宝返回的原始数据
        string originalData = (string)jsonData["originalData"];

    } 
    else if (method == "GameClubButtonOnTap") // GameClubButtonOnTap:点击游戏圈按钮之后回调
    {

    }
    else if (method == "GetGameClubData") // GetGameClubData:当调用GetGameClubData后回调
    {
        // result格式:[{"value":1734418420, "dataType":1},{"value":0,"dataType":3},{"value":0,"dataType":4},{"value":0,"dataType":5},{"value":0,"dataType":6},{"value":0,"dataType":7},{"value":0,"dataType":8},{"value":0,"dataType":9}]
        // result 说明:
        /// 1:⽤户最新加⼊游戏圈的时间,秒级Unix时间戳(有加入游戏圈value才有值)
        /// 3:⽤户禁⾔状态,0:正常 1:禁言
        /// 4:当天(⾃然⽇)点赞贴⼦数
        /// 5:当天(⾃然⽇)评论贴⼦数
        /// 6:当天(⾃然⽇)发表贴⼦数
        /// 7:当天(⾃然⽇)发表视频贴⼦数
        /// 8:当天(⾃然⽇)赞官⽅贴⼦数
        /// 9:当天(⾃然⽇)评论官⽅贴⼦数

    }

};
  • 支付宝游戏上报:
var jsonData = new JsonData();
jsonData["action_code"] = "xxx";
var json = jsonData.ToJson();
Nebula.NebulaSDKBridge.Instance.Call("Report", json);
  • 报告游戏加载完成:
Nebula.NebulaSDKBridge.Instance.Call("ReportLoadingCompleted", "");
  • 默认授权或主动授权完成时进⾏上报
Nebula.NebulaSDKBridge.Instance.Call("ReportAuthorized", "");
  • 报告游戏⻆⾊创建完成,initial:是否是第⼀次创建⻆⾊进⼊(新⽤户)
var jsonData1 = new JsonData();
jsonData1["initial"] = true;
var json1 = jsonData1.ToJson();
Nebula.NebulaSDKBridge.Instance.Call("ReportGameCharacterCreated", json1);
  • 报告成功进⼊游戏游玩界⾯
Nebula.NebulaSDKBridge.Instance.Call("ReportGamePlay", "");
  • 报告自定义事件接口,设首复访上报时使用。eventId:事件名称
var jsonData = new JsonData();
jsonData["eventId"] = "xxx";
var json = jsonData.ToJson();
Nebula.NebulaSDKBridge.Instance.Call("ReportCustomEvent", json);
  • 获取启动参数,必须在登录成功回调后调用
Nebula.NebulaSDKBridge.Instance.Call("GetLaunchOptions", "");
  • 跳转设首任务
Nebula.NebulaSDKBridge.Instance.Call("SetHomePage", "");
  • 跳转复访任务
Nebula.NebulaSDKBridge.Instance.Call("SetReturnVistPage", "");
var param = new JsonData();
// 操作游戏圈按钮的方法。Show:显示游戏圈按钮,Hide:隐藏游戏圈按钮,Destroy:销毁游戏圈按钮
param["method"] = "Show";
// 必填,按钮类型。0:text类型,可以设置背景⾊和⽂本的按钮;1:image类型,只能设置背景贴图的按钮,背景贴图会直接拉伸到按钮的宽⾼
param["type"] = 1;
// 按钮文案。注意:type=“text”时必填
param["text"] = "xxx";
// 按钮的背景图⽚,仅当 type 为 image 时有效
param["image"] = "https://mdn.alipayobjects.com/paladin_unity/afts/img/1e7STKNyP1cAAAAAAAAAAAAADkqsAQBr/original";
// 必填,游戏圈按钮的图标,仅当 type 参数为 image 时有效。0:blue, 1:white, 2:dark, 3:light
param["icon"] = 1;
// 传游戏圈的圈⼦ID,进⼊到指定圈⼦下
param["openlink"] = "xxx";
// 按钮离屏幕左边距
param["left"] = 0;
// 按钮离屏幕上边距
param["top"] = 200;
// 按钮宽度
param["width"] = 50;
// 按钮⾼度
param["height"] = 50;
// 按钮背景颜⾊,格式为 6 位 16 进制数
param["backgroundColor"] = "#000000";
// 按钮边框颜⾊,格式为 6 位 16 进制数
param["borderColor"] = "#ffffff";
// 按钮边框宽度
param["borderWidth"] = 2;
// 按钮圆⻆幅度
param["borderRadius"] = 5;
// ⽂案颜⾊
param["color"] = "#ffffff";
// ⽂案对⻬⽅式
param["textAlign"] = 1;
// ⽂案字体⼤⼩
param["fontSize"] = 18;
var paramJson = param.ToJson();
Nebula.NebulaSDKBridge.Instance.Call("GameClubButton", paramJson);
/// 需要获取的数据指标的对象数组:
/// 1:⽤户最新加⼊游戏圈的时间
/// 3:⽤户禁⾔状态
/// 4:当天(⾃然⽇)点赞贴⼦数
/// 5:当天(⾃然⽇)评论贴⼦数
/// 6:当天(⾃然⽇)发表贴⼦数
/// 7:当天(⾃然⽇)发表视频贴⼦数
/// 8:当天(⾃然⽇)赞官⽅贴⼦数
/// 9:当天(⾃然⽇)评论官⽅贴⼦数
int[] intArray = new int[] { 1, 3, 4, 5, 6, 7, 8, 9 };
string paramJson = JsonMapper.ToJson(intArray);
Nebula.NebulaSDKBridge.Instance.Call("GetGameClubData", paramJson);

调试说明

  • 安装支付宝小游戏开发工具:打开控制台输入以下命令

    npm install -g minidev@latest
  • 导出工程:找到Unity工具栏的"支付宝小游戏"插件,设置好信息,点击"生成并转换"

  • 生成预览版:控制台cd到刚刚导出的目录中的"alipay"文件夹,输入以下命令(-a为应用ID)

    minidev preview -a 206017xxx
  • 测试预览版:确保你有加入支付宝小游戏开发者,打开支付宝扫一扫刚才生成的二维码,可以拉起游戏进行测试

  • 上传:控制台cd到刚刚导出的目录中的"alipay"文件夹,输入以下命令(-a为应用ID,-v为版本号)

    minidev upload -a 206017xxx -v 0.0.1 --game
  • 参考文档:支付宝小游戏文档

注意

  • 设置服务器域名白名单:
    1. 需要将星云SDK用到的域名添加到白名单,否则无法正常使用
gate-nebula.737.com
api-combine.feiyu.com
feishu-develop-tracker.cn-shanghai.log.aliyuncs.com
2. 需要将游戏用到的域名添加到白名单,否则无法正常请求。
3. 添加路径:控制台-开发设置-服务器域名白名单设置。添加完要重新打包,否则刚刚添加的白名单不生效。
  • 内购测试:

    1. 如果要测试内购功能,需要先开通虚拟支付,并添加uid白名单。
    2. 如果添加完白名单还是无法拉起支付,可能需要重新打包生效。
    3. 参考文档:接入准备
  • 激励视频广告测试:

    1. 调试广告接口的时候,广告页面显示空白,属于正常现象,弹出页面就可以了。
    2. 游戏对接时使用到的adUnitId不是广告配置中的"广告位id",而是"spaceCode"!"spaceCode"获取路径:广告位管理-编辑-spaceCode

设首、复访任务说明

  • 设首任务对接流程:

设首任务

  • 复访任务对接流程:

复访任务

  • 设首复访任务测试需要添加白名单:商家平台运营中心 >选择 小游戏 > 进入 小游戏详情页 > 设首复访
  • 有其他疑问请参考:
    1. 设首复访应用案例请查看设首复访官方文档
    2. 设首复访测试问题请查看设首复访常见问题

官方文档

华为小游戏

特殊接口

  • 特殊回调

    Nebula.NebulaSDKBridgeCallback.Callback = (method, result) =>
    {
    // 创建桌面图标回调
    if (method == "InstallShortcut")
    {
        var jsonData = JsonMapper.ToObject(result);
        string status = jsonData.OptGetString("status");
        if (status == "success")
        {
            Debug.Log("创建桌面图标成功");
        }
        else
        {
            string msg = jsonData.OptGetString("message");
            Debug.Log(msg);
        }
    } 
    };
  • 创建桌面图标接口

    Nebula.NebulaSDKBridge.Instance.Call("InstallShortcut", "");

调试说明

  • 下载安装华为小游戏开发者工具,下载地址

  • 导出工程:使用Unity自带的工具导出WebGL工程,导出前要根据文档中的提示进行设置,参考文档

  • 使用开发者工具转换工程,参考文档:华为快游戏转换文档

  • 真机测试:

    1. 使用数据线将华为手机连接到电脑设备
      1
    2. 华为手机和开发者工具需登录同一个开发者账号,否则无法运行
    3. 点击开始运行,会自动在手机安装宿主App,然后拉起运行快游戏

注意事项

  • 证书文件和密钥文件:

    1. 生成:开发者工具->工具栏->工具->生成证书
    2. 配置:需在华为开发者中心配置SHA256证书指纹,需配置刚刚生成证书时生成的Fingerprint
    3. 证书配置:开发者工具所配置的证书,需与开发者中心配置的证书指纹对应,否则无法登录
  • 激励视频广告测试:

    1. 使用华为提供的测试的广告ID进行测试:teste7hm5vx799
    2. 华为运营验收通过后,将测试ID替换为正式ID,正式ID需联系运营配置广告。
    3. 参考文档:华为广告测试验证及上线
  • 支付测试:

    1. 需要在华为开发后台配置好商品,并在支付接口goodsId传入配置好的商品ID
    2. 华为小游戏有提供沙盒测试,将开发者账号加入沙盒测试白名单,测试时无需真实支付

官方文档

OPPO小游戏

特殊接口

  • 特殊回调

    Nebula.NebulaSDKBridgeCallback.Callback = (method, result) =>
    {
    // 创建桌面图标回调
    if (method == "InstallShortcut")
    {
        var jsonData = JsonMapper.ToObject(result);
        string status = jsonData.OptGetString("status");
        if (status == "success")
        {
            Debug.Log("创建桌面图标成功");
        }
        else
        {
            string msg = jsonData.OptGetString("message");
            Debug.Log(msg);
        }
    } 
    };
  • 创建桌面图标

    Nebula.NebulaSDKBridge.Instance.Call("InstallShortcut", "");

调试说明

  • 下载安装OPPO小游戏开发工具:下载地址

  • 导出工程(windows系统):

    1. 使用OPPO Unity插件导出工程,参考文档
  • 导出工程(mac系统):

    1. 使用Unity编辑器导出WebGL工程,导出前要根据文档中的提示进行设置,参考文档
    2. 安装命名行工具:
npm install -g @oppo-minigame/cli
3. 使用命令行工具转换小游戏。-u:Unity版本号;-p:游戏包名;-g:游戏名称;-s:签名私钥;-e:签名证书;-o:横竖屏,不写默认竖屏,传landscape为横屏:
quickgame unity -u 2021.3.14f1 -p com.feiyu.stepbystep.nearme.gamecenter -g NBDemo -s ../sign/release/private.pem -e ../sign/release/certificate.pem 
  • 真机测试:使用OPPO 小游戏开发者工具进行测试,参考文档
  • 查看调试日志:电脑和手机同一局域网,chrome浏览器内输入下面的url,IP换成你的手机局域网ip,端口从12345~12348,例如:
devtools://devtools/bundled/inspector.html?v8only=true&ws=192.168.0.3:12345/00010002-0003-4004-8005-000600070008

注意事项

  • 如果导出的工程无法运行,卡在loading界面,看看导出的小游戏工程中的Build是否包含oppo.loader.js,如果没有则需清除一下Unity工程的缓存,工具栏->Assets->Reimport All
  • 不支持http请求
  • 激励视频广告测试:需到OPPO商务后台创建广告,获取到广告ID,参考文档

官方文档

vivo小游戏

特殊接口

  • 特殊回调

    Nebula.NebulaSDKBridgeCallback.Callback = (method, result) =>
    {
    // 创建桌面图标回调
    if (method == "InstallShortcut")
    {
        var jsonData = JsonMapper.ToObject(result);
        string status = jsonData.OptGetString("status");
        if (status == "success")
        {
            Debug.Log("创建桌面图标成功");
        }
        else
        {
            string msg = jsonData.OptGetString("message");
            Debug.Log(msg);
        }
    } 
    };
  • 创建桌面图标

    Nebula.NebulaSDKBridge.Instance.Call("InstallShortcut", "");

调试说明

  • vivo手机安装2个应用:vivo小游戏引擎vivo小游戏调试器

  • 转换小游戏并导出工程:Unity菜单栏->vivo小游戏->转换小游戏,根据游戏情况填写导出参数,点击生成并转换

  • 安装依赖:打开电脑控制台 cd 到导出的目录中的webgl_vivo目录执行命令

    npm install
  • 编译项目:还是在刚刚的控制台窗口,webgl_vivo目录下执行命令

    npm run build
  • 运行项目:打开另一个控制台窗口,还是cd 到webgl_vivo目录,执行命令

    npm run server
  • vivo手机连接电脑,打开手机的小游戏调试器,点击"在线更新",即可拉起游戏界面

  • 参考文档:转换工具导出vivo小游戏

注意

  • 如果修改完代码要重新调试,不需要关闭正在运行npm run server的窗口,可以在转换小游戏后,重新执行npm run build,并在小游戏调试器点击"在线更新"即可

官方文档

美团小游戏

特殊接口

  • 特殊回调
Nebula.NebulaSDKBridgeCallback.Callback = (method, result) =>
{
    Debug.Log($"###Callback>>method:{method}>>result:{result}");
    // GetLaunchOptions:当调用GetLaunchOptions之后回调
    // OnShow:当从外部页面返回游戏时回调
    if (method == "GetLaunchOptions" || method == "OnShow")
    {
        var jsonData = JsonMapper.ToObject(result);
        // 能否展示一键订阅二楼任务。true:能,false:否。如果为true,则展示一键订阅二楼按钮。如果为false,则不展示。
        bool showEnable = (bool)jsonData["showEnable"];
        // 是否已订阅二楼。true:是,false:否。如果为true,未领取过奖励的用户可以领取奖励;如果为false,引导用户订阅。
        bool isSubscribe = (bool)jsonData["isSubscribe"];
        // 启动小游戏的场景值
        int scene = (int)jsonData["scene"];
        // 来源渠道参数
        string innerSource = (string)jsonData["innerSource"];
        // 是否为二楼复访。true:是,false:否。如果为true,则表示从二楼复访进入小游戏;如果为false,则表示不是从二楼复访进入小游戏。
        string fromSecondFloor = (bool)jsonData["fromSecondFloor"];
    } 
    else if (method == "UpdateSecondFloorChannel") // 一键订阅二楼回调
    {
        var jsonData = JsonMapper.ToObject(result);
        var status = (string)jsonData["status"];
        var message = (string)jsonData["message"];
        if (status == "success")
        {
            // 一键订阅二楼成功
        } 
        else
        {
            // 一键订阅二楼失败
        }

    } 
    else if (method == "CreateShortcut") // 添加桌面快捷方式回调
    {
        var jsonData = JsonMapper.ToObject(result);
        var status = (string)jsonData["status"];
        var message = (string)jsonData["message"];
        if (status == "success")
        {
            // 添加桌面快捷方式成功
        } 
        else
        {
            // 添加桌面快捷方式失败
        }
    }

};
  • 角色上报接口
说明:
1. 每次创角动作结束之后进行一次上报
2. 每次切换服务区时进行一次上报
3. 每次退出游戏时进行一次上报

var jsonData = new JsonData();
// 创建时间,时间戳,eg: Date.now(),当创角上报时必传
jsonData["createTime"] = "1735553976";
// 服务区id,非必传
jsonData["serviceId"] = "1";
// 角色 id,必传
jsonData["roleId"] = "roleId1";
// 角色等级,必传
jsonData["level"] = "1";
Nebula.NebulaSDKBridge.Instance.Call("ReportMV", jsonData.ToJson());
  • 添加快捷方式
说明:
1. 不支持重复添加
2. 回调特殊回调的 CreateShortcut

JsonData jsonData = new JsonData();
// 快捷方式显示的名称,必传
jsonData["label"] = "NBDemo";
// 快捷方式跳转目标页面,必传,需要与美团的运营人员索取,否则无法正常打开
jsonData["target"] = "imeituan://www.meituan.com/mgc?mgc_id=mgctedrrftskcype&inner_source=11181_desk&query=inner_source%3D11181_desk&lch=mhqN_TW-u0kBgiK_vBi78KQNw&_page_new=1";
Nebula.NebulaSDKBridge.Instance.Call("CreateShortcut", jsonData.ToJson());
  • 获取启动参数
说明:
1. 调用后回调 GetLaunchOptions

Nebula.NebulaSDKBridge.Instance.Call("GetLaunchOptions", "");
  • 一键订阅二楼任务
说明:
1. 调用后回调 UpdateSecondFloorChannel

 Nebula.NebulaSDKBridge.Instance.Call("UpdateSecondFloorChannel", "");

调试说明

  • 使用美团小游戏转换插件生成小游戏文件

  • 命令行安装调试工具:

    npm i -g mgc-cli-exter 
  • 生成 mgc.config.js配置文件(在导出目录执行):

    mgc config
  • 生成Debug测试二维码(在 mgc.config.js 的同级目录执行):

    mgc debug
  • iOS调试:使用美团App扫码

    1. 版本号大于等于11.2.200
    2. 需要使用特殊的URL生成二维码再进行扫码,请查看注意事项
  • Android调试:

    1. 需要使用专用的APK测试包, 点击下载
  • 具体调试、分包、上架方式请参考美团官方文档:

    1. 美团游戏开放平台
    2. Unity 小游戏 WASM 分包工具使用说明

注意事项

  • iOS需要使用特殊的URL生成二维码再进行扫码测试:

    1. 使用 mgc debug 命令生成二维码时会同时给出测试URL,在URL后面串上: &manualHorn=%7B%22structure%22%3A2%2C%22enableUnityGame_mgctedrrftskcype%22%3A1%7D
    2. 使用二维码生成工具将以上URL生产二维码
    3. URL范例如下:
      imeituan://www.meituan.com/mgc?mgc_id=mgctedrrftskcype&mgc_debug_version=1.1.37&debug=1&manualHorn=%7B%22structure%22%3A2%2C%22enableUnityGame_mgctedrrftskcype%22%3A1%7D
  • 还未上架的游戏,测试二楼复访,需使用特殊的URL生成二维码测试地址

    1. 使用 mgc debug 命令生成二维码时会同时给出测试URL,在URL后面串上:&inner_source=11181_syxlel&query=inner_source%3D11181_syxlel
    2. iOS测试可以在iOS特殊地址基础上串上以上字符串
    3. 使用二维码生成工具将以上URL生产二维码
    4. URL范例如下:
      imeituan://www.meituan.com/mgc?mgc_id=mgctedrrftskcype&mgc_debug_version=1.1.37&debug=1&manualHorn=%7B%22structure%22%3A2%2C%22enableUnityGame_mgctedrrftskcype%22%3A1%7D&inner_source=11181_syxlel&query=inner_source%3D11181_syxlel
  • 测试二楼复访需添加白名单,添加方式:联系美团技术人员添加

一键订阅二楼、二楼复访说明

  • 一键订阅二楼流程图:

一键订阅二楼流程图

  • 二楼复访流程图:

二楼复访流程图

官方文档

FAQ