此文档主要是为使用Unity环境的开发者提供PC端的SDK,开发者接入后可以直接导出exe包使用。
游戏客户端开发者
服务端配置:请参考 通用接入文档->《SDK服务端接入说明文档》
打开unity 在Assets ->Import Package ->Custom Package… 选择ACEGlobalPCSDK.unitypackage 点击【import】导入文件导入package包 或者在【Project】面板下空白区域鼠标右键->【Import Package】->【custom Package】选择导入 或者直接找到需要导入的包文件,直接拖拽到【Project】面板下
如果导入unitypackage有资源缺失 也可以直接复制提供的demo工程里面的相关代码和资源到游戏工程中。
demo里面包含场景和示例代码
BestHTTP、LitJson、WPMIDGameSDKscript、WPMIDBaseSDK、WPMIDBrowser是需要引用的库文件和SDK包含的相关代码。
Plugins 里面包含了一些需要用到的dll文件
Resources 里面包含了sdk需要用到的本地弹窗提示UI Prefabs和PC端显示内嵌webview所需的Prefabs
StreamingAssets里面包含了sdk需要的配置文件。
WPMIDGameSDKscript 下面的WPGameSDK和WPGameSDKListener
WPGameSDK里面包含了主动调用设置监听、初始化、
、登录、注销、切换账号、用户中心、礼包码、支付、角色信息设置以及其他接口等。
WPGameSDKListener 是监听返回的相应回调接口。
具体接入方式可参照Assets->demo-> EventHandle.cs
游戏须自定义类继承 WPGameSDKListener 实现callback接口 回调接口会包含游戏用到的参数信息 游戏可以使用该参数 发起登录验证等相关逻辑操作。
接口调用示例:
WPGameSDK.getInstance().XXX
回调接口示例:
public override void XXX()
{
throw new System.NotImplementedException();
}
/// <summary>
/// 设置回调监听的gameobject
/// </summary>
/// <param name="listener">实现WPGameSDKListener的类</param>
public void setListener(WPGameSDKListener listener)
此接口需要在脚本生命周期的Start()里调用 在初始化接口之前。
参数名称 | 是否必传 | 类型 | 说明 |
---|---|---|---|
listener | 必传 | WPGameSDKListener | 当前实现 WPGameSDKListener 回调的类 |
WPGameSDK.getInstance().setListener(this);
/// <summary>
/// 初始化sdk
/// </summary>
/// <param name="version">版本名称</param>
/// <param name="versioncode">版本号</param>
/// <param name="gameResVer">游戏资源版本号,无资源版本号可传"</param>
public void reInit(string version, string versioncode, string gameResVer)
此接口要在setListener之后 以及调用其他接口之前调用。
参数名称 | 是否必传 | 类型 | 说明 |
---|---|---|---|
version | 必传 | String | 版本名称 |
versioncode | 必传 | String | 版本号 |
gameResVer | 可选 | String | 游戏资源版本号,如游戏无此概念则可以传null。 |
WPGameSDK.getInstance().reInit("1.0.6","1","1");
初始化成功的回调
public override void onInitSuccess(){}
初始化失败的回调
public override void onInitFailed(WPGameErrorMsg errMsg)
{
showLog("onInitFailed", "msg: " + errMsg.errMsg + "code: " + errMsg.errCode);
}
参数名称 | 类型 | 说明 |
---|---|---|
errMsg | string | 错误描述 |
errCode | string | 错误码 |
由于需要在Canvas下展示SDK相关UI,所以需要游戏调用此接口设置场景中的CanvasName,保证正常运行SDK功能
WPGameSDK.getInstance().SetGameCanvasName("游戏中使用的CanvasName");
调出unity内嵌Webview SDK登录界面 可以进行账号登录注册操作
//登录接口
public void login ()
WPGameSDK.getInstance().login();
public override void onLoginSuccess(WPGameUserInfo userInfo)
{
showLogWarning("onLoginSuccess", "uid: " + userInfo.uid + " ,username: " + userInfo.username + " ,userToken: " + userInfo.token + " ,loginType: " + userInfo.logintype + " ,deviceType: " + userInfo.deviceType + ", snid: " + userInfo.snid + ", serviceId: " + userInfo.serviceId + " ,returnJson: " + userInfo.returnJson +", msg: " + userInfo.errMsg);
}
参数名称 | 重要性 | 类型 | 说明 |
---|---|---|---|
userInfo | 必须 | WPGameUserInfo | 当前登录用户的用户信息数据。 |
参数名称 | 类型 | 说明 |
---|---|---|
userInfo.uid | String | 用户中心生成的用户ID,游戏应以此ID作为用户登陆的唯一标识 |
userInfo.token | String | 用户中心生成的用户token,游戏需要用来向用户中心服务器做登录验证 |
userInfo.logintype | String | 登录类型 |
userInfo.username | String | 用户中心生成的用户名称 |
userInfo.userServiceCode | String | 设备当前serviceCode数据,用于服务端打点使用 |
userInfo.isFirstLoginStatus | bool | 当前用户是否首登,true 是, fasle 不是 |
userInfo.firstLoginTime | long | 返回当前用户首次登录时间戳 |
userInfo.returnJson | String | Json格式的字符串。第三方用户系统返回给用户中心的数据,不同渠道返回的数据会有所不同,游戏根据情况酌情使用,不需要的话可以不取。 |
userInfo.logintype: 登录类型,具体值的含义请见下表
loginType | 含义 |
---|---|
speedy | 快速登录 |
common | 用户名密码用户 |
phone | 手机号用户 |
邮箱用户 | |
thirdHidden | 第三方用户登录 |
accessToken | token登录 |
public override void onLoginFailed (WPGameErrorMsg errMsg)
{
showLog("onLoginFailed", "msg: "+ errMsg.errMsg);
}
WPGameErrorMsg 说明
参数名称 | 类型 | 说明 |
---|---|---|
errMsg | string | 错误描述 |
errCode | string | 错误码 |
public override void onLoginCancel(WPGameErrorMsg errMsg)
{
showLog("onLoginCancel", "msg: " + errMsg.errMsg + "code: " + errMsg.errCode);
}
WPGameErrorMsg 说明
参数名称 | 类型 | 说明 |
---|---|---|
errMsg | string | 错误描述 |
errCode | string | 错误码 |
注销当前登录账号,注销成功后会调用游戏实现功能后的注销回调接口。
public void logout ()
WPGameSDK.getInstance().logout();
public override void onLogoutSuccess ()
{
showLog("onLogoutSuccess", "");
//注销成功后具体逻辑请游戏客户端实现。
}
public void switchAccount()
WPGameSDK.getInstance().switchAccount();
public override void onSwitchAccountSuccess(WPGameUserInfo userInfo){
//切换账号成功,清除原来的角色信息,使用获取到新的用户信息,回到进入游戏的界面,不需要再次调登录
}
参数名称 | 重要性 | 类型 | 说明 |
---|---|---|---|
userInfo | 必须 | UserInfo | 当前登录用户的用户信息数据。 |
参数名称 | 类型 | 说明 |
---|---|---|
userInfo.uid | String | 用户中心生成的用户ID,游戏应以此ID作为用户登陆的唯一标识 |
userInfo.token | String | 用户中心生成的用户token,游戏需要用来向用户中心服务器做登录验证 |
userInfo.logintype | String | 登录类型 |
userInfo.username | String | 用户中心生成的用户名称 |
userInfo.userServiceCode | String | 设备当前serviceCode数据,用于服务端打点使用 |
userInfo.isFirstLoginStatus | bool | 当前用户是否首登,true 是, fasle 不是 |
userInfo.firstLoginTime | long | 返回当前用户首次登录时间戳 |
userInfo.returnJson | String | Json格式的字符串。第三方用户系统返回给用户中心的数据,不同渠道返回的数据会有所不同,游戏根据情况酌情使用,不需要的话可以不取。 |
userInfo.logintype: 登录类型,具体值的含义请见下表
loginType | 含义 |
---|---|
speedy | 快速登录 |
common | 用户名密码用户 |
phone | 手机号用户 |
邮箱用户 | |
thirdHidden | 第三方用户登录 |
accessToken | token登录 |
public override void onSwitchAccountFailed(WPGameErrorMsg message)
{
showLog("onSwitchAccountFailed", "msg: " + message.errMsg);
}
ErrorMsg说明
参数名称 | 类型 | 说明 |
---|---|---|
errMsg | string | 错误描述 |
errCode | string | 错误码 |
成功登录并进入游戏后,游戏客户端必须调用此接口设置用户的角色信息,角色信息在其他功能接口中需要用到,如未调用则无法使用支付功能。用户首次创建或注册角色并登录时,需要调用一次注册设置和一次登录设置;用户使用老角色登录,则只需要调用一次登录设置。
注意:
1.游戏内没有角色注册行为的,在游戏自动给用户创建角色的时候,即认为注册。
2.用户首次创建或注册角色并登录时,需先调用注册设置,再调用登录设置。
3.研发需要在本地做基础判断,一些特殊符号不允许出现在角色名、公会名、队伍名、联盟名等名称中,具体符号_(, | { } “ ‘ \ / @ $ # & ! - + ( ) . ? ~ )^*
/**
* 游戏在创建角色、登录、角色数据发生变化时调用
*
* @param roleinfo
*/
public void createRole(WPGameSDKRoleInfo gameRoleInfo)//创建角色
public void enterGame(WPGameSDKRoleInfo gameRoleInfo)//开始游戏
public void updateRole(WPGameSDKRoleInfo gameRoleInfo);//角色信息变更
参数名称 | 重要性 | 类型 | 说明 |
---|---|---|---|
serverName | 必须 | String | 当前角色所在游戏服务器名称 |
serverID | 必须 | String | 当前角色所在游戏服务器ID |
gameRoleName | 必须 | String | 角色名称 |
gameRoleID | 必须 | String | 角色ID |
gameRoleLevel | 必须 | String | 角色等级 |
vipLevel | 必须 | String | 角色VIP等级,没有等级可以传”0” |
laborunion | 非必须 | String | 角色所在公会 |
roleCreateTime | 必须 | String | 角色创建时间(服务器采集)参数类型:String时间类型:long 精度:秒 (即10位数) |
roleLevelMTime | 必须 | String | 角色等级变化时间(服务器采集)参数类型:String 时间类型:long 精度:秒 (即10位数) |
WPGameSDKRoleInfo gameRoleInfo = new WPGameSDKRoleInfo();
gameRoleInfo.gameRoleID = "000001";
gameRoleInfo.gameRoleLevel = "1";
gameRoleInfo.gameRoleName = "哈哈哈";
gameRoleInfo.laborunion = "嘿嘿嘿";
gameRoleInfo.serverID = "1";
gameRoleInfo.serverName = "1区";
gameRoleInfo.vipLevel = "1";
gameRoleInfo.roleCreateTime = "roleCreateTime";
gameRoleInfo.roleLevelMTime = "roleLevelMTime";
// 角色注册成功需调用此接口设置角色信息,正常情况下,注册只在新角色注册成功后调用一次
WPGameSDK.getInstance ().createRole(gameRoleInfo);//创建角色
WPGameSDKRoleInfo gameRoleInfo = new WPGameSDKRoleInfo();
gameRoleInfo.gameRoleID = "11111";
gameRoleInfo.gameRoleLevel = "1";
gameRoleInfo.gameRoleName = "哈哈哈";
gameRoleInfo.laborunion = "嘿嘿嘿";
gameRoleInfo.serverID = "1";
gameRoleInfo.serverName = "1区";
gameRoleInfo.vipLevel = "1";
gameRoleInfo.roleCreateTime = "roleCreateTime";
gameRoleInfo.roleLevelMTime = "roleLevelMTime";
// 角色登陆成功并成功进入游戏后需调用此接口设置角色信息,在每次角色登陆成功后都要调用
WPGameSDK.getInstance ().enterGame (gameRoleInfo);//进入游戏
WPGameSDKRoleInfo gameRoleInfo = new WPGameSDKRoleInfo();
gameRoleInfo.gameRoleID = "11111";
gameRoleInfo.gameRoleLevel = "99";
gameRoleInfo.gameRoleName = "哈哈哈";
gameRoleInfo.laborunion = "嘿嘿嘿";
gameRoleInfo.serverID = "1";
gameRoleInfo.serverName = "1区";
gameRoleInfo.vipLevel = "13";
gameRoleInfo.roleCreateTime = "roleCreateTime";
gameRoleInfo.roleLevelMTime = "roleLevelMTime";
WPGameSDK.getInstance ().updateRole(gameRoleInfo);//角色信息变更
进入官网SDK的用户中心界面。
public void userCenter()
WPGameSDK.getInstance().userCenter();
全球PC版打开Xsolla支付页面。SteamPC在steam客户端拉起支付页,实现游戏中的道具购买。
注意:
如游戏中所卖商品在游戏界面显示为“100元宝”,当调用支付接口时,商品名称请传“元宝”,商品数量请传“100”
如游戏中所卖商品在游戏界面显示为“月卡“,当调用支付接口时,商品名称请传“月卡”,商品数量请传“1”
如游戏中所卖“月卡”有多个,当调用支付接口时,商品名称建议传入月卡的金额。例如“30元月卡”、“50元月卡”等等,商品数量请传“1”
礼包类与月卡同理,请在商品名称尽量传入礼包对应的价格,例如:“30元礼包”,“50元礼包,商品数量请传“1”。
public void pay (WPGameSDKProduct orderInfo)
参数名称 | 重要性 | 类型 | 说明 |
---|---|---|---|
productId | 必须 | String | 游戏自定义的商品ID,必传。 |
price | 必须 | String | 商品价格,单位为分。 |
currencyType | 必须 | String | 货币类型(1人民币2美元3日元4港币5英镑6新加坡币7越南盾8台币9韩元10泰铢) |
productName | 必须 | String | 商品名称 |
buyNum | 必须 | String | 商品数量 |
productDesc | 必须 | String | 商品描述 |
currency | 可选 | String | 购买的虚拟货币名称,比如 钻石,金币,宝石 等 |
GamedDeliverUrl | 可选 | String | 游戏发放道具服务器地址,用户支付成功后计费中心会回调此地址告知游戏进行道具发放。 可以配置到SDK后台。 |
extension | 可选 | String | 游戏自定义数据,支付成功后,计费中心会将此字段数据回传给游戏服务器。 |
rolelv | 可选 | String | 角色等级,请传数字。 |
roleVipLv | 可选 | String | 角色VIP等级,请传数字,如游戏中无角色VIP等级可以传0。 |
currencyType说明:
货币类型值 | 货币名称 | 货币单位 |
---|---|---|
1 | 人民币 | 分 |
2 | 美元 | 美分 |
3 | 日元 | 円 |
4 | 港币 | 分 |
5 | 英镑 | 便士 |
6 | 新加坡币 | 分 |
7 | 越南盾 | 盾 |
8 | 台币 | 元 |
9 | 韩元 | 元 |
10 | 泰铢 | 萨当 |
WPGameSDKProduct product = new WPGameSDKProduct();
product.productId = "1003";
product.price = "99";
product.currencyType = "2";
product.productName = "0.99美元";
product.buyNum = "1";
product.productDesc = "199美分";
product.currency = "钻石";
product.extension = "我是扩展字段";
product.rolelv = "99";
product.roleVipLv = "15";
WPGameSDK.getInstance ().pay (product);
//支付成功
public override void onPaySuccess (WPGamePayResult payResult)
{
showLog("onPaySuccess", "pbid: " + payResult.pbid + ", orderID: " + payResult.orderID );
}
//用户取消支付
public override void onPayCancel (WPGamePayResult payResult)
{
showLog("onPayCancel", "pbid: " + payResult.pbid + ", orderID: " + payResult.orderID);
}
//支付失败
public override void onPayFailed (WPGamePayResult payResult)
{
showLog("onPayFailed", "pbid: " + payResult.pbid + ", orderID: " + payResult.orderID);
}
//支付结果未知(下单成功)
public override void onPayUnknown(WPGamePayResult payResult)
{
showLog("onPayUnknown", "pbid: " + payResult.pbid + ", orderID: " + payResult.orderID);
}
参数名称 | 重要性 | 类型 | 说明 |
---|---|---|---|
pbid | 必须 | String | 游戏自定义商品ID。 |
orderID | 必须 | String | 计费中心生成的订单号,支付失败或者用户取消支付时可能返回为空。 |
注:”onPayUnknown”表示当前订单已经成功提交,但用户是否进行支付,以计费中心服务器的通知为准。 “onPayUnknown”代表支付流程结束。”onPayUnknown”回调触发以后不会在有支付成功和支付失败的回调了,游戏需要根据服务器通知为准。
通过礼包码来兑换游戏中对应的礼包。
public void giftExchange(string giftCode , string url ,string extendParams)
参数名称 | 重要性 | 类型 | 说明 |
---|---|---|---|
giftCode | 必须 | String | 需要兑换的礼包码 |
url | 必须 | String | 兑换成功后,计费中心会通知此地址发货。(游戏服发货地址) |
extendParams | 可选 | String | 游戏透传参数,通知发货时会原样返回。 |
WPGameSDK.getInstance().giftExchange("礼包码", "172.1.1.1", "我是扩展接口");
//兑换成功:
public override void onGiftExchangeSuccess(string giftid, string extendParams)
{
showLog("onGiftExchangeSuccess", "giftid === "+ giftid + " extendParams === "+ extendParams);
}
参数名称 | 类型 | 说明 |
---|---|---|
giftid | String | 礼包码归属的礼包ID |
extendParams | String | 透传参数 |
//兑换失败:
public override void onGiftExchangeFail(int code,string message)
{
showLog("onGiftExchangeFail", "code === " + code + " message ===== "+ message);
}
参数名称 | 类型 | 说明 |
---|---|---|
code | String | 错误码 |
Message | String | 错误内容详情 |
在Unity中的OnApplicationQuit()方法里调用onDestroy
private void OnApplicationQuit()
{
WPGameSDK.getInstance().onDestroy();
}
public void exit()
WPGameSDK.getInstance().exit();
public override void onExitSuccess ()
{
showLog ("onExitSuccess", "");
//退出成功的回调,游戏实现保存游戏数据,退出游戏
#if UNITY_EDITOR
UnityEditor.EditorApplication.isPlaying = false;
#else
Application.Quit();
#endif
}
打开后可以在unity console看到sdk层面的相关信息输出,游戏接入调试阶段可开启 出正式游戏包时请务必关闭日志输出。
MIDBaseSdkLog.isOutLog = true;//开启
MIDBaseSdkLog.isOutLog = false;//关闭
获取当前游戏包中的ServiceId,(游戏联运渠道ID,游戏可根据此ID区分各发行渠道)。
string ServiceId = WPGameSDK.getInstance().getServiceId();
获取当前游戏包中的ChannelId,(游戏推广渠道ID,含概CPS渠道,短链渠道等唯一标识)。
string ChannelId = WPGameSDK.getInstance().getChannelId();
获取当前游戏包中的LocaleId, (游戏发行区域ID)。
string LocaleId = WPGameSDK.getInstance().getLocaleId();
获取当前游戏包中的deviceGroupId, (机型组ID)。
string DeviceGroupId = WPGameSDK.getInstance().getDeviceGroupId();
调用打开活动公告接口,一般用于游戏内公告展示。回调里返回公告打开和关闭事件,回调接口目录:4.19
WPGameSDK.getInstance().OpenActivityNotice();
WPGameSDK.getInstance().OpenLoginNotice();
回调里返回公告打开和关闭事件
回调给研发公告的事件,包含用户通过SDK悬浮层公告按钮点击以后的公告事件,研发主动调用活动公告打开关闭事件,公告不存在的回调。
/**
* 登录公告和游戏内活动公告打开关闭事件
*/
public override void onSDKActivityNoticeClose(string data)
{
showLog("活动公告关闭事件", "data === " + data);
}
public override void onSDKActivityNoticeStart()
{
showLog("活动公告打开事件", "");
}
public override void onSDKLoginNoticeClose()
{
showLog("登录公告关闭事件", "");
}
public override void onSDKLoginNoticeStart()
{
showLog("登录公告打开事件", "");
}
public override void onSDKNoActivityNotice()
{
showLog("活动公告不存在", "");
}
public override void onSDKNoLoginNotice()
{
showLog("登录公告不存在", "" );
}
游戏登录成功后,调用此接口,打开客服反馈界面。
游戏需要自己设计UI按钮,当用户点击此按钮时,调用接口,打开客服反馈界面。
WPGameSDK.getInstance().customerFeedback();
初始化成功以后可以通过SDK获取配置到GSC后台的CDN数据。可以配置多个CDN和一个回源地址。
WPGameSDK.getInstance().GetUpdateCDNPath();
获取成功后的 json格式说明
参数名 | 格式 | 说明 |
---|---|---|
domainList | String | cdn地址集合,逗号分隔,研发可以按照顺序尝试使用 |
public override void onGetPathSuccess(JsonData cdnPath)
{
showLog("onSDKActivityDetilsStart", "cdnPath === " + cdnPath.ToJson());
}
public override void onGetPathFail(int code)
{
showLog("onGetPathFail", "code === " + code);
}
获取服务器端 发送日志使用的Servicecode
提供给BI日志用。
此接口请在登录成功后调用,不然数据不完整.
string Servicecode = WPGameSDK.getInstance().getServicecode();
可以根据需求在游戏内添加打开隐私协议按钮。
WPGameSDK.getInstance().OpenAgreement();
返回客户端当前IP,请在登录成功后获取。
string ip = WPGameSDK.getInstance().getClientIP();
打开一个webview,并跳转到指定链接
WPGameSDK.getInstance().OpenWebview("需要打开的url");
适用于有切换语言需求的产品。
如果没有多语言需求可以忽略。
可以在初始化前调用。
暂时支持 英文,中文,繁体,印尼语,泰语,德语,韩语,俄罗斯语,法语,西班牙语,意大利,葡萄牙语,
如果研发有多语言需求,需要在启动后先设置语言,避免SDK展示语言和游戏展示语言不一致情况。
public void UpdateLocale(string language)
语言 | 参数 |
---|---|
英文 | en |
中国大陆 | zh-CN |
繁体中文 | zh-HK |
印尼语 | id |
泰语 | th |
德语 | de |
韩语 | ko |
俄罗斯语 | ru |
法语 | fr |
西班牙语 | es |
意大利 | it |
葡萄牙 | pt |
日文 | ja |
土耳其语 | tr |
越南语 | vi |
荷兰语 | nl |
挪威语 | no |
波兰语 | pl |
瑞典语 | sv |
WPGameSDK.getInstance().UpdateLocale("zh-TW");
研发上报游戏现在的进度,用于SDK标记游戏现在所处进度,并进行相关操作。
以悬浮层按钮开关为例:
SDK会在进入服务器列表时打开SDK悬浮功能条,
SDK会在离开服务器选择时关闭SDK悬浮功能条,
请研发上报事件时尽量准确。
参数名称 | 说明 |
---|---|
WPGameSDKParam.GAME_PROCESS_EVENT_TYPE_IN_SELECT_SERVERLIST | 进入选择服务器列表页面的事件。 |
WPGameSDKParam.GAME_PROCESS_EVENT_TYPE_OUT_SELECT_SERVERLIST | 离开选择服务器列表页面的事件。 |
/**
* 研发主动调用,传入不同的事件用于标记游戏现在所处进度
*
*/
WPGameSDK.getInstance().SendGameProcess(int event);
游戏端发送第三方的日志
比如给AppsFlyer、Facebook之类的第三方统计SDK发送。
需要运营和技术支持确定参数和日志key以后调用。
使用此接口需要联系技术支持获取详细点位文档。
这里只是说明和用完成新手引导作为举例说明。
/// <summary>
/// 游戏端发送第三方的日志
/// </summary>
/// <param name="logKey">日志KEY</param>
/// <param name="logValue">日志内容 HashMap key-val格式</param>
WPGameSDK.getInstance().MIDBaseSendAnalyticsInfoLog(string logKey,
Dictionary<string, object> logValue);
Dictionary<string, object> logValue = new Dictionary<string, object>();
WPGameSDK.getInstance().MIDBaseSendAnalyticsInfoLog("tutorial_complete ",
logValue);
游戏端发送异常文件
/// <summary>
/// 上传研发异常文件
/// </summary>
/// <param name="filePath">异常文件路径</param>
/// <param name="message">描述,可以为空</param>
WPGameSDK.getInstance().MIDBaseSendLogWithFile(string filePath, string message);
WPGameSDK.getInstance().MIDBaseSendLogWithFile("文件路径 ","文件描述");
检查当前用户是否为游客
/// <summary>
/// 检查当前用户是否为游客
/// </summary>
/// <returns></returns>
WPGameSDK.getInstance().MIDBaseCheckUserisgGuest();
bool isGuest = WPGameSDK.getInstance().MIDBaseCheckUserisgGuest();