更新日期:2026年 09月 14日QuickGame(Unity)客户端接入文档
<h4>
<span style="font-size:16px;"><br />
</span>
</h4>
<p>
<span style="font-size:16px;"><br />
</span>
</p>
<h4>
<span style="font-size:16px;"><br />
</span>
</h4>
<h4>
<span style="font-size:16px;"><br />
</span>
</h4>
<h4>
<span style="font-size:16px;"><br />
</span>
</h4>
<h4>
<span style="font-size:16px;"><br />
</span>
</h4>
<h4>
<span style="font-size:16px;">一、 Unity部分</span>
</h4>
<p>
<span style="font-size:16px;"><br />
</span>
</p>
<p>
<span style="font-size:16px;"><br />
</span>
</p>
<p>
<span style="font-size:16px;"><br />
</span>
</p>
<p>
<strong style="font-size:14px;">1. 概述</strong>
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">QuickGameSDK 为 Unity 游戏提供了一套覆盖Android、</span><span style="font-size:14px;"> iOS</span><span style="font-size:14px;">、WebGL(小游戏)</span><span style="font-size:14px;">、Windows PC全平台的接入方案。CP 只需按如下步骤操作出包:</span>
</p>
<p>
<span style="font-size:14px;"></span>
</p>
<p style="white-space:normal;">
<span style="font-size:14px;">1. 集成 Unity 脚本与平台插件 <br />
</span>
</p>
<p style="white-space:normal;">
<span style="font-size:14px;">2. 配置 QKSettings.asset<br />
</span><span style="font-size:14px;">3. 实现 QuickListener 接收回调 <br />
</span><span style="font-size:14px;">4. 调用 QKGame完成初始化、登录、支付、角色上报等 </span>
</p>
<p>
<span style="font-size:14px;">5. 按目标平台 Build,导出对应平台的包</span>
</p>
<p>
<strong style="font-size:14px;"><br />
</strong>
</p>
<p>
<strong style="font-size:14px;"><br />
</strong>
</p>
<p>
<strong style="font-size:14px;"><br />
</strong>
</p>
<p>
<strong style="font-size:14px;">2. 环境与版本</strong>
</p>
<p>
<strong style="font-size:14px;"><br />
</strong>
</p>
<p>
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">项</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">说明</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">Unity </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">建议2018.4 LTS及以上(参考工程 2022.3 LTS)</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">脚本运行时</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">.NET 4.x / 兼容 Unity 默认 API Level </span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">JSON</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">依赖Newtonsoft.Json(发版包 Assets/Plugins/JsonNet/Newtonsoft.Json.dll)</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">参考工程</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">unitybridgecn(本仓库)</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">Demo 场景</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">Assets/Scenes/QuickGameDemo.unity</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">统一配置</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">Assets/Resources/QKSettings.asset`(菜单 QuickSDK → Settings)</span><br />
</td>
</tr>
</tbody>
</table>
</p>
<p>
<strong style="font-size:14px;"><br />
</strong>
</p>
<p>
<strong style="font-size:14px;"><br />
</strong>
</p>
<p>
<strong style="font-size:14px;"><br />
</strong>
</p>
<p>
<strong style="font-size:14px;">3. 工程集成</strong>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">3.1 拷贝到自有 Unity 工</span><span style="font-size:14px;">程</span>
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">必选(所有平台)</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><span style="white-space:normal;font-size:14px;">Assets/QuickGameSDK/Scripts/ # QKGame.cs、QuickListener.cs、各平台 Bridge<br />
</span><span style="white-space:normal;font-size:14px;">Assets/Plugins/JsonNet/Newtonsoft.Json.dll<br />
</span><span style="white-space:normal;font-size:14px;">Assets/Resources/QKSettings.asset # 或通过 QuickSDK → Settings 创建</span></span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">按平台追加</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td style="text-align:left;width:6%;">
<span style="font-size:14px;white-space:normal;">平台</span>
</td>
<td style="text-align:left;">
<span style="font-size:14px;white-space:normal;"> 额外目录 / 资源 </span>
</td>
</tr>
<tr>
<td style="text-align:left;">
<span style="font-size:14px;white-space:normal;">Android</span>
</td>
<td style="text-align:left;">
<span style="font-size:14px;white-space:normal;">Assets/Plugins/Android/(QKConnector.java、libs/*.aar、AndroidManifest.xml、Gradle 模板)+ `Editor/AndroidPreprocessBuild.cs、AndroidPostGenerateGradle.cs</span>
</td>
</tr>
<tr>
<td style="text-align:left;">
<span style="font-size:14px;white-space:normal;">iOS </span>
</td>
<td style="text-align:left;">
<span style="font-size:14px;white-space:normal;">Assets/QuickGameSDK/Editor/IOSPostProcessBuild.cs、QuickGameIOSIntegrationSettings.cs;原生 SDK 放iOS/releaseSDK(或设 UNITY_QUICKGAME_SDK_ROOT)</span>
</td>
</tr>
<tr>
<td style="text-align:left;">
<span style="font-size:14px;white-space:normal;">小游戏 </span>
</td>
<td style="text-align:left;">
<span style="font-size:14px;white-space:normal;">Assets/QuickGameSDK/Channels/<渠道>/QGSDK.js + Editor/QuickGameWebGLChannelBuilder.cs + Assets/Plugins/WebGL/</span>
</td>
</tr>
<tr>
<td style="text-align:left;">
<span style="font-size:14px;white-space:normal;">PC</span>
</td>
<td style="text-align:left;">
<span style="font-size:14px;white-space:normal;">Assets/Plugins/Windows/(含 WindowsQGAdapter.cs)+ StreamingAssets/Quicksdk/PCSDK_release/PCSDKUI.exe</span>
</td>
</tr>
</tbody>
</table>
<br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">3.2 参考工程目录结构</span>
</p>
<p>
<br />
</p>
<span style="font-size:14px;"> Assets/</span><br />
<span style="font-size:14px;"> │ ├── QuickGameSDK/</span><br />
<span style="font-size:14px;"> │ │ ├── Scripts/ # QKGame、QuickListener、Android/WebGL Bridge</span><br />
<span style="font-size:14px;"> │ │ ├── Editor/ # iOS / Android / WebGL 构建脚本</span><br />
<span style="font-size:14px;"> │ │ ├── Channels/ # wx、ali 等 QGSDK.js</span><br />
<span style="font-size:14px;"> │ │ └── Demo/ # QuickGameDemoController / Listener</span><br />
<span style="font-size:14px;"> ├── Plugins/</span><br />
<span style="font-size:14px;"> │ ├── Android/ # Java 桥接、AAR、Manifest</span><br />
<span style="font-size:14px;"> │ ├── Windows/ # PC SDK + PackageSettings 定义</span><br />
<span style="font-size:14px;"> │ ├── WebGL/ # QuickGameWebGL.jslib、Bootstrap.jspre</span><br />
<span style="font-size:14px;"> │ └── JsonNet/</span><br />
<span style="font-size:14px;"> ├── Resources/QKSettings.asset</span><br />
<span style="font-size:14px;"> └── Scenes/QuickGameDemo.unity</span><br />
<span style="font-size:14px;"> iOS/releaseSDK/ # 默认 iOS SDK(须含 iOS/SDK/JySDK.framework)</span><br />
<br />
<p>
<span style="font-size:14px;"><span style="color:#E53333;"><strong>注意:</strong></span><span style="color:#E53333;"><strong>iOS 的 </strong></span><span style="color:#E53333;"><strong>QKConnector.mm</strong></span><span style="color:#E53333;"><strong>在 Build 时由 </strong></span><span style="color:#E53333;"><strong>IOSPostProcessBuild</strong></span><span style="color:#E53333;"><strong> 从</strong></span><span style="color:#E53333;"><strong>releaseSDK/Unity3d/1. Xcode/</strong></span><span style="color:#E53333;"><strong>拷贝到导出工程,无需事先放在 </strong></span><span style="color:#E53333;"><strong>Assets/Plugins/iOS/</strong></span></span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;"> 3.3 命名空间</span>
</p>
<p>
<br />
</p>
<p>
using quickgame; // QKGame、QuickListener
</p>
<pre class="brush:js;toolbar:false">// Windows / Android 配置类在 quicksdk 命名空间:PackageSettings(QKSettings.asset)</pre>
<br />
<br />
<span style="font-size:14px;">3.4 GameObject 命名</span><br />
<p>
<br />
</p>
<span style="font-size:14px;">QKGame.setListener会把Listener 所在 GameObject 的名称 传给原生/宿主层,通过 UnitySendMessage回调。请保证:</span><br />
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">1. 该物体在场景中名称固定(不要用运行时随机名) </span>
</p>
<p>
<span style="font-size:14px;">2. 物体上挂载继承自 QuickListener的脚本 </span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><strong>4. 接入流程</strong></span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<br />
</p>
<span style="font-size:14px;"> 4.1 标准时序(全平台推荐)</span><br />
<br />
<pre class="brush:js;toolbar:false">启动
→ setListener(QuickListener) // Awake
→ startSdk() // 读 QKSettings;iOS 自动三方登录;WebGL 自动 onSetHost + onInit
→ onInitSuccess / onInitFailed
→ onLogin() / onGuestLogin()
→ onUpdateRole(...) // Windows 支付前必调
→ onPayOrder(QKPayOrderInfo) // 四端统一支付结构
→ onLogout()</pre>
<br />
<span style="font-size:14px;">startSdk(productCode, host)` 可覆盖 QKSettings 中的productCode/ baseUrl。仍可直接调用 onInit / onSetHost/ configureThirdPartyLogin(高级用法)</span><br />
<br />
<span style="font-size:14px;"> Build 前在 QuickSDK → Settings 配置 baseUrl、productCode、(iOS 可选)微信/QQ 字段、miniGameChannel;WebGL 须 Rebuild WebGL Bridge或直接 WebGL Build。详见 WebGL.md</span><br />
<p>
<br />
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">4</span><span style="font-size:14px;">.2 最小代码示例</span>
</p>
<p>
<br />
</p>
<pre class="brush:js;toolbar:false">using UnityEngine;
using quickgame;
public class GameSdkListener : QuickListener
{
public override void onInitSuccess() { /* 进入登录流程 */ }
public override void onInitFailed(ErrorMsg message) { }
public override void onLoginSuccess(UserInfo userInfo) { /* uid / token */ }
public override void onLoginFailed(ErrorMsg errMsg) { }
public override void onLogoutSuccess() { }
public override void onPaySuccess(PayResult payResult) { }
public override void onPayFailed(PayResult payResult) { }
public override void onPayCancel(PayResult payResult) { }
}
public class GameEntry : MonoBehaviour
{
[SerializeField] GameSdkListener listener;
void Awake() => QKGame.setListener(listener);
public void StartSdk() => QKGame.startSdk();
}</pre>
<p>
<br />
</p>
<br />
<br />
<p>
<span style="font-size:14px;"><strong>5. API 说明(QKGame)</strong></span>
</p>
<p>
<br />
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">入口类:Assets/QuickGameSDK/Scripts/QKGame.cs</span>
</p>
<br />
<p>
<span style="font-size:14px;"> 接口分为两类:</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">分类</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">说明</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">全平台公共接口</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;"><span style="font-size:14px;white-space:normal;">Android</span>/ <span style="font-size:14px;white-space:normal;">iOS </span>/ 小游戏 / PC 四端签名与用法一致,业务代码可直接写、用 #if 区分初始化/支付即可</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">平台专有接口</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">仅特定平台可用,或各平台初始化/支付/查询方式不同</span><br />
</td>
</tr>
</tbody>
</table>
<br />
<br />
<br />
<p>
<span style="font-size:14px;">5.1 调用约定</span>
</p>
<p>
<br />
</p>
<p>
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">约定</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">说明</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">回调注册</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">setListener须在 Awake最早调用,且 Listener 所在 GameObject 名称固定</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">初始化</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">公共业务前先 startSdk()(或手动 onInit/ WebGL onSetHost)</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">登录时机</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">收到 onInitSuccess 后再 onLogin</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">角色上报</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">创角、进入游戏、升级、换服等节点均须 onUpdateRole;Windows 支付前必须先上报</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">支付 </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">推荐全平台onPayOrder;onPay仍作原生兼容别名</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">支付发货</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">客户端 onPaySuccess仅供参考,<span style="color:#E53333;"><strong>游戏发货必须以服务端异步通知为准</strong></span></span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">登出后流程</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">onLogoutSuccess 后清除本地角色信息、回到登录界面,可按业务再调 onLogin()</span><br />
</td>
</tr>
</tbody>
</table>
</p>
<p>
<br />
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">5.2 全平台公共接口</span>
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">以下接口在Android、<span style="font-size:14px;white-space:normal;">iOS、小游戏</span>、PC 四端均可调用,方法名与参数一致</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">方法</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">返回值</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">回调</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">说明</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">setListener(QuickListener)</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">void </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">—</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">注册回调;<span style="color:#E53333;"><strong>必须最先调用</strong></span></span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">startSdk(productCode?, host?)</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">void</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">init 成功/失败 </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">推荐:读 QKSettings 并一站式初始化 </span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">onPayOrder(QKPayOrderInfo)</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">void </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">pay 成功/失败/取消</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">推荐:全平台统一支付 </span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">onLogin()</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">void</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">onLoginSuccess / <span style="font-size:14px;white-space:normal;">onLoginFailed</span></span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">调起 SDK 登录</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">onUserCenter()</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">void </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">onUserCenterClose(可选)</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">打开用户中心</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">onLogout()</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">void</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">onLogoutSuccess</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">登出</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">onUpdateRole(...)</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">void </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">— </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">上报角色信息</span><br />
</td>
</tr>
</tbody>
</table>
</span>
</p>
<br />
<p>
<span style="font-size:14px;">setListener(QuickListener listener)</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">参数</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">类型</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">必填</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">说明</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">listener</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">QuickListener</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">是</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">继承 QuickListener 的组件;将 listener.gameObject.name 传给原生/宿主供 SendMessage 回调</span><br />
</td>
</tr>
</tbody>
</table>
<p>
<br />
</p>
<span style="font-size:14px;">onLogin() / onUserCenter() / onLogout()</span><br />
<br />
<p>
<span style="font-size:14px;"> 无参数。必须在 onInitSuccess 之后调用登录相关接口</span>
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">onUpdateRole(roleId, role_name, server_Id, sv_name, role_level, vipLevel, role_power)</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">参数</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">类型</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">必填</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">说明</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">roleId</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">string</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">是</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">角色 ID</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">role_name</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">string</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">是</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">角色名</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">server_Id</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">string</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">是</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">区服 ID</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">sv_name</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">string</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">是</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">区服名</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">role_level</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">string</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">是</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">角色等级</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">v</span><span style="font-size:14px;white-space:normal;">ipLevel</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">stri</span><span style="font-size:14px;white-space:normal;">ng</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">否</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">VIP 等级;无则传""或 "0"</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">r</span><span style="font-size:14px;white-space:normal;">ole_power</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">st</span><span style="font-size:14px;white-space:normal;">ring</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">否</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">战力等;WebGL 可解析为 userRoleBalance</span><br />
</td>
</tr>
</tbody>
</table>
</span><span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;color:#E53333;"><strong>注意:创角、进游戏、升级、换服 等节点均应调用。字符串勿传 null 。Windows 支付前必须先调用本接口</strong></span>
</p>
<br />
<span style="font-size:14px;">四端公共调用示例:</span><br />
<pre class="brush:js;toolbar:false">void Awake() => QKGame.setListener(this);
void StartSdk() => QKGame.startSdk();
void OnEnterGame() {
QKGame.onUpdateRole(id, name, sid, sname, lv, vip, power);
QKGame.onLogin();
}
void OnPay() => QKGame.onPayOrder(new QKGame.QKPayOrderInfo { /* 见 5.2.3 字段 */ });</pre>
<br />
<p>
<br />
</p>
<p>
<span style="font-size:14px;">5.3 平台专有接口</span>
</p>
<p>
<br />
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">5.3.1 <span style="font-size:14px;white-space:normal;">Android</span> / <span style="font-size:14px;white-space:normal;">iOS</span> / Windows 公共(原生三端)</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">适用于 <span style="font-size:14px;white-space:normal;">Android、</span>iOS、Windows;WebGL **不使用本节初始化与支付接口</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">方法</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">返回值</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">回调</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">说明</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">onInit()</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">void </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">onInitSuccess<span style="font-size:14px;white-space:normal;"> / onInitFailed</span></span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">初始化;无参时读 QKSettings 或桥接默认 productCode</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">onInit(productCode)</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">void </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">同上</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">iOS 传产品码;Android 仍走无参 Init(见 5.2.2)</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">onPay(...)</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">void </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">pay 成功/失败/取消 </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">定额支付,见下表</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">onUserID()</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">string </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">—</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">同步用户 ID;未登录返回 ""</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">onUserToken()</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">string </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">—</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">同步 token </span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">onUserName()</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">string </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">— |</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">同步用户名</span><br />
</td>
</tr>
</tbody>
</table>
</span>
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">onPay 参数</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">参数</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">类型</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">必填</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">说明</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">productId</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">string</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">是 </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">商品 ID(iOS 为 App Store 商品 ID)</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">productName</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">string</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">是</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">商品名;建议传「元宝」「月卡」等,不带数量</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">amount</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">float</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">是 </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">金额(元)</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">orderNo</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">string</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">是</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">CP 订单号</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">callBackUrl</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">string</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">否 </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">服务端回调 URL,可 "",<span style="color:#E53333;">如果游戏下单时设置支付回调,建议支付回调地址加上IP白名单,防止被攥改!!!</span></span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">extrasParams</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">string</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">否 </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">透传,回调在 PayResult.extras</span><br />
</td>
</tr>
</tbody>
</table>
<br />
<br />
</span>
</p>
<span style="font-size:14px;">5.3.2 iOS 专有</span><br />
<p>
<br />
</p>
<p>
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">方法</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">返回值</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">说明</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">onInit(productCode)</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">void</span><br />
</td>
<td>
<p style="white-space:normal;">
<span style="font-size:14px;">与 5</span><span style="font-size:14px;">.2.1 相同签名;iOS 真机将 productCode 传入QKConnector;空则读 QKSettings/ 桥接默认</span>
</p>
<br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">configureThirdPartyLogin(wxAppId, wxAppSecret, wxUniversalLink, qqAppId, qqUniversalLink)</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">void</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">微信/QQ 登录;必须 onInit() 之前;不用的渠道传 ""</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">onDeviceIdfa()</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">string</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">同步 IDFA;非 iOS 返回 ""</span><br />
</td>
</tr>
</tbody>
</table>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">configureThirdPartyLogin 参数须与 Info.plist、开放平台后台一致;导出时 QuickGameIOSIntegrationSettings 会写入 URL Scheme</span>
</p>
<br />
<br />
<p>
<span style="font-size:14px;">5.3.3 WebGL 专有(小游戏)</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">方法</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">返回值</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">回调</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">说明</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">onSetHost(host)</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">void </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">— </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">设置 SDK 网关;<span style="color:#E53333;"><strong>须在 onInit(productCode) 之前</strong></span></span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">onInit(productCode)</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">void </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">init 成功/失败</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">带产品码初始化;<span style="color:#E53333;"><strong>勿用无参 onInit()</strong></span></span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">onPayOrder(QKPayOrderInfo)</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">void </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">pay 成功/失败/取消</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;"> 小游戏支付;<span style="color:#E53333;"><strong>order 不可 null</strong></span></span><br />
</td>
</tr>
</tbody>
</table>
<br />
</span>
</p>
<p>
<span style="font-size:14px;">
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">onSetHost<span style="font-size:14px;white-space:normal;">参数</span></span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">类型</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">说明</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">host</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">string</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">SDK 地址,如 https://qkgamesdk.quickapi.net;可与 QKSettings.baseUrl 一致</span><br />
</td>
</tr>
</tbody>
</table>
<br />
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">onInit<span style="font-size:14px;white-space:normal;">参数</span></span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">类型</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">说明</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">productCode</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">string</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">后台产品码;可与 QKSettings.productCode 一致</span><br />
</td>
</tr>
</tbody>
</table>
</span>
</p>
<br />
<p>
<span style="font-size:14px;">QKPayOrderInfo </span><span style="font-size:14px;">字段见 5.4</span>
</p>
<br />
<p>
<span style="font-size:14px;">WebGL 调用顺序:setListener → onSetHost → onInit(productCode) → onLogin</span><span style="font-size:14px;"> → …</span>
</p>
<br />
<br />
<p>
<span style="font-size:14px;">5.3.4<span style="font-size:14px;white-space:normal;"> Android</span> + <span style="font-size:14px;white-space:normal;">iOS </span>共有(Windows / WebGL 无)</span>
</p>
<p>
<br />
</p>
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">方法</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">返回值</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">说明</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">onGuestLogin()</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">void</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">游客/静默登录</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">onIsBindPhone()</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">b</span><span style="font-size:14px;white-space:normal;">ool</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">是否已绑定手机</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">onBindPhone()</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">void</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">调起绑定手机</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">onDeviceId()</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">s</span><span style="font-size:14px;white-space:normal;">tring</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">同步设备 ID</span><br />
</td>
</tr>
</tbody>
</table>
<br />
<br />
<span style="font-size:14px;"> 5.3.5 <span style="font-size:14px;white-space:normal;">Android</span> + <span style="font-size:14px;white-space:normal;">iOS</span> + WebGL 共有(Windows 无)</span><br />
<p>
<br />
</p>
<p>
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">方法</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">返回值</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">说明</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">onRestoreNonConsumptionProducts()</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">void</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">恢复非消耗型内购 / 补单;回调 onRestoreSuccess(可选)</span><br />
</td>
</tr>
</tbody>
</table>
</p>
<p>
<br />
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;"> 5.3.6 Windows 说明</span>
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">1. 初始化、支付、用户查询与 5.2.1 相同(onInit、onPay、onUserID 等)</span>
</p>
<span style="font-size:14px;"> 2. 不支持onGuestLogin(见 5.2.4)</span><br />
<span style="font-size:14px;">3. 支付前必须先onUpdateRole(见5.1)</span><br />
<span style="font-size:14px;"> 4. 配置来自 QKSettings.asset(baseUrl、productCode)</span><br />
<br />
<br />
<span style="font-size:14px;"> 5.4 数据类型</span>
<p>
<br />
</p>
<span style="font-size:14px;"><strong>ErrorMsg</strong></span><br />
<br />
<p>
<span style="font-size:14px;"> 用于 onInitFailed、onLoginFailed 等失败回调</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">字段</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">类型</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">说明</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">errMsg</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">string</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">错误描述</span><br />
</td>
</tr>
</tbody>
</table>
</span>
</p>
<br />
<span style="font-size:14px;"><strong>UserInfo</strong></span><br />
<p>
<br />
</p>
<p>
<span style="font-size:14px;"> 用于 onLoginSuccess;继承自 ErrorMsg</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">字段</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">类型</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">说明</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">uid</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">string</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">用户 ID</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">token</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">string</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">登录 token</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">userName</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">string</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">账号名</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">timeLeft</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">long</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">防沉迷剩余时间(秒);-1 表示无限制 </span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">isNewUser</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">b</span><span style="font-size:14px;white-space:normal;">ool</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">是否新用户</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">er</span><span style="font-size:14px;white-space:normal;">rMsg</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">str</span><span style="font-size:14px;white-space:normal;">ing</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">附加信息(继承字段)</span><br />
</td>
</tr>
</tbody>
</table>
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">原生 JSON 字段映射:userId→uid,userToken→token,timeleft /timeLeft→timeLeft,isNewUser("1"/"true")→isNewUser</span>
</p>
<br />
<br />
<span style="font-size:14px;"><strong>PayResult</strong></span><br />
<br />
<p>
<span style="font-size:14px;"> 用于 onPaySuccess / onPayFailed / onPayCancel</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">字段</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">类型</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">说明</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">co</span><span style="font-size:14px;white-space:normal;">de</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">st</span><span style="font-size:14px;white-space:normal;">ring</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">状态码</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">message</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">st</span><span style="font-size:14px;white-space:normal;">ring</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">状态描述</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">o</span><span style="font-size:14px;white-space:normal;">rderNo</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">s</span><span style="font-size:14px;white-space:normal;">tring</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">SDK 订单号</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">cpO</span><span style="font-size:14px;white-space:normal;">rderNo</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">str</span><span style="font-size:14px;white-space:normal;">ing</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">CP</span><span style="font-size:14px;white-space:normal;"> </span><span style="font-size:14px;white-space:normal;">订单号</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">e</span><span style="font-size:14px;white-space:normal;">xtras</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">s</span><span style="font-size:14px;white-space:normal;">tring</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">下</span><span style="font-size:14px;white-space:normal;">单时 extrasParams </span><span style="font-size:14px;white-space:normal;">透传回游</span><span style="font-size:14px;white-space:normal;">戏</span><br />
</td>
</tr>
</tbody>
</table>
</span>
</p>
<p>
<br />
</p>
<span style="font-size:14px;">QKPayOrderInfo(WebGL 小游戏)</span><br />
<br />
<p>
<span style="font-size:14px;">QKGame.QKPayOrderInfo,用于 onPayOrder</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">字段</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">类型</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">必填</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">说明</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">cpO</span><span style="font-size:14px;white-space:normal;">rderNo</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">strin</span><span style="font-size:14px;white-space:normal;">g</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">是</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">CP 订单号</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">subj</span><span style="font-size:14px;white-space:normal;">ect</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">s</span><span style="font-size:14px;white-space:normal;">tring</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">是</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">商品标题</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">des</span><span style="font-size:14px;white-space:normal;">c</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">stri</span><span style="font-size:14px;white-space:normal;">ng</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">是</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;"> 商品描述</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">goods</span><span style="font-size:14px;white-space:normal;">Id</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">str</span><span style="font-size:14px;white-space:normal;">ing</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">是</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">商品 ID</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">amou</span><span style="font-size:14px;white-space:normal;">nt</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">str</span><span style="font-size:14px;white-space:normal;">ing</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">是</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">金额(字符串,如 "6.00")</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">user</span><span style="font-size:14px;white-space:normal;">RoleId</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">str</span><span style="font-size:14px;white-space:normal;">ing</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">是</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">角色 ID </span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">use</span><span style="font-size:14px;white-space:normal;">rRoleName</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">st</span><span style="font-size:14px;white-space:normal;">ring</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">是</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">角色名</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">serv</span><span style="font-size:14px;white-space:normal;">erId</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">st</span><span style="font-size:14px;white-space:normal;">ring</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">是</span><span style="font-size:14px;white-space:normal;"> </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">区服 ID</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">ser</span><span style="font-size:14px;white-space:normal;">verName</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">st</span><span style="font-size:14px;white-space:normal;">ring</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">是</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">区服名</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">userL</span><span style="font-size:14px;white-space:normal;">evel</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">str</span><span style="font-size:14px;white-space:normal;">ing</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">是</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">角色等级</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">extra</span><span style="font-size:14px;white-space:normal;">sParams</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">stri</span><span style="font-size:14px;white-space:normal;">ng</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">是</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">透传参数(可传 "")</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">call</span><span style="font-size:14px;white-space:normal;">backUrl</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">str</span><span style="font-size:14px;white-space:normal;">ing</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">否</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">支付回调 URL,可空,<span style="color:#E53333;">如果游戏下单时设置支付回调,建议支付回调地址加上IP白名单,防止被攥改!!!</span></span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">go</span><span style="font-size:14px;white-space:normal;">ods_category</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">str</span><span style="font-size:14px;white-space:normal;">ing</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">视渠道</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">商品类目(部分渠道必填)</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">bu</span><span style="font-size:14px;white-space:normal;">y_quantity</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">str</span><span style="font-size:14px;white-space:normal;">ing</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">视渠道</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">购买数量(部分渠道必填) </span><br />
</td>
</tr>
</tbody>
</table>
<br />
<br />
</span>
</p>
<p>
<span style="font-size:14px;">5.5 接口速查</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">全平台公共</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"> </span>
</p>
<pre class="brush:js;toolbar:false" style="font-size:14px;">方法
setListener
onLogin
onUserCenter
onLogout
onUpdateRole
</pre>
<br />
<p>
<span style="font-size:14px;">平台专有</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">归属</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">方法</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">iOS / Android / Windows</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">onInit()、onPay、onUserID、onUserToken、onUserName</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">iOS 专有</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">configureThirdPartyLogin、onDeviceIdfa</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">WebGL 专有</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">onSetHost、onInit(productCode)、onPayOrder</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">iOS + Android</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">onGuestLogin、onIsBindPhone、onBindPhone、onDeviceId</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">iOS + Android + WebGL</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">onRestoreNonConsumptionProducts</span><br />
</td>
</tr>
</tbody>
</table>
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<br />
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;"><strong>6. 回调说明(QuickListener)</strong></span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">继承 QuickListener(Assets/QuickGameSDK/Scripts/QuickListener.cs),实现抽象方法。原生/宿主以 JSON 字符串调用 public void onXxx(string msg) 重载,基类内部解析后转调你实现的强类型方法</span>
</p>
<br />
<p>
<span style="font-size:14px;">数据类型(ErrorMsg、UserInfo、PayResult)见 5.3*</span>
</p>
<p>
<br />
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">6.1 全平台公共回调(必须实现)</span>
</p>
<p>
<br />
</p>
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">回调</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">参数</span><br />
</td>
<td>
<span style="font-size:14px;">触发时机</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">onInitSuccess</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">—</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">onInit / onInit(productCode) 成功</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">onInitFailed(ErrorMsg)</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">errMsg </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">初始化失败</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">onLoginSuccess(UserInfo)</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">uid、token 等</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">onLogin<span style="font-size:14px;white-space:normal;"> / onGuestLogin 成功</span></span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">onLoginFailed(ErrorMsg)</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">errMsg </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">登录失败或取消</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">onLogoutSuccess()</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">—</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">onLogout 完成</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">onPaySuccess(PayResult)</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;"> orderNo、cpOrderNo、extras </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">支付成功</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">onPayFailed(PayResult)</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">code、message </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">支付失败</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">onPayCancel(PayResult)</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">—</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">用户取消支付</span><br />
</td>
</tr>
</tbody>
</table>
<p>
<br />
</p>
<br />
<p>
<span style="font-size:14px;">6.2 平台相关回调(可选实现)</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">回调</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">适用平台</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">说明</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">onRestoreSuccess()</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">iOS / Android / WebGL</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">onRestoreNonConsumptionProducts 恢复成功</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">onUserCenterClose()</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">部分平台</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">用户</span><span style="font-size:14px;white-space:normal;">中心关闭</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">onDeviceIdfa()</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">iOS </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">设备 IDFA</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">onDeviceId()</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;"> </span><span style="font-size:14px;white-space:normal;">iOS / Androi</span><span style="font-size:14px;white-space:normal;">d</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">设备 ID</span><br />
</td>
</tr>
</tbody>
</table>
<br />
</span>
</p>
<br />
<p>
<span style="font-size:14px;">6.3 回调与 API 对照</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">调用的 API </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">可能收到的回调</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">onInit() / <span style="font-size:14px;white-space:normal;">onInit(productCode)</span></span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">onInitSuccess / onInitFailed</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">onLogin() / onGuestLogin() </span>
</td>
<td>
<span style="font-size:14px;white-space:normal;">onLoginSuccess / onLoginFailed</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">onLogout()</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">onLogoutSuccess</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">onPay() / onPayOrder()</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">onPaySuccess / onPayFailed / onPayCancel</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">onRestoreNonConsumptionProducts()</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">onRestoreSuccess</span><br />
</td>
</tr>
</tbody>
</table>
<br />
<br />
</span>
</p>
<br />
<p>
<span style="font-size:14px;"><strong>7. QKSettings 统一配置</strong></span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">菜单:QuickSDK → Settings→ 编辑 Assets/Resources/QKSettings.asset</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">字段</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">i</span><span style="font-size:14px;white-space:normal;">OS</span><br />
</td>
<td style="width:22%;">
<span style="font-size:14px;white-space:normal;">Andr</span><span style="font-size:14px;white-space:normal;">oid</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">W</span><span style="font-size:14px;white-space:normal;">ebGL</span><br />
</td>
<td style="width:12%;">
<span style="font-size:14px;white-space:normal;">W</span><span style="font-size:14px;white-space:normal;">indows</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">productCode</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">QKSettings/ <span style="font-size:14px;white-space:normal;">o</span><span style="font-size:14px;white-space:normal;">nInit(code)/桥接默认</span></span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">Build 前写入 Manifest</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;"><span style="font-size:14px;white-space:normal;">onInit(productCode)</span></span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">QKSettings</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">baseUrl</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">—</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">写入StreamingAssets/quickgame_sdk/ qg_ipconfig.txt</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">onSetHost</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">SDK 请求域名</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">miniGameChannel</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">— </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">— </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">选择 Channels/<渠道>/QGSDK.js</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">—</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">channelCode 等 UI 字段</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">—</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">—</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">—</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">PC 登录/支付窗体</span><br />
</td>
</tr>
</tbody>
</table>
<br />
</span>
</p>
<span style="font-size:14px;"><span style="color:#E53333;"><strong>注意</strong></span><span style="color:#E53333;"><strong>:iOS 推荐 </strong></span><span style="color:#E53333;"><strong>QKSettings</strong></span><span style="color:#E53333;"><strong> + </strong></span><span style="color:#E53333;"><strong>onInit(productCode)</strong></span><span style="color:#E53333;"><strong> 或导出时写入桥接默认</strong></span><span style="color:#E53333;"><strong>;Android 使用无参 </strong></span><span style="color:#E53333;"><strong>onInit()</strong></span><span style="color:#E53333;"><strong>(productCode 在 Build 写入 Manifest);</strong></span><span style="color:#E53333;"><strong>WebGL 须 </strong></span><span style="color:#E53333;"><strong>onSetHost</strong></span><span style="color:#E53333;"><strong> + </strong></span><span style="color:#E53333;"><strong>onInit(productCode)</strong></span></span><br />
<br />
<br />
<br />
<p>
<span style="font-size:14px;"><strong>8. 分平台导出说明</strong></span>
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">Unity 脚本接入完成后,必须完成对应原生/宿主配置。详细步骤见后面的分平台操作文档</span>
</p>
<br />
<p>
<br />
</p>
<span style="font-size:14px;"> 8.1 iOS 要点摘要</span>
<p>
<br />
</p>
<span style="font-size:14px;"><span style="font-size:14px;white-space:normal;">- </span>releaseSDK 查找顺序:QuickGameIOSIntegrationSettings.ReleaseSdkRoot(默认 iOS/releaseSDK)→ UNITY_QUICKGAME_SDK_ROOT → ../quickgame/releaseSDK</span><br />
<span style="font-size:14px;"> - Unity Build iOS 后,IOSPostProcessBuild 自动拷贝 SDK 到 Frameworks/QuickGameSDK/、写 -ObjC、DevAny 签名、微信/QQ plist 与 URL 回调 </span><br />
<span style="font-size:14px;"> - Unity 2019.3+:.framework / .a → UnityFramework;.bundle → Unity-iPhone</span><br />
<span style="font-size:14px;"> - productCode 写在 QKConnector.mm 或由发版包预写入 </span><br />
<span style="font-size:14px;"> - Unity 不能直接出 IPA,须在 Xcode Archive </span><br />
<p>
<br />
</p>
<p>
<br />
</p>
<span style="font-size:14px;"> 8.2 Android 要点摘要</span><br />
<br />
<span style="font-size:14px;"> - Assets/Plugins/Android/libs/ 放置商务 AAR(如 app-release.aar) </span><br />
<span style="font-size:14px;"> - Build 前 AndroidPreprocessBuild 从 QKSettings 写入 productCode 与 qg_ipconfig.txt</span><br />
<span style="font-size:14px;"> - QKConnector.java 位于 com/quickgame/unity/,经 AndroidPostGenerateGradle 参与编译 </span><br />
<span style="font-size:14px;"> - 支付使用 onPay(...),回调 JSON 字段与 iOS 一致 </span><br />
<p>
<br />
</p>
<p>
<br />
</p>
<span style="font-size:14px;">8.3 WebGL 要点摘要</span><br />
<br />
<span style="font-size:14px;"> - 渠道 SDK 放在 Assets/QuickGameSDK/Channels/wx|ali/QGSDK.js</span><br />
<span style="font-size:14px;"> - QuickSDK → Settings → Rebuild WebGL Bridge 生成 QuickGameWebGLBootstrap.jspre + QuickGameWebGL.jslib</span><br />
<span style="font-size:14px;"> - 须 onSetHost + onInit(productCode);支付使用 onPayOrder,不用 onPay</span><br />
<span style="font-size:14px;"> - 微信:Import 微信 unitypackage → WebGL Build → 微信开发者工具转包(见 [WebGL.md](./WebGL.md)) </span><br />
<p>
<br />
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">8.4 Wi</span><span style="font-size:14px;">ndows 要点摘要</span>
</p>
<br />
<span style="font-size:14px;"> - QKGame 经 WindowsQGAdapter 对接 Assets/Plugins/Windows/ 下 PC SDK </span><br />
<span style="font-size:14px;"> - onInit() 读取 QKSettings;支付前须 onUpdateRole</span><br />
<span style="font-size:14px;"> - 将 PCSDKUI.exe 放到 StreamingAssets/Quicksdk/PCSDK_release/</span><br />
<span style="font-size:14px;"> - 须在 Windows 环境 Build 与运行 </span><br />
<br />
<br />
<br />
<p>
<span style="font-size:14px;"><strong>9. productCode 与渠道参数</strong></span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">参数</span><span style="font-size:14px;"></span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">获取方式</span><span style="font-size:14px;"></span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">使用位置</span><span style="font-size:14px;"></span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">productCode </span><span style="font-size:14px;"></span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;"><span style="font-size:14px;">QuickGame 后台</span><span style="font-size:14px;"></span></span><span style="font-size:14px;"></span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">iOS:QKConnector.mm;Android:QKSettings → Manifest;WebGL:onInit;Windows:QKSettings</span><span style="font-size:14px;"></span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;">baseUrl</span><span style="font-size:14px;"></span><br />
</td>
<td>
<span style="font-size:14px;">平台运营人员</span><br />
</td>
<td>
<span style="font-size:14px;">Android:qg_ipconfig.txt;WebGL:onSetHost;Windows:QKSettings</span><span style="font-size:14px;"></span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;">微信<span style="font-size:14px;white-space:normal;"> AppId / Secret / Universal Link</span></span><span style="font-size:14px;"></span><br />
</td>
<td>
<span style="font-size:14px;">微信开放平台</span><span style="font-size:14px;"></span><br />
</td>
<td>
<span style="font-size:14px;">configureThirdPartyLogin、Info.plist</span><span style="font-size:14px;"></span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;">QQ <span style="font-size:14px;white-space:normal;">AppId / Universal Link</span></span><span style="font-size:14px;"></span><br />
</td>
<td>
<span style="font-size:14px;"><span style="font-size:14px;white-space:normal;">QQ 互联</span></span><br />
</td>
<td>
<span style="font-size:14px;">同上</span><span style="font-size:14px;"></span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;">内购商品 ID</span><span style="font-size:14px;"></span><br />
</td>
<td>
<span style="font-size:14px;">App Store / 后台</span><span style="font-size:14px;"></span><br />
</td>
<td>
<span style="font-size:14px;">onPay 的 productId</span><span style="font-size:14px;"></span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;">miniGameChannel</span><span style="font-size:14px;"></span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">平台运营人员</span><br />
</td>
<td>
<span style="font-size:14px;">WebGL:Channels/<渠道>/QGSDK.js</span><br />
</td>
</tr>
</tbody>
</table>
<br />
<br />
<br />
<p>
<span style="font-size:14px;"><strong>10. Demo 与自测</strong></span>
</p>
<p>
<br />
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;"><span style="white-space:pre;">10</span><span style="white-space-collapse:collapse;">.1 参考场景</span></span>
</p>
<p>
<span style="font-size:14px;"><span style="white-space-collapse:collapse;"><br />
</span></span>
</p>
<span style="font-size:14px;"><span style="line-height:2;">打开 Asset</span><span style="line-height:2;">s/Scenes/QuickGameDemo.unity:</span><br />
<span style="line-height:2;">物体挂载 QuickGameDemoListener + QuickGameDemoController </span><br />
<span style="line-height:2;">自动读取 QKSettings 填充 demoHost / demoProductCode </span><br />
<span style="line-height:2;">真机/对应平台运行后按按钮测试:Init → Login → 上传角色 → Pay → Logout </span><br />
</span>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">10.2 建议验收项</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">项</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">iO</span><span style="font-size:14px;white-space:normal;">S</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">Android</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">WebGL</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">Wind</span><span style="font-size:14px;white-space:normal;">ows</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">I</span><span style="font-size:14px;white-space:normal;">n</span><span style="font-size:14px;white-space:normal;">it</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">onInitS</span><span style="font-size:14px;white-space:normal;">ucc</span><span style="font-size:14px;white-space:normal;">ess</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">同左</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">onSetHost + </span><span style="font-size:14px;white-space:normal;">onInit <span style="font-size:14px;white-space:normal;">后成</span><span style="font-size:14px;white-space:normal;">功</span></span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">同 iOS</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">Lo</span><span style="font-size:14px;white-space:normal;">gin</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">uid/token <span style="font-size:14px;white-space:normal;">非空</span></span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">同左</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">同左</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">同左</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">上传角色</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">o</span><span style="font-size:14px;white-space:normal;">nUpdateRole <span style="font-size:14px;white-space:normal;">无崩溃</span></span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">同左</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">同左</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">支付前必</span><span style="font-size:14px;white-space:normal;">调</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">P</span><span style="font-size:14px;white-space:normal;">ay</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">成功/失败/取消 回调</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">同左</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">onPayOrder 回调</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">同左</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">渠道</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">微信/QQ 回调(若已接)</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">—</span><span style="font-size:14px;white-space:pre;"> </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">微信/支付宝宿主内登录支付</span><span style="font-size:14px;white-space:pre;"> </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">PC 弹窗流程</span><br />
</td>
</tr>
</tbody>
</table>
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><strong>11. 常见问题</strong></span>
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">现象</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">处理</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">Edi</span><span style="font-size:14px;white-space:normal;">tor <span style="font-size:14px;white-space:normal;">下无回调</span><span style="font-size:14px;white-space:pre;"> </span></span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">正常;须真机或对应平台 Player</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">setListener 后仍无回调</span><span style="font-size:14px;white-space:pre;"> </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">检查 GameObject 名称、Listener 是否挂在该物体上</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">iOS:JySDKManager.h not found</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">未找到 releaseSDK;确认 iOS/releaseSDK 或设 UNITY_QUICKGAME_SDK_ROOT 后重新 Build iOS</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">iOS:jywlNamed / HXTextView 崩溃</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">UnityFramework 缺少 -ObjC</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">iOS:Xcode 中 SDK 文件夹红色</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">确认磁盘存在 Frameworks/QuickGameSDK,重新导出</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">微信/QQ 无法回调</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">检查 configureThirdPartyLogin、URL Scheme、Universal Link</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">Android Build 失败</span><span style="font-size:14px;white-space:normal;">:productCode 为空</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">在 QuickSDK → Settings 填写 QKSettings</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">WebGL Build 失败:渠道无效</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">检查 Channels/<miniGameChannel>/QGSDK.js 是否存在,Rebuild Bridge</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">WebGL 初始化无效</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">是否先 onSetHost 再 onInit(productCode)</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">Windows 支付无反应</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">是否</span><span style="font-size:14px;white-space:normal;">先 onUpdateRole;PCSDKUI.exe 是否在 StreamingAsse</span><span style="font-size:14px;white-space:normal;">t</span><span style="font-size:14px;white-space:normal;">s</span><br />
</td>
</tr>
</tbody>
</table>
<br />
<br />
</span>
</p>
<p>
<span style="white-space:pre;font-size:14px;"> </span>
</p>
<p>
<span style="font-size:14px;"><span style="white-space:pre;"><strong>12</strong></span><strong>. 文件索引</strong></span>
</p>
<p>
<br />
</p>
<p>
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">文件</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">作用</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">Plugins/QuickGameSDK/Scripts/QKGame.cs</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">全平台 API 入口</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">Plugins/QuickGameSDK/Scripts/QuickListener.cs</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">回调基类与 JSON 解析</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">Plugins/QuickGameSDK/Scripts/QuickGameAndroidBridge.cs</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">Android JNI 桥</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">Plugins/QuickGameSDK/Scripts/QuickGameWebGLBridge.cs</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">WebGL jslib 桥</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">Plugins/Android/com/quickgame/unity/QKConnector.java</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">Android 原生桥</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">Plugins/Windows/Plugins/script/WindowsQGAdapter.cs</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">Windows 适配层</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">Plugins/QuickGameSDK/Editor/IOSPostProcessBuild.cs</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">iOS 导出后自动集成 SDK</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">Plugins/QuickGameSDK/Editor/QuickGameIOSIntegrationSettings.cs</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">iOS 微信/QQ、ReleaseSdkRoot</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">Plugins/QuickGameSDK/Editor/AndroidPreprocessBuild.cs</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">Android Build 前写配置</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">Plugins/QuickGameSDK/Editor/AndroidPostGenerateGradle.cs</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">Android Gradle 合并</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">Plugins/QuickGameSDK/Editor/QuickGameWebGLChannelBuilder.cs</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">小游戏渠道 jspre/jslib 构建</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">Plugins/QuickGameSDK/Channels/*/QGSDK.js</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">小游戏各渠道资源</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">Plugins/WebGL/QuickGameWebGL.jslib</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">WebGL 原生插件</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">Plugins/Windows/Plugins/script/PackageSettings.cs</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">QKSettings 字段定义</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">Resources/QKSettings.asset</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">运行时 / 构建配置</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">Plugins/QuickGameSDK/Demo/QuickGameDemoController.cs</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">Demo 按钮逻辑</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">Plugins/QuickGameSDK/Demo/QuickGameDemoListener.cs</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">Demo 回调实现</span><br />
</td>
</tr>
<tr>
<td>
<p>
<span style="white-space:normal;font-size:14px;">iOS/releaseSDK/</span>
</p>
</td>
<td>
<p>
<span style="font-size:14px;white-space:normal;">默认 iOS 原生 SDK 目录</span>
</p>
</td>
</tr>
</tbody>
</table>
</p>
<p>
<br />
</p>
<p>
<span style="font-size:16px;"><br />
</span>
</p>
<p>
<span style="font-size:16px;"><br />
</span>
</p>
<h4>
<span style="font-size:16px;">二、</span><span style="font-size:16px;">Android 部分说明</span>
</h4>
<p>
<br />
</p>
<p>
<br />
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;"><strong>1. 架构概览</strong></span>
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<pre class="brush:js;toolbar:false">
<p>
CP 游戏代码
</p>
↓
QKGame.cs(统一 API,与 iOS 相同)
↓
QuickGameAndroidBridge.cs(C# → Java 反射调用)
↓
QKConnector.java(Unity 桥接层,对接 QGManager)
↓
QuickGame Android SDK(AAR:app-release.aar 等)
↓
UnitySendMessage → QuickListener(回调)</pre>
<p>
<br />
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;"><strong>2. </strong></span><span style="font-size:14px;"><strong>Android Studio 对接 SDK 并封装接口</strong></span>
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;"><br />
</span><span style="font-size:14px;">2.1 工程结构(QuickGame_unity)</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span><span style="font-size:14px;">Android Studio 侧以 Library Module 形式封装,供 Unity 合并 AAR:</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<pre class="brush:js;toolbar:false">QuickGame_unity/
├── app/ # 主模块,导出 AAR
│ ├── libs/ # SDK 本地 jar/aar + unity-classes.jar(compileOnly)
│ ├── src/main/
│ │ ├── AndroidManifest.xml # SDK Activity / Provider / meta-data 模板
│ │ └── java/com/qk/game/
│ │ ├── GameApplication.java # Application,调用 QGManager.initMsa
│ │ └── MainActivity.java # 继承 QuickUnityPlayerproxyActivity
│ └── build.gradle.kts
├── aarlib/ # flatDir 本地 aar(编译用,需同步拷贝到 Unity)
└── unity_export/ # exportUnitySdk 任务输出目录</pre>
<p>
<br />
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">2.2 SDK 依赖接入</span>
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">本地 AAR/JAR(打进 AAR 或 Unity libs):</span>
</p>
<p>
<span style="font-size:14px;">app-release.aar(QuickGame SDK 主包,含 QGManager、LoginActivity 等)</span>
</p>
<p>
<span style="font-size:14px;">渠</span><span style="font-size:14px;">道/统计依赖:channelsdk、oaid_sdk、auth_number_product、巨量系列 AAR 等</span>
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">Maven 依赖(不会自动打进 AAR,Unity mainTemplate.gradle 需同步声明):</span>
</p>
<pre class="brush:js;toolbar:false">implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.21'
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'androidx.core:core:1.6.0'
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
implementation 'com.taptap.sdk:tap-login:4.8.2'
implementation 'com.taptap.sdk:tap-core:4.8.2'
implementation 'com.taptap.sdk:tap-update:4.8.2'
implementation 'com.taptap.sdk:tap-review:4.8.2'
implementation 'com.google.android.flexbox:flexbox:3.0.0'
implementation 'com.tencent.vasdolly:helper:3.0.4'</pre>
<br />
<span style="font-size:14px;"><span style="color:#E53333;"><strong>注意: unity-classes.jar 仅 compileOnly,不得打入 AAR;Un</strong></span><span style="color:#E53333;"><strong>ity 导出工程由 mainTemplate.gradle 以 implementation files('libs/unity-classes.jar') 提供</strong></span></span>
<p>
<br />
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">2.3 导出 AAR 到 Unity</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">在 Android Studio 工程根目录执行:</span>
</p>
<pre class="brush:js;toolbar:false">./gradlew :app:exportUnitySdk</pre>
<br />
<p>
<span style="font-size:14px;">输出到 unity_export/,包含:</span>
</p>
<p>
<span style="font-size:14px;">quickgame-unity-bridge.aar(即 app-release.aar 重命名)</span>
</p>
<p>
<span style="font-size:14px;">aarlib/ 下各 flat AAR</span>
</p>
<br />
<span style="font-size:14px;">将上述 AAR 全部拷贝到 Unity 工程:</span><br />
<br />
<pre class="brush:js;toolbar:false">Assets/Plugins/Android/libs/</pre>
<br />
<br />
<span style="font-size:14px;">2.4 Unity 桥接类 QKConnector.java</span>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">桥接类职责:对接 QGManager,通过 UnitySendMessage 回调 Unity QuickListener</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">Java 静态方法</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">对应 QGManager</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">Unity 回调</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">setListener(name)</span><span style="white-space:pre;"> </span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">—</span><span style="white-space:pre;"> </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">注册 listener GameObject 名</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">init()</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">QGManager.init(activity, productCode, cb)</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">onInitSuccess / onInitFailed</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">login()</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">QGManager.login</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">onLoginSuccess / onLoginFailed</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">loginAsGuest()</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">QGManager.slienceLogin</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">同上</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">userCenter()</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">QGManager.showUserCenter</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">—</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">logout()</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">QGManager.logout</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">onLogoutSuccess</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">pay(...)</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">QGManager.pay</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">onPaySuccess / onPayFailed</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">updateRole(...)</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">QGManager.setGameRoleInfo</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">—</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">bindPhone()</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">QGManager.showBind</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">—</span><br />
</td>
</tr>
</tbody>
</table>
<br />
<span style="font-size:14px;"><span style="color:#E53333;"><strong>关键实现要点</strong></span><span style="color:#E53333;"><strong>:</strong></span></span><br />
<br />
<span style="font-size:14px;line-height:2;">1. 所有 SDK UI 调用必须在 UI 线程(runOnUiThread)</span><br />
<span style="font-size:14px;line-height:2;">2. init() 从 Manifest meta-data QKproductCode 读取 productCode</span><br />
<span style="font-size:14px;line-height:2;">3. 注册 ActivityLifecycleCallbacks:Resume 时 QGManager.showFloat(true),Pause 时 hideFloat()</span><br />
<span style="font-size:14px;line-height:2;">4. 回调 JSON 字段与 iOS / QuickListener 字符串重载一致</span>
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;color:#E53333;"><strong>productCode 读取(防 Float 精度丢失):</strong></span><br />
<br />
<span style="font-size:14px;">Manifest 中写入 code:65195142454045007867755657815091 前缀格式;Java 侧 readProductCode() 去掉 code: 前缀后再传给 SDK</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<br />
<span style="font-size:14px;">2.5 AndroidManifest 模板(AS 侧完整版)</span>
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">AS 工程 app/src/main/AndroidManifest.xml 包含 SDK 所需的完整声明,Unity 侧需按需合并,至少包括:</span><br />
<br />
<span style="font-size:14px;">权限:INTERNET、READ_PHONE_STATE、REQUEST_INSTALL_PACKAGES 等</span><br />
<br />
<span style="font-size:14px;">queries:微信、支付宝、TapTap 等包名</span><br />
<br />
<span style="font-size:14px;">Application:com.qk.game.GameApplication(QGManager.initMsa)</span><br />
<br />
<span style="font-size:14px;">MainActivity:com.qk.game.MainActivity(继承 Unity 代理 Activity)+ MAIN/LAUNCHER</span><br />
<br />
<span style="font-size:14px;">SDK Activity:LoginActivity、PayActivity、DownloadActivity 等(<span style="color:#E53333;"><strong>缺少会导致 ClassNotFoundException</strong></span>)</span><br />
<br />
<span style="font-size:14px;">Provider:QGFileProvider</span><br />
<br />
<span style="font-size:14px;">渠道 meta-data:QQ_APP_ID、WX_APP_ID、TAP_ID 等(按 CP 实际参数替换 QK0 占位符)</span><br />
<strong style="font-size:14px;"><br />
</strong>
</p>
<p>
<strong style="font-size:14px;"><br />
</strong>
</p>
<p>
<strong style="font-size:14px;"><br />
</strong>
</p>
<p>
<strong style="font-size:14px;">3. 导入资源到 Unity 工程</strong>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">3.1 目录清单</span>
</p>
<p>
<br />
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">将以下内容放入 Unity 工程 Assets/:</span>
</p>
<p>
<span style="font-size:14px;"> </span>
</p>
<pre class="brush:js;toolbar:false">Assets/
├── QuickGameSDK/
│ ├── Scripts/
│ │ ├── QKGame.cs # 统一 API 入口(CP 只调此类)
│ │ ├── QuickListener.cs # 回调基类
│ │ └── QuickGameAndroidBridge.cs # Android C# 桥接
│ ├── Editor/
│ │ ├── AndroidPreprocessBuild.cs # Build 前写 productCode / baseUrl
│ │ └── AndroidPostGenerateGradle.cs # Gradle 生成后拷贝 QKConnector.java
│ └── Demo/ # 可选 Demo 场景
│ ├── QuickGameDemoController.cs
│ └── QuickGameDemoListener.cs
├── Plugins/
│ ├── Android/
│ │ ├── AndroidManifest.xml # 自定义 Manifest
│ │ ├── mainTemplate.gradle # unityLibrary 依赖模板
│ │ ├── baseProjectTemplate.gradle # AGP 7.4.2 + R8
│ │ ├── gradleTemplate.properties
│ │ ├── com/quickgame/unity/
│ │ │ └── QKConnector.java # 桥接源码(Build 后拷贝到 Gradle 工程)
│ │ └── libs/
│ │ ├── app-release.aar # SDK 主 AAR
│ │ ├── unity-classes.jar # Unity 运行时(implementation,非 compileOnly)
│ │ └── *.aar # 其他依赖 AAR
│ └── JsonNet/ # Newtonsoft.Json(QuickListener 解析 JSON)
├── QuickGameSDK/Windows/Plugins/script/
│ └── PackageSettings.cs # QKSettings ScriptableObject 定义
├── QuickGameSDK/Windows/Editor/
│ └── PackageSettingsWindow.cs # QuickSDK → Settings 菜单
└── Resources/
└── QKSettings.asset # 运行时/构建配置</pre>
<br />
<p>
<br />
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"></span><span style="font-size:14px;">3.2 Unity Project Settings 必开项</span>
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">Edit → Project Settings → Player → Android → Publishing Settings:</span><br />
<br />
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">选项</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">值</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">Custom Main Manifest</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">✅</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">Custom Main Gradle Template</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">✅</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">Custom Base Gradle Template</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">✅</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">Custom Gradle Properties Template</span><span style="white-space:pre;"> </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">✅</span><br />
</td>
</tr>
</tbody>
</table>
<br />
<span style="font-size:14px;">Edit → Preferences → External Tools:</span><br />
<br />
<span style="font-size:14px;">JDK:建议 JDK 17(Unity 2022 + AGP 7.4.2;sdkmanager 亦需 JDK 17)</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<br />
<span style="font-size:14px;">3.3 Gradle 模板要点</span>
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">mainTemplate.gradle:</span><br />
<br />
<span style="font-size:14px;">使用 apply plugin: 'com.android.library'(Unity 2022.3 导出为 library 模式)</span><br />
<br />
<span style="font-size:14px;">implementation files('libs/unity-classes.jar') — 必须是 implementation,否则运行时找不到 UnityPlayer</span><br />
<br />
<span style="font-size:14px;">aaptOptions.noCompress 使用 **BUILTIN_NOCOMPRESS** + unityStreamingAssets.tokenize(', ')(不要用旧版 aaptOptions { noCompress ... } 单行写法)</span><br />
<br />
<span style="font-size:14px;">Maven 依赖与 AS 工程保持一致</span><br />
<br />
<span style="font-size:14px;">注释中不要写 **DEPS** 字样(Unity 模板替换会误伤注释)</span><br />
<br />
<span style="font-size:14px;">baseProjectTemplate.gradle:</span>
</p>
<pre class="brush:js;toolbar:false">classpath 'com.android.tools:r8:8.3.37'
id 'com.android.application' version '7.4.2' apply false
id 'com.android.library' version '7.4.2' apply false</pre>
<br />
<br />
<span style="font-size:14px;">3.4 AndroidManifest(Unity 侧)</span>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">Unity 自定义 Manifest 位于 Assets/Plugins/Android/AndroidManifest.xml,需包含:</span>
</p>
<pre class="brush:js;toolbar:false"><meta-data
android:name="QKproductCode"
android:value="code:PLACEHOLDER_PRODUCT_CODE" />
<activity android:name="com.qk.game.MainActivity" ...>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
...
</activity></pre>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">Build 前 AndroidPreprocessBuild 会将 PLACEHOLDER_PRODUCT_CODE 替换为 QKSettings 中的 productCode(带 code: 前缀)</span><br />
<br />
<span style="font-size:14px;">SDK Activity 声明: 若运行时出现 LoginActivity / PayActivity 等 ActivityNotFoundException,需从 AS 工程 Manifest 补全对应 <activity> 节点</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span><br />
<span style="font-size:14px;">3.5 QKConnector.java 编译机制</span>
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">Unity 2022.3 导出 Gradle 时,Plugins/Android/*.java 不一定自动参与 unityLibrary 编译</span><br />
<br />
<span style="font-size:14px;">已通过 AndroidPostGenerateGradle.cs 解决:Gradle 工程生成后,自动将 QKConnector.java 拷贝到:</span>
</p>
<pre class="brush:js;toolbar:false"><导出目录>/unityLibrary/src/main/java/com/quickgame/unity/QKConnector.java</pre>
<br />
<br />
<br />
<p>
<span style="font-size:14px;"><strong>4. Unity C# 接口调用与 QKSettings 配置</strong></span>
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">4.1 QKSettings 配置</span>
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">菜单:QuickSDK → Settings</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">字段</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">Android 用途</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">示例</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">baseUrl</span><span style="white-space:pre;"> </span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">Build 前写入 StreamingAssets/quickgame_sdk/qg_ipconfig.txt</span><span style="white-space:pre;"> </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">https://qkgamesdk.quickapi.net</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">productCode</span><span style="white-space:pre;"> </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">Build 前写入 Manifest</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">QKproductCode</span><span style="white-space:pre;"> </span><span style="white-space:normal;font-size:14px;">65195142454045007867755657815091</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">channelCode</span><span style="white-space:pre;"> </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">子渠道标识<span style="font-size:14px;white-space:normal;">(按 SDK 文档配置)</span></span>
</td>
<td>
<span style="font-size:14px;">cps001,cps002</span><br />
</td>
</tr>
</tbody>
</table>
</span><span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">配置文件路径:Assets/Resources/QKSettings.asset</span>
</p>
<p>
<br />
<span style="font-size:14px;">Build 前自动处理(AndroidPreprocessBuild):</span><br />
<br />
<span style="font-size:14px;">1. 校验 baseUrl、productCode 非空(为空则 Build 失败)</span><br />
<br />
<span style="font-size:14px;">2. 替换 Manifest 中 QKproductCode 值</span><br />
<br />
<span style="font-size:14px;">3. 生成 Assets/StreamingAssets/quickgame_sdk/qg_ipconfig.txt</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span><br />
<span style="font-size:14px;">4.2 CP 接入代码</span>
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">4.2.1. 继承 QuickListener</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<pre class="brush:js;toolbar:false">using quickgame;
using UnityEngine;
public class MyGameListener : QuickListener
{
public override void onInitSuccess() { Debug.Log("Init OK"); }
public override void onInitFailed(ErrorMsg message) { Debug.Log("Init Fail: " + message.errMsg); }
public override void onLoginSuccess(UserInfo userInfo) { Debug.Log("Login: " + userInfo.uid); }
public override void onLoginFailed(ErrorMsg errMsg) { Debug.Log("Login Fail: " + errMsg.errMsg); }
public override void onLogoutSuccess() { }
public override void onPaySuccess(PayResult r) { }
public override void onPayFailed(PayResult r) { }
public override void onPayCancel(PayResult r) { }
}</pre>
<br />
<br />
<span style="font-size:14px;">4.2.2. 注册 Listener 并调用 SDK</span><br />
<br />
<pre class="brush:js;toolbar:false">// Awake 中(必须在 init 之前)
QKGame.setListener(myListenerComponent);
// Android:无参 init,productCode 已由 QKSettings + Manifest 注入
QKGame.onInit();
QKGame.onLogin();
// 支付(Android 使用 onPay,不是 WebGL 的 onPayOrder)
QKGame.onPay(productId, productName, amount, orderNo, callbackUrl, extrasParams);
// 上报角色(支付前建议先调用)
QKGame.onUpdateRole(roleId, roleName, serverId, serverName, roleLevel, vipLevel, rolePower);
QKGame.onLogout();
</pre>
<p>
<br />
</p>
<p>
<br />
<span style="font-size:14px;">4.2.3. Demo 参考</span><br />
<br />
<span style="font-size:14px;">场景:QuickGameDemo.unity</span><br />
<span style="font-size:14px;">脚本:QuickGameDemoController.cs / QuickGameDemoListener.cs</span><br />
<br />
<span style="font-size:14px;">Android Build 下按钮流程:Init → Login → Pay → Logout(与 iOS 相同,无 WebGL 的 SetHost 步骤)</span><br />
<br />
<br />
<span style="font-size:14px;">4.3 回调 JSON 约定</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">原生通过 UnityPlayer.UnitySendMessage(gameObjectName, method, jsonString) 调用 QuickListener 的 字符串重载(QuickListener.cs 内自动解析 JSON)</span><br />
<br />
<span style="font-size:14px;">登录成功:</span>
</p>
<pre class="brush:js;toolbar:false">{
"userId": "123456",
"userToken": "xxx",
"userName": "player1",
"msg": "success",
"timeleft": "-1",
"isNewUser": "0"
}</pre>
<br />
<span style="font-size:14px;">登录/初始化失败:</span><br />
<br />
<pre class="brush:js;toolbar:false">{ "msg": "错误描述" }</pre>
<br />
<span style="font-size:14px;">支付结果:</span>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"> </span>
</p>
<pre class="brush:js;toolbar:false">{
"code": "0",
"message": "success",
"orderNo": "SDK订单号",
"cpOrderNo": "游戏订单号",
"extras": "透传参数"
}</pre>
<br />
<p>
<br />
</p>
<p>
<span style="font-size:14px;">4.4 调用链路(代码层)</span>
</p>
<pre class="brush:js;toolbar:false">QKGame.onInit()
→ QuickGameAndroidBridge.Init()
→ AndroidJavaClass("com.quickgame.unity.QKConnector").CallStatic("init")
→ QGManager.init(activity, productCode, callback)
→ UnitySendMessage("ListenerGO", "onInitSuccess", "")</pre>
<br />
<span style="font-size:14px;"><br />
</span>
<p>
<br />
</p>
<p>
<strong style="font-size:14px;">5. 构建与验收</strong>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span><span style="font-size:14px;">5.1 构建步骤</span>
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">1. QuickSDK → Settings 填写 baseUrl、productCode</span><br />
<span style="font-size:14px;">2. File → Build Settings → Android</span><br />
<span style="font-size:14px;">3. 选择 Export Project 或直接 Build And Run</span><br />
<span style="font-size:14px;">4. 首次 Build 建议在 Unity Console 确认日志:</span><br />
<span style="font-size:14px;">[QuickGame] Android 预处理完成:productCode=...</span><br />
<span style="font-size:14px;">[QuickGame] 已拷贝 QKConnector.java -> ...</span><br />
<br />
<br />
<span style="font-size:14px;">5.2 验收清单</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">步骤</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">操作</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">预期</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">Init</span><span style="white-space:pre;"> </span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">QKGame.onInit()</span><span style="white-space:pre;"> </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">onInitSuccess</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">Login</span><span style="white-space:pre;"> </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">QKGame.onLogin()</span><br />
</td>
<td>
<span style="white-space:pre;"> </span><span style="white-space:normal;font-size:14px;">onLoginSuccess,含 userId / userToken</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">Guest</span><span style="white-space:pre;"> </span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">QKGame.onGuestLogin()</span><span style="white-space:pre;"> </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">静默登录回调</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">Pay</span><span style="white-space:pre;"> </span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">QKGame.onPay(...)</span><span style="white-space:pre;"> </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">onPaySuccess 或 onPayFailed,含 orderNo / cpOrderNo</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">Role</span><span style="white-space:pre;"> </span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">QKGame.onUpdateRole(...)</span><span style="white-space:pre;"> </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">无崩溃,SDK 收到角色信息</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">Logout</span><span style="white-space:pre;"> </span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">QKGame.onLogout()</span><span style="white-space:pre;"> </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">onLogoutSuccess</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">浮球</span><br />
</td>
<td>
<span style="white-space:pre;"> </span><span style="white-space:normal;font-size:14px;">登录后进游戏</span><span style="white-space:pre;"> </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">Resume 显示浮球,Pause 隐藏</span><br />
</td>
</tr>
</tbody>
</table>
<br />
</span><br />
<span style="font-size:14px;">5.3 日志关键字</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<pre class="brush:js;toolbar:false">adb logcat | grep -E "QKConnector|QGManager|QuickGame"</pre>
<br />
<br />
<br />
<p>
<span style="font-size:14px;"><strong>6. 注意事项与常见问题</strong></span>
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">6.1 配置相关</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">问题</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">原因</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">处理</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">productCode <span style="font-size:14px;white-space:normal;">变成错误数字</span></span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">纯数字 meta-data 被 Android 解析为 Float</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">Manifest 使用 code: 前缀 + Java readMetaDataString</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">Init <span style="font-size:14px;white-space:normal;">报 productCode 为空</span></span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">QKSettings 未填或 Build 预处理未执行</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">检查 Settings + Console 预处理日志</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">baseUrl <span style="font-size:14px;white-space:normal;">未生效</span></span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">未生成 qg_ipconfig.txt</span><span style="white-space:pre;"> </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">确认 StreamingAssets/quickgame_sdk/qg_ipconfig.txt 存在</span><br />
</td>
</tr>
</tbody>
</table>
<br />
</span><span style="white-space:pre;"> </span><br />
<span style="font-size:14px;">6.2 编译 / Gradle</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">问题</span><br />
</td>
<td>
<span style="white-space:pre;"> </span><span style="white-space:normal;font-size:14px;">原因</span><span style="white-space:pre;"> </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">处理</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">UnityPlayer / IUnityPlayerLifecycleEvents 找不到</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">unity-classes.jar 为 compileOnly</span><span style="white-space:pre;"> </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">改为 implementation files('libs/unity-classes.jar')</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">Gradle <span style="white-space:normal;font-size:14px;">注释语法错误</span><span style="white-space:pre;"> </span></span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">注释中含 **DEPS** 被 Unity 替换</span><span style="white-space:pre;"> </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">注释改用其他写法</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">AAR 重复类</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">fileTree + DEPS 双重引入</span><span style="white-space:pre;"> </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">去掉 fileTree('*.aar'),仅保留 Unity DEPS 机制</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">AGP / JDK 版本不匹配</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">Unity 2022 需 AGP 7.x + JDK 17</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">检查 External Tools JDK 与 baseProjectTemplate</span><br />
</td>
</tr>
</tbody>
</table>
<br />
</span><br />
<span style="font-size:14px;">6.3 运行时</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">问题</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">原因</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">处理</span><br />
</td>
</tr>
<tr>
<td>
<p>
<span style="white-space:normal;font-size:14px;">QKConnector</span>
</p>
<p>
<span style="font-size:14px;">ClassNotFoundException</span><span style="white-space:pre;"> </span>
</p>
</td>
<td>
<span style="font-size:14px;white-space:normal;">java 未参与 unityLibrary 编译</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">确认 AndroidPostGenerateGradle 拷贝成功</span><br />
</td>
</tr>
<tr>
<td>
<p>
<span style="font-size:14px;white-space:normal;">LoginActivity</span>
</p>
<p>
<span style="font-size:14px;white-space:normal;">ClassNotFoundException</span>
</p>
</td>
<td>
<span style="white-space:normal;font-size:14px;">Manifest 未声明 SDK Activity</span><span style="white-space:pre;"> </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">从 AS 工程 Manifest 补全 Activity</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">桌面无应用图标</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">MainActivity 缺少 LAUNCHER</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">Manifest 为 MainActivity 添加 MAIN/LAUNCHER</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">Manifest 合并冲突</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">configChanges / screenOrientation 与 AAR 冲突</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">使用 tools:replace 显式覆盖</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">回调无响应</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">未 setListener 或 GameObject 名错误</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">Awake 中先 QKGame.setListener(this),物体名与 SendMessage 一致</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">Init <span style="white-space:normal;font-size:14px;">成功但 Listener 收不到</span></span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">init </span><span style="font-size:14px;white-space:normal;">早于 setListener</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">QKConnector 已缓存 init 状态,setListener 后会补发</span><br />
</td>
</tr>
</tbody>
</table>
<br />
</span><br />
<span style="font-size:14px;">6.4 与其他平台共存</span>
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">QKGame.cs / QuickListener.cs 为全平台公共 API,Android 改动不影响 iOS / Windows / WebGL 分支</span><br />
<br />
<span style="font-size:14px;">Android 支付用 onPay();WebGL 小游戏用 onPayOrder()</span><br />
<br />
<span style="font-size:14px;">Android init 无参;WebGL 需 onSetHost + onInit(productCode)</span><br />
<br />
<br />
<span style="font-size:14px;">6.5 SDK 升级流程</span>
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">使用新版 SDK AAR → 替换 Assets/Plugins/Android/libs/</span><br />
<br />
<span style="font-size:14px;">对比 AS 工程 Manifest diff,补全新增 Activity / Provider / meta-data</span><br />
<br />
<span style="font-size:14px;">若 QGManager API 有变,同步修改 QKConnector.java</span><br />
<br />
<span style="font-size:14px;">重新 Export AAR(如有 AS 工程变更)→ Unity Build 真机回归</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><strong>7. 扩展 QuickGame SDK Android 接口</strong></span>
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">当 CP 需要接入 SDK 新增的 QGManager 能力时,需按 「Java 桥接 → C# Bridge → QKGame 对外 API →(可选)QuickListener 回调」 四层逐层暴露</span><br />
<br />
<span style="font-size:14px;">本模块以 QGManager.getChannelId() 为例(同步返回值),并补充 异步回调 类接口的通用写法</span><br />
<br />
<br />
<span style="font-size:14px;">7.1 先判断接口类型</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">类型</span><br />
</td>
<td>
<span style="white-space:pre;"> </span><span style="white-space:normal;font-size:14px;">SDK 特征</span><br />
</td>
<td>
<span style="white-space:pre;"> </span><span style="white-space:normal;font-size:14px;">Unity 暴露方式</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">现有参考</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">同步查询</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">public static String/Bool/Int xxx(),立即返回</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">Java 静态方法 → C# 直接 CallStatic<T> 返回</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">getUID() → onUserID()</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">异步操作</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">带 QGCallBack 或回调参数</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">Java 调 SDK 后在回调里 UnitySendMessage</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">login() → onLoginSuccess</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">UI 操作</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">需 Activity、弹 SDK 界面</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">Java 内 runOnUiThread + 可选回调</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">showUserCenter()、pay()</span><br />
</td>
</tr>
</tbody>
</table>
<br />
</span><span style="font-size:14px;">getChannelId() 属于 同步查询,与 userId() / deviceId() 同一模式,不需要改 QuickListener(除非 CP 希望用事件推送而非主动查询)</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<br />
<span style="font-size:14px;">7.2 扩展链路总览</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<img src="https://staticsite.quickapi.net/data/newFiles/20260623/20260623170353cHWw683.png" alt="" style="font-size:14px;" />
</p>
<p>
<br />
<span style="font-size:14px;">异步接口在 QKConnector 与 QuickListener 之间多一条 UnitySendMessage 回路(见 7.5)</span><br />
<br />
<br />
<span style="font-size:14px;">7.3 示例一:同步接口 getChannelId()(完整四步)</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">Step 0:在 QuickGame_unity 中确认 SDK API(可选但推荐)</span><br />
<span style="font-size:14px;">在 Android Studio 工程引入最新 AAR 后,可先写一段原生测试代码验证 API 可用(不必提交,仅用于确认签名与返回值):</span>
</p>
<pre class="brush:js;toolbar:false">// QuickGame_unity/app/src/main/java/com/qk/game/MainActivity.java(临时验证)
Log.d("Test", "channelId=" + com.quickgamesdk.QGManager.getChannelId());</pre>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">确认无误后,正式桥接代码写在 Unity 侧的 QKConnector.java(Build 时由 AndroidPostGenerateGradle 拷贝进 Gradle 工程)</span>
</p>
<br />
<span style="font-size:14px;"><span style="color:#E53333;"><strong>说明:</strong></span> QKConnector.java 维护在 Unity 工程 Assets/Plugins/Android/com/quickgame/unity/,不在 QuickGame_unity 的 app 模块内。QuickGame_unity 主要负责 AAR 打包与 Manifest 模板;Unity 桥接层在 unitybridgecn 维护</span><br />
<br />
<br />
<span style="font-size:14px;">Step 1:QKConnector.java — 封装 QGManager 调用</span>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">文件:Assets/Plugins/Android/com/quickgame/unity/QKConnector.java</span><br />
<br />
<span style="font-size:14px;">在现有同步方法(如 userId())附近新增:</span>
</p>
<pre class="brush:js;toolbar:false">/** 获取 SDK 渠道 ID,对应 QGManager.getChannelId() */
public static String channelId() {
return safeString(QGManager.getChannelId());
}</pre>
<br />
<span style="font-size:14px;">命名约定:</span><br />
<br />
<span style="font-size:14px;">Java 侧用 camelCase,与现有 userId()、userToken() 保持一致</span><br />
<br />
<span style="font-size:14px;">必须用 safeString() 包装,避免向 Unity 返回 null</span><br />
<br />
<span style="font-size:14px;">若 SDK 要求先 init 才能调用,可在方法内加判断并打 Log,或返回空串</span><br />
<br />
<br />
<span style="font-size:14px;">Step 2:QuickGameAndroidBridge.cs — C# 反射调用 Java</span>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">文件:Assets/QuickGameSDK/Scripts/QuickGameAndroidBridge.cs</span>
</p>
<pre class="brush:js;toolbar:false">public static string ChannelId()
{
return Bridge.CallStatic<string>("channelId");
}</pre>
<br />
<span style="font-size:14px;">同时在 #else 分支(Editor / 非 Android)补 stub,避免 Editor 编译报错:</span><br />
<br />
<pre class="brush:js;toolbar:false">public static string ChannelId() { return ""; }</pre>
<br />
<span style="font-size:14px;"><br />
</span>
<p>
<span style="font-size:14px;">Step 3:QKGame.cs — 对外统一 API</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span> <span style="font-size:14px;">文件:Assets/QuickGameSDK/Scripts/QKGame.cs</span><br />
<br />
<span style="font-size:14px;">参照 onUserID() 增加 Android 分支:</span>
</p>
<pre class="brush:js;toolbar:false">/// <summary>获取 SDK 渠道 ID(Android 登录后可用;其他平台返回空串)。</summary>
public static string onChannelId()
{
#if UNITY_ANDROID && !UNITY_EDITOR
return QuickGameAndroidBridge.ChannelId();
#elif UNITY_STANDALONE_WIN
return quicksdk.QuickSDK.getInstance().getChannelId(); // Windows 若已有同名能力可一并暴露
#else
return "";
#endif
}</pre>
<br />
<span style="font-size:14px;">约定:</span><br />
<br />
<span style="font-size:14px;">CP 只调用 QKGame,不直接调 Bridge</span><br />
<br />
<span style="font-size:14px;">方法名与 iOS / Windows 对齐时,用 #if 分平台实现;Android 独有接口可仅写 UNITY_ANDROID 分支</span>
<p>
<br />
</p>
<p>
<span style="font-size:14px;"><br />
</span><span style="font-size:14px;">Step 4:CP 侧调用与验收</span>
</p>
<p>
<br />
</p>
<pre class="brush:js;toolbar:false">// 建议在 onInitSuccess / onLoginSuccess 之后调用
string channelId = QKGame.onChannelId();
Debug.Log("[CP] channelId=" + channelId);</pre>
<br />
<span style="font-size:14px;">验收:</span><br />
<br />
<span style="font-size:14px;">1. Unity Android Build 安装到真机</span><br />
<br />
<span style="font-size:14px;">2. 走完 onInit → onLogin</span><br />
<br />
<span style="font-size:14px;">3. 调用 QKGame.onChannelId(),Logcat 过滤 QKConnector / CP 日志,确认返回值与原生 SDK 一致</span><br />
<br />
<pre class="brush:js;toolbar:false">adb logcat | grep -E "channelId|QKConnector"</pre>
<p>
<br />
</p>
<br />
<span style="font-size:14px;">7.4 同步接口扩展检查清单</span>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">文件</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">动作</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">QKConnector.java</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">新增 public static 方法,内部调 QGManager.xxx()</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:pre;"> </span><span style="white-space:normal;font-size:14px;">QuickGameAndroidBridge.cs</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">新增 CallStatic<T>("方法名") 封装</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">QKGame.cs</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">新增 public static API,#if UNITY_ANDROID 分支</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">Demo(可选)</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">QuickGameDemoController 增加测试按钮</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">文档</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">更新<span style="font-size:14px;white-space:normal;">CP 接入文档中的 API 表</span></span><br />
</td>
</tr>
</tbody>
</table>
</span><span style="white-space:pre;"> </span><span style="font-size:14px;"> </span><br />
<span style="font-size:14px;">无需修改: AndroidPostGenerateGradle.cs(仍拷贝整个 QKConnector.java)、QuickListener.cs(纯同步返回时)</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span> <br />
<span style="font-size:14px;">7.5 示例二:异步接口扩展(带 Unity 回调)</span>
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">若新接口形如 QGManager.doSomething(Activity, QGCallBack callback),需增加 UnitySendMessage → QuickListener 回路。以虚构的 queryChannelInfo 为例:</span><br />
<br />
<br />
<span style="font-size:14px;">Step 1:QKConnector.java</span>
</p>
<pre class="brush:js;toolbar:false">public static void queryChannelInfo() {
runOnUiThread(new Runnable() {
@Override
public void run() {
Activity activity = UnityPlayer.currentActivity;
if (activity == null) {
sendQueryChannelFailed("Unity activity is null");
return;
}
QGManager.queryChannelInfo(activity, new QGCallBack() {
@Override
public void onSuccess() {
try {
JSONObject json = new JSONObject();
json.put("channelId", safeString(QGManager.getChannelId()));
json.put("msg", "success");
sendMessage("onQueryChannelSuccess", json.toString());
} catch (Exception e) {
sendQueryChannelFailed(e.getMessage());
}
}
@Override
public void onFailed(String msg) {
sendQueryChannelFailed(msg);
}
});
}
});
}
private static void sendQueryChannelFailed(String msg) {
sendMessage("onQueryChannelFailed", "{"msg":"" + escapeJson(msg) + ""}");
}</pre>
<br />
<br />
<span style="font-size:14px;">Step 2:QuickGameAndroidBridge.cs</span>
<p>
<br />
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;"> </span>
</p>
<pre class="brush:js;toolbar:false">public static void QueryChannelInfo()
{
Bridge.CallStatic("queryChannelInfo");
}</pre>
<br />
<br />
<span style="font-size:14px;">Step 3:QKGame.cs</span>
<p>
<br />
</p>
<p>
<br />
</p>
<pre class="brush:js;toolbar:false">public static void onQueryChannelInfo()
{
#if UNITY_ANDROID && !UNITY_EDITOR
QuickGameAndroidBridge.QueryChannelInfo();
#elif UNITY_EDITOR
Debug.Log("[QKGame] onQueryChannelInfo (Editor)");
#endif
}</pre>
<br />
<br />
<span style="font-size:14px;">Step 4:QuickListener.cs — 增加回调契约</span><br />
<br />
<pre class="brush:js;toolbar:false">// 1) 抽象方法(CP 必须实现)
public abstract void onQueryChannelSuccess(string channelId);
public abstract void onQueryChannelFailed(ErrorMsg errMsg);
// 2) 字符串重载(Java SendMessage 入口,解析 JSON)
public void onQueryChannelSuccess(string msg)
{
var data = JObject.Parse(msg);
onQueryChannelSuccess(data["channelId"]?.Value<string>() ?? "");
}
public void onQueryChannelFailed(string msg)
{
var data = JObject.Parse(msg);
var err = new ErrorMsg { errMsg = data["msg"]?.Value<string>() ?? "" };
onQueryChannelFailed(err);
}</pre>
<br />
<span style="font-size:14px;">JSON 字段命名须与 Java JSONObject.put 一致,并参考现有 onLoginSuccess / onPaySuccess 的字段风格(Android 与 iOS 尽量统一)</span>
<p>
<br />
</p>
<p>
<br />
<span style="font-size:14px;">Step 5:CP 实现 Listener</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<pre class="brush:js;toolbar:false">public override void onQueryChannelSuccess(string channelId)
{
Debug.Log("[CP] query channel ok: " + channelId);
}
public override void onQueryChannelFailed(ErrorMsg errMsg)
{
Debug.Log("[CP] query channel fail: " + errMsg.errMsg);
}
// 触发
QKGame.onQueryChannelInfo();</pre>
<br />
<br />
<span style="font-size:14px;">7.6 异步接口扩展检查清单</span>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">文件</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">动作</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">QKConnector.java</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">UI 线程调 SDK;成功/失败 sendMessage(method, json)</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">QuickGameAndroidBridge.cs</span><span style="white-space:pre;"> </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">CallStatic 触发</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">QKGame.cs</span><span style="white-space:pre;"> </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">对外 <span style="font-size:14px;white-space:normal;">public static void onXxx()</span></span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">QuickListener.cs</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">新增 abstract + string 重载(JSON 解析)</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">CP Listener <span style="font-size:14px;white-space:normal;">子类</span></span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">实现新 abstract 方法</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">真机验收</span><span style="white-space:pre;"> </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">成功/失败路径各测一遍</span><br />
</td>
</tr>
</tbody>
</table>
<br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">7.7 常见问题</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">问题</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">原因</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">处理</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">CallStatic 报 method not found</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">Java 方法名与 C# 字符串不一致</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">核对大小写,Java 为 channelId 则 C# 传 "channelId"</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">返回空串</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">未 init / 未 login <span style="white-space:normal;font-size:14px;">就查询</span></span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">文档注明调用时机;Java 侧打 Log 辅助排查</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">异步回调进不来</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">Listener 未注册或方法名不匹配</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">SendMessage 的方法名须与 QuickListener 的 public void onXxx(string msg) 完全一致</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">Editor <span style="font-size:14px;white-space:normal;">下无法测试</span></span><br />
</td>
<td>
<p>
<span style="white-space:normal;font-size:14px;">#if UNITY_ANDROID &&</span>
</p>
<p>
<span style="white-space:normal;font-size:14px;">!UNITY_EDITOR</span>
</p>
</td>
<td>
<span style="font-size:14px;white-space:normal;">正常;<span style="font-size:14px;white-space:normal;">仅真机或 Android Player 验证</span></span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">改 Java 后未生效</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">未重新 Build</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">重新 Android Build,确认 Console 有拷贝 QKConnector.java 日志</span><br />
</td>
</tr>
</tbody>
</table>
<br />
<br />
</span><span style="font-size:14px;">7.8 与 QuickGame_unity 的协作关系</span>
</p>
<p>
<br />
<span style="font-size:14px;">QuickGame_unity(AS) unitybridgecn(Unity)</span><br />
<span style="font-size:14px;">───────────────────── ────────────────────</span><br />
<span style="font-size:14px;">商务 SDK AAR 接入 QKConnector.java 桥接 QGManager</span><br />
<span style="font-size:14px;">exportUnitySdk → libs/*.aar ──拷贝──► Plugins/Android/libs/</span><br />
<span style="font-size:14px;">Manifest 模板(Activity 等) ──合并──► Plugins/Android/AndroidManifest.xml</span><br />
<span style="font-size:14px;"> QuickGameAndroidBridge.cs</span><br />
<span style="font-size:14px;"> QKGame.cs → CP 调用</span>
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">分工建议:</span><br />
<br />
<span style="font-size:14px;">SDK 版本升级、AAR 导出、Manifest 大段合并 → 在 QuickGame_unity 完成</span><br />
<br />
<span style="font-size:14px;">Unity 可调用的具体 API、回调 JSON 格式 → 在 unitybridgecn 的 QKConnector + QKGame 完成</span><br />
<br />
<span style="font-size:14px;">每新增一个 CP 可见接口,至少改动 3 个文件(同步)或 4~5 个文件(异步含 Listener)</span>
</p>
<p>
<br />
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;"><span style="font-size:14px;white-space:normal;">相关文件速查</span><br />
</span> <br />
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<p>
<span style="white-space:normal;font-size:14px;"><span style="line-height:1.5;">类型</span></span>
</p>
</td>
<td>
<p>
<span style="font-size:14px;white-space:normal;line-height:1.5;">路径</span>
</p>
</td>
</tr>
<tr>
<td>
<p>
<span style="font-size:14px;white-space:normal;line-height:1.5;">C# API</span>
</p>
</td>
<td>
<p>
<span style="white-space:normal;font-size:14px;line-height:1.5;">Assets/QuickGameSDK/Scripts/QKGame.cs</span>
</p>
</td>
</tr>
<tr>
<td>
<p>
<span style="font-size:14px;white-space:normal;"><span style="line-height:1.5;">C# </span><span style="font-size:14px;white-space:normal;line-height:1.5;">Bridge</span></span>
</p>
</td>
<td>
<p>
<span style="white-space:normal;font-size:14px;line-height:1.5;">Assets/QuickGameSDK/Scripts/QuickGameAndroidBridge.cs</span>
</p>
</td>
</tr>
<tr>
<td>
<p>
<span style="font-size:14px;white-space:normal;line-height:1.5;">回调基类</span>
</p>
</td>
<td>
<p>
<span style="font-size:14px;white-space:normal;line-height:1.5;">Assets/QuickGameSDK/Scripts/QuickListener.cs</span>
</p>
</td>
</tr>
<tr>
<td>
<p>
<span style="font-size:14px;white-space:normal;"><span style="line-height:1.5;">Java </span><span style="font-size:14px;white-space:normal;line-height:1.5;">Bridge</span></span>
</p>
</td>
<td>
<p>
<span style="white-space:normal;font-size:14px;line-height:1.5;">Assets/Plugins/Android/com/quickgame/unity/QKConnector.java</span>
</p>
</td>
</tr>
<tr>
<td>
<p>
<span style="font-size:14px;white-space:normal;line-height:1.5;">Manifest</span>
</p>
</td>
<td>
<p>
<span style="white-space:normal;font-size:14px;line-height:1.5;">Assets/Plugins/Android/AndroidManifest.xml</span>
</p>
</td>
</tr>
<tr>
<td>
<p>
<span style="font-size:14px;white-space:normal;line-height:1.5;">Gradle 模板</span>
</p>
</td>
<td>
<p>
<span style="white-space:normal;font-size:14px;line-height:1.5;">Assets/Plugins/Android/mainTemplate.gradle</span>
</p>
</td>
</tr>
<tr>
<td>
<p>
<span style="white-space:normal;font-size:14px;line-height:1.5;">Build 预处理</span>
</p>
</td>
<td>
<p>
<span style="font-size:14px;white-space:normal;line-height:1.5;">Assets/QuickGameSDK/Editor/AndroidPreprocessBuild.cs</span>
</p>
</td>
</tr>
<tr>
<td>
<p>
<span style="font-size:14px;white-space:normal;line-height:1.5;">Gradle 后处理</span>
</p>
</td>
<td>
<p>
<span style="white-space:normal;font-size:14px;line-height:1.5;">Assets/QuickGameSDK/Editor/AndroidPostGenerateGradle.cs</span>
</p>
</td>
</tr>
<tr>
<td>
<p>
<span style="font-size:14px;white-space:normal;line-height:1.5;">配置</span>
</p>
</td>
<td>
<p>
<span style="white-space:normal;font-size:14px;line-height:1.5;">Assets/Resources/QKSettings.asset</span>
</p>
</td>
</tr>
<tr>
<td>
<p>
<span style="font-size:14px;white-space:normal;line-height:1.5;">Settings 窗口</span>
</p>
</td>
<td>
<p>
<span style="white-space:normal;font-size:14px;line-height:1.5;">Assets/QuickGameSDK/Windows/Editor/PackageSettingsWindow.cs</span>
</p>
</td>
</tr>
<tr>
<td>
<p>
<span style="font-size:14px;white-space:normal;line-height:1.5;">SDK</span><span style="font-size:14px;white-space:normal;line-height:1.5;"> AAR</span>
</p>
</td>
<td>
<p>
<span style="white-space:normal;font-size:14px;line-height:1.5;">Assets/Plugins/Android/libs/app-release.aar</span>
</p>
</td>
</tr>
<tr>
<td>
<p>
<span style="font-size:14px;white-space:normal;line-height:1.5;">AS 导出源</span>
</p>
</td>
<td>
<p>
<span style="white-space:normal;font-size:14px;line-height:1.5;">QuickGame_unity/app/build.gradle.kts</span>
</p>
</td>
</tr>
</tbody>
</table>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><strong>8. 附录:Android Studio 导出命令</strong></span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"> </span>
</p>
<pre class="brush:js;toolbar:false"># 在 QuickGame_unity 工程根目录
./gradlew :app:exportUnitySdk
# 拷贝到 Unity
cp unity_export/*.aar <Unity工程>/Assets/Plugins/Android/libs/
cp unity_export/aarlib/*.aar <Unity工程>/Assets/Plugins/Android/libs/</pre>
<br />
<p>
<br />
</p>
<p>
<span style="font-size:16px;"><br />
</span>
</p>
<p>
<span style="font-size:16px;"><br />
</span>
</p>
<h4>
<span style="font-size:16px;">三、iOS 部分</span><span style="font-size:16px;">说明</span>
</h4>
<p>
<br />
</p>
<p>
<br />
</p>
<p>
<span style="font-size:16px;"><br />
</span>
</p>
<p>
<br />
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">Unity 接口以 Assets/QuickGameSDK/Scripts/ 为准;原生 SDK 目录默认 iOS/releaseSDK</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><strong>1. 接入说明</strong></span>
</p>
<p>
<br />
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">1.1 前提</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">项</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">说明</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">Unity <span style="font-size:14px;white-space:normal;">侧</span></span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">实现 QuickListener,调用 QKGame.setListener、QKGame.startSdk 等 API</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">Build 产物</span><span style="white-space:pre;"> </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">Xcode 工程(.xcodeproj),非 IPA</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">Xcode</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">配置签名、真机运行;</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">验证环境</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">须 iOS 真机;Editor Play 不调用原生 SDK</span><br />
</td>
</tr>
</tbody>
</table>
</span><br />
<span style="white-space:pre;"> </span><br />
<span style="font-size:14px;">1.2 标准接入流程</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span><span style="font-size:14px;">采用 路径 A(自动集成)。工程准备可使用 unitybridgecn 参考工程,或将发版资源集成至自有工程(文件清单见 2.3)</span><br />
<br />
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">步骤</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">操作</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">1</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">向运营人员获取 releaseSDK、productCode;按需获取微信/QQ 参数、内购商品 ID</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">2</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">集成 Unity 脚本、Newtonsoft.Json.dll、IOSPostProcessBuild.cs;解压 iOS/releaseSDK(含 JySDK.framework)</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">3</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">QuickSDK → Settings 配置 QKSettings;Player Settings → iOS 设置 Bundle ID</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">4</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">实现 QuickListener;Awake 中 setListener;合适时机调用 startSdk</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">5</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">Build Settings → iOS → Build</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">6</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">Xcode 配置签名,真机 Run</span><br />
</td>
</tr>
</tbody>
</table>
<br />
<span style="font-size:14px;">调用时序:setListener → startSdk → onInitSuccess → onLogin → onUpdateRole(支付前)→ onPayOrder。</span><br />
<br />
<span style="font-size:14px;">Build 失败 JySDK/JySDKManager.h not found:确认 iOS/releaseSDK 或 UNITY_QUICKGAME_SDK_ROOT(§4)后重新 Build iOS</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">1.3 接入方式</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">路径 A:自动集成(推荐)</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">路径 B:手动集成</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">条件</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">含 IOSPostProcessBuild.cs 且配置 releaseSDK</span><br />
</td>
<td>
<span style="white-space:pre;">未</span><span style="white-space:normal;font-size:14px;">使用导出脚本</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">Unity Build 后</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">自动集成 SDK、桥接、链接参数、微信/QQ 配置</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">仅生成基础 Xcode 工程</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">Xcode 工作</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">签名与真机运行</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">手动集成 SDK 与桥接</span><br />
</td>
</tr>
</tbody>
</table>
</span><span style="white-space:pre;"> </span><span style="white-space:pre;"> </span><br />
<span style="white-space:pre;"> </span><br />
<span style="white-space:pre;"> </span><span style="white-space:pre;"> </span><span style="white-space:pre;"> </span>
</p>
<p>
<span style="font-size:14px;"><strong>2. CP 须手动配置清单</strong></span>
</p>
<p>
<br />
</p>
<p>
<br />
<span style="font-size:14px;">2.1 参数配置</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">配置项</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">获取方</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">配置位置</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">说明</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">productCode</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">QuickGame 后台</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">QuickSDK → Settings 写入 QKSettings.asset;导出时 PostProcess 写入 QKConnector 的 kQKDefaultProductCode</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">运行时推荐 QKGame.startSdk();亦可 onInit(productCode)</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">Bundle ID</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">CP 自有</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">Unity Player Settings → iOS → Bundle Identifier</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">须与苹果开发者后台、描述文件、微信/QQ 应用配置一致</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">内购商品 ID</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">App Store Connect</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">onPayOrder 的 goodsId(或 onPay 的 productId)</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">与 App Store Connect 商品 ID 一致</span><br />
</td>
</tr>
</tbody>
</table>
<br />
</span><br />
<span style="font-size:14px;">2.2 Unity 工程内(CP 代码与资源)</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td style="width:15%;">
<span style="font-size:14px;white-space:normal;">配置项</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">配置位置</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">说明</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">回调监听</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">继承 QuickListener,Awake 最早调用 QKGame.setListener(this)</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">GameObject 名称固定,勿运行时改名</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">初始化</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">QKGame.startSdk()(推荐)</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">自动读 QKSettings、配置微信/QQ、再 onInit;收到 onInitSuccess 后再 onLogin</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">微信/QQ(运行时)</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">QKSettings 中 wxAppId 等字段,由 startSdk() 自动 configureThirdPartyLogin</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">亦可手动调用 configureThirdPartyLogin(须在 onInit 前)</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">微信/QQ(导出 plist)</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">QuickGameIOSIntegrationSettings.cs</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;"><span style="font-size:14px;white-space:normal;">修改 WxAppId、WxUniversalLink、QqAppId 等;</span>正式包勿用 Demo 默认值</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">releaseSDK 路径</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">ReleaseSdkRoot(默认 iOS/releaseSDK)→ UNITY_QUICKGAME_SDK_ROOT → ../quickgame/releaseSDK</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">须含 iOS/SDK/JySDK.framework</span><br />
</td>
</tr>
</tbody>
</table>
</span><br />
<span style="font-size:14px;">推荐代码(无平台 #if):</span><br />
<br />
<span style="font-size:14px;"> </span>
</p>
<pre class="brush:js;toolbar:false">void Awake() => QKGame.setListener(this);
public void StartSdk()
{
QKGame.startSdk(); // 读 QKSettings(含 productCode、微信/QQ)
// 或覆盖:QKGame.startSdk("你的productCode", null);
}
</pre>
<br />
<p>
<span style="font-size:14px;">支付推荐全平台统一:</span>
</p>
<p>
<br />
</p>
<pre class="brush:js;toolbar:false">QKGame.onPayOrder(new QKGame.QKPayOrderInfo {
cpOrderNo = "...", subject = "元宝", goodsId = "com.xxx.item1",
amount = "6", /* 其余角色字段见总文档 §6.2.3 */
});</pre>
<br />
<span style="font-size:14px;"><br />
</span>
<p>
<span style="font-size:14px;">2.3 拷贝到自有 Unity 工程(首次集成)</span>
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">必选</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<pre class="brush:js;toolbar:false">Assets/QuickGameSDK/Scripts/ # QKGame.cs、QuickListener.cs 等
Assets/Plugins/JsonNet/Newtonsoft.Json.dll</pre>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">iOS 强烈建议(自动集成,免 Xcode 手拖 SDK)</span>
</p>
<p>
<br />
</p>
<pre class="brush:js;toolbar:false">Assets/QuickGameSDK/Editor/IOSPostProcessBuild.cs
Assets/QuickGameSDK/Editor/QuickGameIOSIntegrationSettings.cs
iOS/releaseSDK/ # 默认原生 SDK 目录(发版包解压)</pre>
<span style="font-size:14px;">
<p>
<span style="font-size:14px;"><br />
</span>
</p>
桥接文件(QKConnector / QuickGameLifecycle)</span>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">推荐:不放入 Assets/Plugins/iOS/;Build 时由 IOSPostProcessBuild 从 releaseSDK/Unity3d/1. Xcode/ 拷贝到导出工程 Libraries/QuickGame/</span><br />
<br />
<span style="font-size:14px;">手动路径 B:若不用 PostProcess,须自行将桥接文件放入 Assets/Plugins/iOS/ 或导出后拖入 Xcode</span><br />
<br />
<span style="font-size:14px;">发版包等价路径:releaseSDK/Unity3d/1. Xcode/、releaseSDK/Unity3d/2. U3D/</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<br />
<span style="font-size:14px;">2.4 本机证书与签名(无法由 Unity 生成)</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td style="width:17%;">
<span style="font-size:14px;white-space:normal;">配置项</span><br />
</td>
<td>
<span style="white-space:pre;"> </span><span style="white-space:normal;font-size:14px;">操作</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">Apple 开发者账号</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">Xcode → Settings → Accounts 登录</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">证书</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">安装 Development / Distribution 证书</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">描述文件</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">下载与 Bundle ID 匹配的 Profile;参考工程默认名 DevAny</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">Team / Profile 名写入工程</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">环境变量 UNITY_IOS_DEVELOPMENT_TEAM、UNITY_IOS_PROVISIONING_PROFILE,或改 IOSPostProcessBuild.cs 中 DefaultTeamId / DefaultProvisioningProfile</span><br />
</td>
</tr>
</tbody>
</table>
<br />
</span>
</p>
<pre class="brush:js;toolbar:false"># 从终端启动 Unity 前设置(Hub 直接点开 Unity 读不到终端环境变量时,可用 launchctl / 脚本包装)
export UNITY_IOS_DEVELOPMENT_TEAM=你的TeamId
export UNITY_IOS_PROVISIONING_PROFILE=你的描述文件名
export UNITY_QUICKGAME_SDK_ROOT=/path/to/releaseSDK <span style="font-size:14px;"> </span> </pre>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">2.5 微信 / QQ 开放平台(服务器与后台,Unity 外)</span>
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">平台</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">配置</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">微信开放平台</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">iOS 应用 AppId、Universal Link 域名</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">微信</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">服务器部署 apple-app-site-association(与 WxUniversalLink 域名一致)</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">QQ 互联</span><br />
</td>
<td>
<span style="white-space:pre;"> </span><span style="white-space:normal;font-size:14px;">iOS AppId、Universal Link(若使用)</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">与 Unity 一致</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">configureThirdPartyLogin 与 QuickGameIOSIntegrationSettings 中参数须与后台完全一致</span><br />
</td>
</tr>
</tbody>
</table>
<br />
</span>
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">2.6 Info.plist 隐私描述(须 CP 按游戏补充)</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span><span style="font-size:14px;">PostProcess 不会自动写入以下键;按 SDK / 苹果审核要求在 Unity Player Settings → iOS → Other Settings 或导出后 Info.plist 添加:</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">Key</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">何时需要</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">NSPhotoLibraryUsageDescription</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">相册选图</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">NSCameraUsageDescription</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">相机</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">NSMicrophoneUsageDescription</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">麦克风</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">NSUserTrackingUsageDescription</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">ATT 追踪(若接广告归因)</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">NSLocationWhenInUseUsageDescription</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">定位(若 SDK/游戏使用<span style="font-size:14px;white-space:normal;">)</span></span><br />
</td>
</tr>
</tbody>
</table>
<br />
</span><span style="white-space:pre;"> </span><br />
<span style="font-size:14px;">2.7 出包与验证</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">步骤</span><br />
</td>
<td>
<span style="white-space:pre;"> </span><span style="white-space:normal;font-size:14px;">说明</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">Unity Build iOS</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">产出 Xcode 工程,不是 IPA</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">Xcode 真机 Run</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">日常联调;JySDK 为真机库,模拟器无法完整验证</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">Archive → 导出 IPA</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">内测 / 上架</span><br />
</td>
</tr>
</tbody>
</table>
<br />
</span><br />
<span style="white-space:pre;"> </span>
</p>
<p>
<span style="font-size:14px;"><strong>3. 参考工程(unitybridgecn)</strong></span>
</p>
<p>
<br />
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">1. 配置 QKSettings</span><br />
<br />
<span style="font-size:14px;">2. 打开 Assets/Scenes/QuickGameDemo.unity</span><br />
<br />
<span style="font-size:14px;">3. Build iOS → Xcode 真机 Run → 执行 Demo 按钮流程</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><strong>4. releaseSDK 路径与环境变量</strong></span>
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">4.1 查找顺序(IOSPostProcessBuild.ResolveSdkRoot)</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span><span style="font-size:14px;">1. QuickGameIOSIntegrationSettings.ReleaseSdkRoot(默认 iOS/releaseSDK,相对 Unity 工程根目录)</span><br />
<br />
<span style="font-size:14px;">2. 环境变量 UNITY_QUICKGAME_SDK_ROOT</span><br />
<br />
<span style="font-size:14px;">3. 工程内 <工程>/iOS/releaseSDK</span><br />
<br />
<span style="font-size:14px;">4. 同级目录 ../quickgame/releaseSDK(研发联调兜底)</span><br />
<br />
<span style="font-size:14px;">解析失败时 Console 会打印已尝试的完整路径列表</span>
</p>
<p>
<br />
</p>
<p>
<br />
<span style="font-size:14px;">4.2 环境变量(可选)</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">变</span><span style="font-size:14px;white-space:normal;">量</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">作用</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">默认</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">—</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">releaseSDK 根目录(代码常量)</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">ReleaseSdkRoot = "iOS/releaseSDK"</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">UNITY_QUICKGAME_SDK_ROOT</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">覆盖 SDK 路径</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">见 4.1 顺序</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">UNITY_IOS_DEVELOPMENT_TEAM</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">签名 <span style="white-space:normal;font-size:14px;">Team ID</span></span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">X29G7GACDM</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">UNITY_IOS<span style="white-space:normal;font-size:14px;">_PROVISIONING_PROFILE</span></span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">描述文件名称</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">D</span><span style="font-size:14px;white-space:normal;">e</span><span style="font-size:14px;white-space:normal;">v</span><span style="font-size:14px;white-space:normal;">A</span><span style="font-size:14px;white-space:normal;">n</span><span style="font-size:14px;white-space:normal;">y</span><br />
</td>
</tr>
</tbody>
</table>
<br />
</span><br />
<span style="white-space:pre;"> </span>
</p>
<p>
<span style="font-size:14px;"><strong>5. Build iOS 后自动完成(IOSPostProcessBuild)</strong></span>
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">使用参考工程或已拷贝 IOSPostProcessBuild.cs 时,每次 Build iOS 后自动执行,一般无需在 Xcode 重复操作:</span>
</p>
<p>
<br />
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">自动项</span><br />
</td>
<td>
<span style="white-space:pre;"> </span><span style="white-space:normal;font-size:14px;">说明</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">拷贝<span style="font-size:14px;white-space:normal;"> releaseSDK/iOS/SDK/*</span></span><br />
</td>
<td>
<span style="white-space:pre;"> </span><span style="white-space:normal;font-size:14px;">→ Frameworks/QuickGameSDK/</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">链接 JySDK.framework、.a</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;"><span style="font-size:14px;white-space:normal;">UnityFramework </span>Target</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">拷贝 .bundle</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;"><span style="font-size:14px;white-space:normal;">Unity-iPhone </span>Target</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">Other Linker Flags -ObjC</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">UnityFramework + Unity-iPhone</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">拷贝 QKConnector.mm</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">从 releaseSDK/Unity3d/1. Xcode/(若存在)</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">kQKDefaultProductCode</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">若存在 QKSettings.productCode,写入导出工程内 QKConnector.mm</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">微信/QQ URL Scheme</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">Info.plist</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">LSApplicationQueriesSchemes</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">Info.plist</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">URL / Universal Link</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;"><span style="font-size:14px;white-space:normal;">补丁</span> UnityAppController.mm</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">Team / Profile 名称</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">project.pbxproj</span><br />
</td>
</tr>
</tbody>
</table>
<br />
<span style="font-size:14px;">导出成功标志:Console 无红色编译错误;目录含 Unity-iPhone.xcodeproj;日志含 [QuickGame] iOS 导出完成</span><br />
<br />
<span style="font-size:14px;">JySDK 为静态 framework。缺少 -ObjC 时常见崩溃:</span><br />
<span style="font-size:14px;">+[UIImage jywlNamed:]: unrecognized selector、Unknown class HXTextView in Interface Builder file</span>
</p>
<p>
<span style="font-size:14px;"> <br />
</span><span style="font-size:14px;">若报 'JySDK/JySDKManager.h' file not found:未找到 releaseSDK → 确认 iOS/releaseSDK 存在或设置 UNITY_QUICKGAME_SDK_ROOT 后重新 Build iOS(只改 Unity 不会更新已导出的 Xcode 目录)</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><strong>6. 未使用导出脚本时的手动 Xcode 接入</strong></span>
</p>
<p>
<br />
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">仅当 未 使用 IOSPostProcessBuild 时按下列步骤在 Xcode 操作</span>
</p>
<p>
<br />
<br />
<span style="font-size:14px;">6.1 桥接文件</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span><span style="font-size:14px;">将以下文件加入工程(Unity 导出后通常在 Libraries/Plugins/iOS/ 或自行放在 Libraries/QuickGame/):</span><br />
<br />
<span style="font-size:14px;">QKConnector.h / QKConnector.mm</span><br />
<br />
<span style="font-size:14px;">QuickGameLifecycle.h / QuickGameLifecycle.mm</span><br />
<br />
<span style="font-size:14px;">来源:Assets/Plugins/iOS/ 或 releaseSDK/Unity3d/1. Xcode/</span>
</p>
<p>
<br />
</p>
<p>
<br />
<span style="font-size:14px;">6.2 原生 SDK</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span><span style="font-size:14px;">将 releaseSDK/iOS/SDK/ 下 framework / .a / .bundle 拖入 Xcode </span><br />
<br />
<span style="font-size:14px;">Unity 2019.3+:.framework、.a → UnityFramework;.bundle → Unity-iPhone </span><br />
<br />
<span style="font-size:14px;">UnityFramework → Build Settings → Other Linker Flags 添加 -ObjC</span><br />
<br />
<br />
<span style="font-size:14px;">6.3 productCode</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span><span style="font-size:14px;">编辑 QKConnector.mm 中 kQKDefaultProductCode(与 QuickGame 后台一致);或在 Unity 配置 QKSettings 后重新 Build iOS 由 PostProcess 写入</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span><br />
<span style="font-size:14px;">6.4 微信 / QQ</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span><span style="font-size:14px;">Unity:configureThirdPartyLogin(见 2.2)</span><br />
<br />
<span style="font-size:14px;">Xcode Info.plist 手动添加:</span><br />
<br />
<span style="font-size:14px;">CFBundleURLTypes → CFBundleURLSchemes:wx你的AppId、tencent你的QQAppId</span><br />
<br />
<span style="font-size:14px;">LSApplicationQueriesSchemes:weixin、weixinULAPI、mqq、mqqopensdkapi 等</span><br />
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">UnityAppController.mm(对照 releaseSDK/iOS/Demo/AppDelegate.m):</span>
</p>
<p>
<br />
</p>
<pre class="brush:js;toolbar:false">#import "QuickGameLifecycle.h"
// application:openURL:options: 内、转发给 Unity 之前:
if (QuickGameForwardOpenURL(app, url, options))
return YES;
// application:continueUserActivity:restorationHandler: 内:
if (QuickGameForwardContinueUserActivity(application, userActivity, restorationHandler))
return YES;</pre>
<p>
<br />
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">6.5 签名</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span><span style="font-size:14px;">在 Xcode 为 Unity-iPhone 选择 Team、Provisioning Profile;或使用与 PostProcess 相同的 Manual 签名项</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><strong>7. 常见问题</strong></span>
</p>
<p>
<span style="font-size:14px;font-weight:normal;"><br />
</span>
</p>
<p>
<span style="font-size:14px;font-weight:normal;">
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
现象<br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">处理</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">Build Unknown 0 秒、Xcode 目录为空</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">Unity Editor 脚本编译失败;修 Console 红字(如 IOSPostProcessBuild.cs API 不兼容)后重导</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">JySDK/JySDKManager.h not found</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">将 SDK 放到 iOS/releaseSDK 或设置 UNITY_QUICKGAME_SDK_ROOT,重新 Build iOS</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">jywlNamed / HXTextView 崩溃</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">UnityFramework 缺 -ObjC;确认 PostProcess 已执行或手动添加</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">缺少证书 / provisioning profile</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">本机安装证书与描述文件</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">Unity 无登录回调</span><span style="white-space:pre;"> </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">未 setListener 或 Listener 物体名与原生不一致</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">链接 QKInit 失败</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">未加入 QKConnector.mm</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">微信/QQ 授权后无回调</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">检查2.5 后台与 Universal Link;Info.plist Scheme;UnityAppController 转发</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">Editor Play 无 SDK</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">正常;必须真机 Build</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">想要 IPA</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">Unity 只出 Xcode 工程;须 Xcode Archive 或 CI</span><br />
</td>
</tr>
</tbody>
</table>
</span><span style="white-space:pre;"> </span>
</p>
<p>
<span style="white-space:pre;"> </span>
</p>
<p>
<span style="white-space:pre;"> </span>
</p>
<p>
<span style="font-size:14px;"><strong>8. 相关文件</strong></span>
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">文件</span><br />
</td>
<td>
<span style="white-space:pre;"> </span><span style="white-space:normal;font-size:14px;">作用</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">Assets/QuickGameSDK/Scripts/QKGame.cs</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">Unity API</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">Assets/QuickGameSDK/Editor/IOSPostProcessBuild.cs</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">导出后自动集成 SDK、桥接、签名</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">Assets/QuickGameSDK/Editor/QuickGameIOSIntegrationSettings.cs</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">ReleaseSdkRoot、微信/QQ 默认参数</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">Assets/QuickGameSDK/Demo/QuickGameDemoController.cs</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">参考 Demo</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">iOS/releaseSDK/</span><br />
</td>
<td>
<span style="white-space:pre;"> </span><span style="white-space:normal;font-size:14px;">默认原生 SDK 目录</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">releaseSDK/Unity3d/1. Xcode/QKConnector.*</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">桥接源(Build 时拷贝)</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">releaseSDK/Unity3d/1. Xcode/QuickGameLifecycle.*</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">URL 回调转发源</span><br />
</td>
</tr>
<tr>
<td>
<p>
<span style="white-space:normal;font-size:14px;">releaseSDK/iOS/Demo/AppDelegate.m</span>
</p>
</td>
<td>
<p>
<span style="font-size:14px;white-space:normal;">原生 Demo 对照</span>
</p>
</td>
</tr>
</tbody>
</table>
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span><span style="font-size:14px;"><br />
</span>
</p>
<h4>
<span style="font-size:14px;"><span style="font-size:16px;">四、WebGL(</span><span style="font-size:16px;white-space:normal;">小游戏</span><span style="font-size:16px;"></span><span style="font-size:16px;">)部分说明</span></span>
</h4>
<p>
<br />
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;"><strong>架构概览</strong></span>
</p>
<p>
<br />
</p>
<p>
<br />
</p>
<p>
CP 游戏代码
</p>
<p>
<br />
</p>
<pre class="brush:js;toolbar:false"> ↓
QKGame.cs(统一 API)
↓
QuickGameWebGLBridge.cs(C# → jslib DllImport)
↓
QuickGameWebGL.jslib(mergeInto,转发 QuickGameJS.dispatch)
↓
QuickGameWebGLBootstrap.jspre(构建时生成,内联 QGSDK.js + QuickGameJS 适配层)
↓
QGManager(商务 QGSDK.js,wx / ali 等渠道版)
↓
SendMessage → QuickListener(回调)</pre>
<p>
<br />
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><strong>1. 准备渠道 QGSDK.js</strong></span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span><span style="font-size:14px;">1.1 目录结构</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span><span style="font-size:14px;">每个小游戏渠道对应一个目录,内含平台运营人员提供的 QGSDK.js:</span>
</p>
<pre class="brush:js;toolbar:false">Assets/QuickGameSDK/Channels/
├── wx/
│ └── QGSDK.js # 微信小游戏 SDK
└── ali/
└── QGSDK.js # 支付宝小游戏 SDK</pre>
<p>
<br />
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">1.2 QGSDK.js 格式要求</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span><span style="font-size:14px;">文件末尾须包含导出标记(构建脚本用于识别标准 QGSDK 源文件):</span>
</p>
<pre class="brush:js;toolbar:false">module.exports.QGManager = QGManager;</pre>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">构建时 QuickGameWebGLChannelBuilder 会:</span><br />
<br />
<span style="font-size:14px;">1. 去掉上述 module.exports 行</span><br />
<br />
<span style="font-size:14px;">2. 将 QGSDK 主体缩进后嵌入 IIFE</span><br />
<br />
<span style="font-size:14px;">3. 追加 QuickGameJS 适配层(dispatch / SendMessage)</span><br />
<br />
<span style="font-size:14px;">4. 生成 QuickGameWebGLBootstrap.jspre</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span><br />
<span style="font-size:14px;">1.3 新增渠道</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span><span style="font-size:14px;">在 Assets/QuickGameSDK/Channels/ 下新建目录,如 tt(抖音)</span><br />
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">放入运营人员提供的 QGSDK.js</span><br />
<br />
<span style="font-size:14px;">QuickSDK → Settings 中即可在下拉列表看到新渠道</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;"><strong>2. 导入 Unity 工程资源</strong></span>
</p>
<p>
<br />
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">2.1 目录清单</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<pre class="brush:js;toolbar:false">Assets/
├── QuickGameSDK/
│ ├── Scripts/
│ │ ├── QKGame.cs # CP 统一 API
│ │ ├── QuickListener.cs # 回调基类
│ │ └── QuickGameWebGLBridge.cs # WebGL C# 桥接
│ ├── Editor/
│ │ └── QuickGameWebGLChannelBuilder.cs # 渠道构建 + WebGLPreprocessBuild
│ ├── Channels/
│ │ ├── wx/QGSDK.js
│ │ └── ali/QGSDK.js
│ └── Demo/ # 可选
├── Plugins/
│ ├── WebGL/
│ │ ├── QuickGameWebGL.jslib # 自动生成(可入库)
│ │ └── QuickGameWebGLBootstrap.jspre # 自动生成(.gitignore 忽略)
│ └── JsonNet/ # Newtonsoft.Json
├── QuickGameSDK/Windows/Plugins/script/
│ └── PackageSettings.cs # QKSettings 字段定义
├── QuickGameSDK/Windows/Editor/
│ └── PackageSettingsWindow.cs # QuickSDK → Settings
└── Resources/
└── QKSettings.asset # 运行时 / 构建配置</pre>
<p>
<br />
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">2.2 自动生成文件说明</span>
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">文件</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">生成时机</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">是否入库</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">QuickGameWebGLBootstrap.jspre</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">Rebuild / WebGL Build 前</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">通常 .gitignore 忽略,拉代码后需 Rebuild</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">QuickGameWebGL.jslib</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">同上</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">建议入库,保证未 Rebuild 时结构正确</span><br />
</td>
</tr>
</tbody>
</table>
<br />
</span><span style="font-size:14px;">首次拉工程或切换渠道后,在 Unity 菜单执行:</span><br />
<br />
<span style="font-size:14px;">QuickSDK → Settings → Rebuild WebGL Bridge (jspre/jslib)</span><br />
<br />
<span style="font-size:14px;">或直接执行 WebGL Build(构建前会自动 Rebuild)</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><strong>3. QKSettings 配置</strong></span>
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">菜单:QuickSDK → Settings</span><br />
<br />
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">字段</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">用途</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">对应 JS</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">baseUrl</span><span style="white-space:pre;"> </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">SDK 服务器地址</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">QGManager.setHost(host),CP 调用 QKGame.onSetHost(baseUrl)</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">productCode</span><span style="white-space:pre;"> </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">产品码(32 位)</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">QGManager.init(productCode, cb),CP 调用 QKGame.onInit(productCode)</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">miniGameChannel</span><span style="white-space:pre;"> </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">构建渠道</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">选择内联 Channels/<channel>/QGSDK.js(wx / ali)</span><br />
</td>
</tr>
</tbody>
</table>
<br />
<span style="font-size:14px;">配置文件:Assets/Resources/QKSettings.asset</span><br />
<br />
<span style="font-size:14px;">WebGL Build 前校验(WebGLPreprocessBuild):</span><br />
<br />
<span style="font-size:14px;">1. baseUrl 不能为空</span><br />
<br />
<span style="font-size:14px;">2. productCode 不能为空</span><br />
<br />
<span style="font-size:14px;">3. miniGameChannel 必须对应存在的 Channels/<channel>/QGSDK.js</span><br />
<br />
<span style="font-size:14px;">校验通过后自动按当前渠道重生 jspre / jslib</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><strong>4. CP 接入代码</strong></span>
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">4.1 继承 QuickListener</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<pre class="brush:js;toolbar:false">using quickgame;
using UnityEngine;
public class MyGameListener : QuickListener
{
public override void onInitSuccess() { Debug.Log("Init OK"); }
public override void onInitFailed(ErrorMsg message) { Debug.Log("Init Fail: " + message.errMsg); }
public override void onLoginSuccess(UserInfo userInfo) { Debug.Log("Login: " + userInfo.uid); }
public override void onLoginFailed(ErrorMsg errMsg) { Debug.Log("Login Fail: " + errMsg.errMsg); }
public override void onLogoutSuccess() { }
public override void onPaySuccess(PayResult r) { Debug.Log("Pay OK: " + r.cpOrderNo); }
public override void onPayFailed(PayResult r) { Debug.Log("Pay Fail: " + r.message); }
public override void onPayCancel(PayResult r) { }
}</pre>
<br />
<span style="font-size:14px;"><br />
</span>
<p>
<span style="font-size:14px;">4.2 标准调用顺序(WebGL 专用)</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"> </span>
</p>
<pre class="brush:js;toolbar:false">void Start()
{
// 1. 注册回调(Awake 中亦可,必须在 init 之前)
QKGame.setListener(myListener);
// 2. 从 QKSettings 读取(或直接写死测试值)
var settings = Resources.Load<quicksdk.PackageSettings>("QKSettings");
string host = settings.baseUrl;
string productCode = settings.productCode;
// 3. 两步初始化(顺序不可颠倒)
QKGame.onSetHost(host);
QKGame.onInit(productCode);
// 4. 登录
QKGame.onLogin();
}
</pre>
<p>
<br />
</p>
<p>
<strong style="color:#E53333;font-size:14px;">注意: WebGL 下调用无参 QKGame.onInit() 不会初始化 SDK,只会打 Warning。必须先 onSetHost 再 onInit(productCode)</strong>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">4.3 支付</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span><span style="font-size:14px;">WebGL 使用 onPayOrder,参数类型为 QKGame.QKPayOrderInfo(不是 Android 的 onPay):</span>
</p>
<p>
<br />
</p>
<pre class="brush:js;toolbar:false">QKGame.onPayOrder(new QKGame.QKPayOrderInfo
{
cpOrderNo = "order_" + DateTime.UtcNow.Ticks,
subject = "60钻石",
desc = "购买描述",
goodsId = "goods_001",
amount = "6", // 金额(字符串)
extrasParams = "透传参数",
userRoleId = "role_001",
userRoleName = "玩家名",
serverId = "s1",
serverName = "一区",
userLevel = "10",
callbackUrl = "", // 可空,如果游戏下单时设置支付回调,建议支付回调地址加上IP白名单,防止被攥改!!!
buy_quantity = "1"
});</pre>
<p>
<br />
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">4.4 其他 API</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">QKGame 方法</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">说明</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">onGuestLogin()</span><span style="white-space:pre;"> </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">游客 / 静默登录(内部与 login 走同一 JS 分支)</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">onLogout()</span><span style="white-space:pre;"> </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">登出</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">onUpdateRole(...)</span><span style="white-space:pre;"> </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">上报角色(支付前建议调用)</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">onUserCenter()</span><span style="white-space:pre;"> </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">小游戏侧暂不支持,JS 层仅打 Log</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">onRestoreNonConsumptionProducts()</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">小游戏侧 noop,直接回调 onRestoreSuccess</span><br />
</td>
</tr>
</tbody>
</table>
<br />
</span><br />
<span style="font-size:14px;">4.5 Demo 参考</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span><span style="font-size:14px;">场景:QuickGameDemo.unity</span><br />
<span style="font-size:14px;">WebGL Build 下按钮:SetHost → Init(productCode) → Login → Pay (onPayOrder)</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><strong>5. 构</strong><strong>建与导出小游戏</strong></span>
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">5.1 Unity WebGL Build</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span><span style="font-size:14px;">1.QuickSDK → Settings 填写 baseUrl、productCode,选择 Mini Game Channel</span><br />
<br />
<span style="font-size:14px;">2.(可选)点击 Rebuild WebGL Bridge</span><br />
<br />
<span style="font-size:14px;">3.File → Build Settings → WebGL → Build</span><br />
<br />
<span style="font-size:14px;">4. Console 确认日志:</span>
</p>
<pre class="brush:js;toolbar:false">[QuickGame] WebGL bridge rebuilt: channel=wx, jspre=...B, jslib=...B</pre>
<br />
<p>
<br />
</p>
<p>
<span style="font-size:14px;">5.2 转小游戏工程</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">使用对应平台官方工具链将 Unity WebGL 产物转为小游戏</span><br />
<br />
<br />
<span style="font-size:14px;">5.3 与旧方案的区别</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span><span style="font-size:14px;">新方案(当前工程):</span><br />
<br />
<span style="font-size:14px;">QGSDK 已通过 jspre 内联进 Unity WebGL 产物</span><br />
<br />
<span style="font-size:14px;">不需要在宿主 game.js 手动 import QuickGame_Bridge.js</span><br />
<br />
<span style="font-size:14px;">不需要在小游戏工程根目录单独放一份 QGSDK.js</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span><br />
<span style="font-size:14px;">旧方案(母仓早期 Demo):</span><br />
<br />
<span style="font-size:14px;">宿主侧引入 QuickGame_Bridge.js + 商务 QGSDK.js</span><br />
<br />
<span style="font-size:14px;">Unity jslib 仅转发 window._CallMiniGameMethod</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><strong>6. 回调 JSON 约定</strong></span>
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">JS 侧通过 GameGlobal.unityInstance.SendMessage(gameObjectName, method, jsonString) 回调 Unity</span><br />
<span style="font-size:14px;">QuickListener.cs 中的 字符串重载 负责 JSON 解析</span><br />
<br />
<span style="font-size:14px;">初始化</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span><span style="font-size:14px;">成功: onInitSuccess</span>
</p>
<pre class="brush:js;toolbar:false">{ "msg": "init ok" }</pre>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">失败: onInitFailed</span>
</p>
<pre class="brush:js;toolbar:false">{ "msg": "错误描述" }</pre>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">登录</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span><span style="font-size:14px;">成功: onLoginSuccess</span>
</p>
<pre class="brush:js;toolbar:false">{
"userId": "123456",
"userToken": "xxx",
"userName": "player1",
"msg": "login ok",
"timeleft": "-1",
"isNewUser": "0"
}</pre>
<span style="font-size:14px;">
<p>
<span style="font-size:14px;"><br />
</span>
</p>
失败: onLoginFailed</span>
<pre class="brush:js;toolbar:false">{ "msg": "错误描述" }</pre>
<span style="font-size:14px;">
<p>
<span style="font-size:14px;"><br />
</span>
</p>
支付</span>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">成功 / 失败 / 取消(字段与 Android 一致):</span>
</p>
<pre class="brush:js;toolbar:false">{
"code": "0",
"message": "success",
"orderNo": "SDK订单号",
"cpOrderNo": "游戏订单号",
"extras": "透传参数"
}</pre>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">登出</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span><span style="font-size:14px;">成功: onLogoutSuccess</span>
</p>
<pre class="brush:js;toolbar:false">{ "msg": "logout" }</pre>
<p>
<br />
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><strong>7. 内部调用链路(供维护者参考)</strong></span>
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;"><br />
</span><span style="font-size:14px;">以 onLogin() 为例:</span>
</p>
<pre class="brush:js;toolbar:false">QKGame.onLogin()
→ QuickGameWebGLBridge.Login()
→ CallMiniGameMethod("login", "")
→ jslib: QuickGameJS.dispatch("login", "")
→ QGManager.login(callback)
→ send("onLoginSuccess", { userId, userToken, ... })
→ Unity SendMessage → QuickListener.onLoginSuccess(string msg)
→ CP 实现的 onLoginSuccess(UserInfo)</pre>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">jspre / jslib 分层原因:</span><br />
<br />
<span style="font-size:14px;">jspre(--pre-js):可写任意顶层 JS,内联 QGSDK + 适配层</span><br />
<br />
<span style="font-size:14px;">jslib:Unity 要求顶层只能是 mergeInto(LibraryManager.library, {...}),因此仅放 DllImport 入口</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><strong>8. 扩展 WebGL 接口</strong></span>
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">当 CP 需要接入 QGSDK.js 新增能力时,按以下四层扩展(以 QGManager.getChannelId() 为例)</span>
</p>
<p>
<br />
<br />
<span style="font-size:14px;">8.1 判断接口类型</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">类型</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">处理方式</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">同步返回值</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">dispatch 内直接 return 或通过 SendMessage 一次性回传</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">异步回调</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">dispatch 内调 QGManager,在 callback 里 send(method, json)</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">纯 C# 查询</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">Bridge 增加方法 → jslib 增加导出(复杂,优先走 dispatch)</span><br />
</td>
</tr>
</tbody>
</table>
</span><br />
<span style="font-size:14px;">小游戏侧推荐统一走 CallMiniGameMethod(method, param) → QuickGameJS.dispatch,与现有 login / pay 一致</span>
</p>
<p>
<br />
</p>
<p>
<br />
<span style="font-size:14px;">8.2 示例:同步查询 getChannelId()</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span><span style="font-size:14px;">Step 1:QuickGameWebGLChannelBuilder.cs — 在 AdapterSuffixTemplate 的 dispatch 中增加分支</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<pre class="brush:js;toolbar:false">if (method === 'getChannelId') {
var cid = '';
try {
if (QGManager && typeof QGManager.getChannelId === 'function')
cid = String(QGManager.getChannelId() || '');
} catch (e) { console.error('[QuickGame] getChannelId', e); }
send('onChannelIdResult', { channelId: cid, msg: 'ok' });
return;
}</pre>
<span style="font-size:14px;">
<p>
<span style="font-size:14px;"><br />
</span>
</p>
修改 AdapterSuffixTemplate 后须 Rebuild WebGL Bridge 重生 jspre</span>
<p>
<br />
</p>
<p>
<br />
<span style="font-size:14px;">Step 2:QuickGameWebGLBridge.cs</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<pre class="brush:js;toolbar:false">public static void GetChannelId()
{
CallMiniGameMethod("getChannelId", string.Empty);
}</pre>
<br />
<span style="font-size:14px;"><br />
</span>
<p>
<span style="font-size:14px;">Step 3:QKGame.cs</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<pre class="brush:js;toolbar:false">public static void onGetChannelId()
{
#if UNITY_WEBGL && !UNITY_EDITOR
QuickGameWebGLBridge.GetChannelId();
#elif UNITY_EDITOR
Debug.Log("[QKGame] onGetChannelId (Editor)");
#endif
}</pre>
<p>
<br />
</p>
<p>
<span style="font-size:14px;"><br />
</span><span style="font-size:14px;">Step </span><span style="font-size:14px;">4:QuickListener.cs — 增加回调(异步通知模式)</span>
</p>
<p>
<br />
</p>
<pre class="brush:js;toolbar:false">public virtual void onChannelIdResult(string channelId) { }
public void onChannelIdResult(string msg)
{
var data = JObject.Parse(msg);
onChannelIdResult(data["channelId"]?.Value<string>() ?? "");
}</pre>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">Step 5:CP 触发</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<pre class="brush:js;toolbar:false">QKGame.onGetChannelId();
// 在 Listener.onChannelIdResult 中接收结果</pre>
<p>
<br />
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">8.3 扩展检查清单</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">文件</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">动作</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">QuickGameWebGLChannelBuilder.cs</span><span style="white-space:pre;"> </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">dispatch 增加 method 分支</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">QuickGameWebGLBridge.cs</span><span style="white-space:pre;"> </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">增加 Bridge 方法</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">QKGame.cs</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">增加对外 API</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">QuickListener.cs</span><span style="white-space:pre;"> </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">增加回调(若有异步结果)</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">—</span><span style="white-space:pre;"> </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">Rebuild WebGL Bridge → WebGL Build 验证</span><br />
</td>
</tr>
</tbody>
</table>
</span><br />
<span style="font-size:14px;">无需修改: QuickGameWebGL.jslib(通用转发 dispatch,Rebuild 时自动覆盖)</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><strong>9. 注意事项与常见问题</strong></span>
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">9.1 配置与构建</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">问题</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">原因</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">处理</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">Build 失败:baseUrl / productCode 为空</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">QKSettings 未填</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">QuickSDK → Settings 补全</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">Build 失败:miniGameChannel 无效</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">渠道目录缺少 QGSDK.js</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">检查 Channels/<channel>/QGSDK.js</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">jspre 未生成</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">未 Rebuild 且 .gitignore 忽略</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">Settings 点 Rebuild 或 WebGL Build</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">切换 ali 后仍是 wx SDK</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">未 Rebuild</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">改 channel 后 Rebuild + 重新 WebGL Build</span><br />
</td>
</tr>
</tbody>
</table>
<br />
</span><br />
<span style="font-size:14px;">9.2 运行时</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">问题</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">原因</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">处理</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">QuickGameJS not found</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">jspre 未注入</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">确认 WebGL Build 前 Rebuild 成功</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">QuickGameJS.dispatch missing</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;"><span style="font-size:14px;white-space:normal;">bootstrap </span>未完成或 QGSDK 语法错误</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">查 Console [QuickGame] bootstrap done</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">listener 未设置</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">未调 setListener</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">Awake 中 QKGame.setListener(this)</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">Unity 未就绪</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">init 过早,Unity 实例未创建</span><br />
</td>
<td>
<span style="white-space:pre;"> </span><span style="white-space:normal;font-size:14px;">延迟到首帧 / Loading 完成后再 init</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">init 报 productCode is empty</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">未调 onInit 或传空</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">检查 QKSettings 与 CP 传参</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">init 报请初始化 host</span><br />
</td>
<td>
<span style="font-size:14px;">未调 onSetHost</span><span style="font-size:14px;"></span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">先 onSetHost 再 onInit</span><span style="font-size:14px;"></span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;"><span style="font-size:14px;">支付 JSON 解析失败</span><span style="font-size:14px;"></span></span>
</td>
<td>
<span style="white-space:normal;font-size:14px;">QKPayOrderInfo 字段缺失</span><span style="font-size:14px;"></span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;"><span style="font-size:14px;white-space:normal;">必填字段勿传 null,用 ""</span></span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">Editor 下无法测 <span style="font-size:14px;white-space:normal;">SDK</span></span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">#if UNITY_WEBGL && !UNITY_EDITOR</span><span style="white-space:pre;"> </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;"><span style="font-size:14px;white-space:normal;">必须 WebGL</span> Build + 小游戏开发者工具</span><br />
</td>
</tr>
</tbody>
</table>
<br />
</span><br />
<span style="font-size:14px;">9.3 与其他平台共存</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span><span style="font-size:14px;">QKGame.cs / QuickListener.cs 为全平台公共文件,WebGL 改动在 #elif UNITY_WEBGL 分支内</span><br />
<br />
<span style="font-size:14px;">Android / iOS / Windows 不受 WebGL 渠道构建影响</span><br />
<br />
<span style="font-size:14px;">PackageSettings.miniGameChannel 仅 WebGL Build 使用,Android 忽略此字段</span><br />
<br />
<br />
<span style="font-size:14px;">9.4 微信小游戏专项</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span><span style="font-size:14px;">确保 MP 后台配置 request 合法域名(与 baseUrl 一致)</span><br />
<br />
<span style="font-size:14px;">Console 搜索 [QuickGame] 排查 dispatch / SendMessage 日志</span><br />
<br />
<span style="font-size:14px;">iOS 端微信小游戏支付走米大师等特殊逻辑,以商务 QGSDK 文档为准</span><br />
<br />
<br />
<span style="font-size:14px;">9.5 SDK 升级流程</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span><span style="font-size:14px;">商务提供新版 QGSDK.js → 替换 Channels/<channel>/QGSDK.js</span><br />
<br />
<span style="font-size:14px;">Rebuild WebGL Bridge</span><br />
<br />
<span style="font-size:14px;">WebGL Build → 转小游戏 → 开发者工具验证 Init / Login / Pay 全链路</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><strong>10. 验收清单</strong></span>
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">步骤</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">操作</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">预期</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">配置</span><br />
</td>
<td>
<span style="white-space:pre;"> </span><span style="white-space:normal;font-size:14px;">Settings 选 wx,填 baseUrl / productCode</span><span style="white-space:pre;"> </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">保存成功</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">Rebuild</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">Rebuild WebGL Bridge</span><span style="white-space:pre;"> </span><br />
</td>
<td>
<span style="white-space:pre;"><span style="font-size:14px;white-space:normal;">Con</span><span style="font-size:14px;white-space:normal;">sole</span><span style="font-size:14px;"></span> </span><span style="white-space:normal;font-size:14px;"> 输出 channel=wx、jspre/jslib 大小</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">Init</span><span style="white-space:pre;"> </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">onSetHost → onInit</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">onInitSuccess</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">Login</span><span style="white-space:pre;"> </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">onLogin</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">onLoginSuccess,含 userId / userToken</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">Pay</span><span style="white-space:pre;"> </span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">onPayOrder</span><span style="white-space:pre;"> </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">onPaySuccess 或 onPayFailed,含 orderNo / cpOrderNo</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">切渠道</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">改 miniGameChannel=ali,Rebuild,重打</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">包内 SDK 行为随渠道变化</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">Logout</span><span style="white-space:pre;"> </span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">onLogout</span><span style="white-space:pre;"> </span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">onLogoutSuccess</span><br />
</td>
</tr>
</tbody>
</table>
</span><br />
<span style="font-size:14px;">相关文件速查</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">类型</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">路径</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">C# API</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">Assets/QuickGameSDK/Scripts/QKGame.cs</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">C# Bridge</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">Assets/QuickGameSDK/Scripts/QuickGameWebGLBridge.cs</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">回调基类</span><br />
</td>
<td>
<span style="white-space:pre;"> </span><span style="white-space:normal;font-size:14px;">Assets/QuickGameSDK/Scripts/QuickListener.cs</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">渠道构建</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">Assets/QuickGameSDK/Editor/QuickGameWebGLChannelBuilder.cs</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">jslib</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">Assets/Plugins/WebGL/QuickGameWebGL.jslib</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">jspre</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">Assets/Plugins/WebGL/QuickGameWebGLBootstrap.jspre</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">微信 <span style="white-space:normal;font-size:14px;">QGSDK</span></span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">Assets/QuickGameSDK/Channels/wx/QGSDK.js</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">支付宝 <span style="font-size:14px;white-space:normal;">QGSDK</span></span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">Assets/QuickGameSDK/Channels/ali/QGSDK.js</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">配置</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">Assets/Resources/QKSettings.asset</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">Settin</span><span style="font-size:14px;white-space:normal;">gs <span style="font-size:14px;white-space:normal;">窗口</span></span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">Assets/QuickGameSDK/Windows/Editor/PackageSettingsWindow.cs</span><br />
</td>
</tr>
<tr>
<td>
<span style="white-space:normal;font-size:14px;">Demo</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">Assets/QuickGameSDK/Demo/QuickGameDemoController.cs</span><br />
</td>
</tr>
</tbody>
</table>
<br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><strong>11. 附录:打微信 / 支付宝包快速流程</strong></span>
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">1. QuickSDK → Settings</span><br />
<span style="font-size:14px;"> ├── baseUrl = https://qkgamesdk.quickapi.net</span><br />
<span style="font-size:14px;"> ├── productCode = 你的32位产品码</span><br />
<span style="font-size:14px;"> └── miniGameChannel = wx 或 ali</span><br />
<br />
<span style="font-size:14px;">2. Rebuild WebGL Bridge(可选,Build 前也会自动执行)</span><br />
<span style="font-size:14px;">3. Build Settings → WebGL → Build</span>
</p>
<p>
<span style="font-size:14px;">4. 官方工具转小游戏 → 开发者工具导入 → 真机验证</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<h4>
<span style="font-size:16px;">五、</span><span style="font-size:16px;">Windows PC 接入说明</span>
</h4>
<p>
<br />
</p>
<p>
<br />
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">1. 推荐方式(与 iOS 统一)</span>
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">使用 QuickGameDemo.unity + QKGame</span>
</p>
<p>
<br />
</p>
<pre class="brush:js;toolbar:false">QKGame.setListener(this);
QKGame.onInit();
QKGame.onUpdateRole(...); // 支付前必须先上报角色
QKGame.onPay(...);</pre>
<p>
<br />
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><strong>2. Windows资源路径说明</strong></span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">
<table style="width:1000px;" cellpadding="2" cellspacing="0" border="1" bordercolor="#000000">
<tbody>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">项</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">路径</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">PC SDK 脚本</span><br />
</td>
<td>
<span style="font-size:14px;white-space:normal;">Assets/QuickGameSDK/Windows/</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">配置</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">Assets/Resources/QKSettings.asset</span><br />
</td>
</tr>
<tr>
<td>
<span style="font-size:14px;white-space:normal;">Webview程序</span><br />
</td>
<td>
<span style="white-space:normal;font-size:14px;">Assets/StreamingAssets/Quicksdk/PCSDK_release/</span><br />
</td>
</tr>
</tbody>
</table>
<br />
</span>
</p>
<p>
<br />
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;"><strong>3. Build</strong></span>
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;">Build Settings → PC, Mac & Linux Standalone → Target Windows</span>
</p>
<p>
<br />
<span style="font-size:14px;">在 Windows 环境构建与运行</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><strong>4. QKSettings 字段</strong></span>
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;"><br />
</span><span style="font-size:14px;">baseUrl、productCode、channelCode</span><br />
<br />
<span style="font-size:14px;">菜单 QuickSDK → Settings(Editor)可编辑 QKSettings.asset</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><br />
</span>
</p>
<p>
<span style="font-size:14px;"><strong>5. 验收</strong></span>
</p>
<p>
<br />
</p>
<p>
<br />
</p>
<p>
<span style="font-size:14px;">Windows Build 运行 QuickGameDemo</span><br />
<br />
<span style="font-size:14px;">Init → Login → UpdateRole → Pay 回调正常</span>
</p>