点击下载全版本UnityDemo 密码:aa11
点击下载全版本mi_oauth_3.4.3.unitypackage 密码:aa11
一、适用对象
本教程适用于直接使用Unity接入Android SDK的开发者,示例的Unity版本为2021.3.34f1。
2020.3.48f1与2021.3.34f1版本不需要进行额外适配工作,参照下文完成项目配置即可
2018.4.10f1、2019.4.40f1、2022.3.18f1还需参考下文“设置构建方法”与“其它配置”部分进行设置
二、实现方式
通过修改gradle直接依赖小米游戏SDK,使用C#直接调用JAVA接口并接收JAVA回调。
三、参考文档
如果您对文档内容有疑问,请先参考小米游戏SDK使用入门中的相关接口说明。
四、准备工作
1. 创建游戏及配置计费点[点击直达]
2. Unity2018与Unity2019请升级默认的Gradle版本到5.6.4及以上[点击直达]
3. 配置对应版本的SDK和NDK
SDK路径下需要有与Target API Level版本一致的Android SDK
不同的Unity版本对应的NDK版本也不同,具体根据自己的Unity版本进行选择
五、项目配置
1.引入UnityPackage
mi_oauth_3.4.3.unitypackage包含了接入SDK需要的相关配置文件及C#接口文件,如您的项目已经有了自己的AndroidManifest.xml和gradle文件,请手动合并。
注意:由于Gradle版本的不同,不同Unity版本的Gradle Template也不同,因此务必保证自己引入的是对应版本的Unity Package。
相关文件如图:

Plugins/Android目录:
AndroidManifest.xml:安卓配置清单
baseProjectTemplate.gradle:项目级别gradle配置文件
launcherTemplate.gradle/mainTemplate.gradle:模块级别gradle配置文件
proguard-user.txt:Java代码混淆配置
Script/SDK目录:
MiAccountInfo.cs:小米账号信息
MiSDKCallback.cs:回调接口
SDKAndroid.cs:小米游戏SDK方法接口
Singleton.cs:单例模式
2. 配置包名信息
将在开发者站创建游戏时获取的包名,配置为Unity打包Android的包名。
菜单位置为:Edit → Project Settings → Player
修改如图所示的Company Name与Product Name,Unity会自动生成包名
Version(版本)与Bundle Version Code(版本号)请自行设置
如使用Unity2018,请将Minimum API Level设置为Android 4.4 API 19及以上版本,Target API Level可根据项目需求自行设置


3.设置构建方式(Unity2018)
Unity2018需要将构建方式设置为Gradle
菜单位置为:File → Build Settings → Build System

4. 配置AndroidManifest.xml
将在开发者站创建游戏时获取获得的AppId和AppKey,配置到AndroidManifest.xml中,注意添加mi_前缀。
<application>
...
<!-- 注意前缀mi_必须添加 -->
<meta-data
android:name="miGameAppId"
android:value="mi_2882xxxxxxxxxx" />
<meta-data
android:name="miGameAppKey"
android:value="mi_xxxxxxxxx" />
<meta-data
android:name="miGameEnhance"
android:value="true" />
...
<!-- ${applicationId} 替换为游戏包名 -->
<provider
android:name="com.xiaomi.gamecenter.sdk.MiOauthProvider"
android:authorities="${applicationId}.mi_provider"
android:enabled="true"
android:exported="false" />
...
</application>
miGameEnhance不同设置值的功能对比请参考:https://dev.mi.com/xiaomihyperos/documentation/detail?pId=1421
5.其他配置
Unity2019
如果在打开项目时,editor提示升级Asset database version,请点击确认,完成升级
Unity2022
由于通过Unity Hub安装的Unity2022在jdk和ndk版本上存在问题,因此需要手动配置
配置JDK版本为JDK11,NDK版本为r23b(23.1.7779620)
配置方式:
Edit → Preferences → External Tools → Android
注意添加JAVA_HOME到系统环境变量中

随后点击构建,此时会弹出升级SDK版本的提示,点击确认,等待升级结束即可
六、接口调用
1. 初始化
请在启动游戏的第一时间调用初始化接口。
SDKAndroid.Instance.Init();
2. 隐私合规
根据个保法要求,在用户同意隐私协议前不允许获取用户信息及上报信息,请在用户同意隐私后调用以下接口,否则登录支付时会抛出异常。
SDK本身不会弹出任何隐私协议,隐私协议游戏内自行设计实现,并且在游戏隐私协议中附加小米SDK隐私协议:
//用户同意隐私协议后,通知SDK用户已经同意隐私协议
SDKAndroid.Instance.OnUserAgreed();
该接口必须在用户选择同意隐私协议(游戏自己的隐私协议)之后调用,否则无法正常登录;若用户拒绝隐私协议,不可调用该接口,且无法登录;该接口会保存用户同意隐私协议的状态,无需多次调用。
请在提审前确保用户同意隐私协议前不会获取任何手机信息和发送网络请求,否则在审核时会被驳回。建议在小米隐私合规检测平台测试通过后再提交审核。
3. 登录
//登录回调
private class MyLoginCallback : IMiSDKLoginCallback
{
public void FinishLoginProcess(int code, MiAccountInfo var2)
// code为登陆结果
{
switch (code)
{
case 0:
//登陆成功
Debug.Log("login succeed: id=" + var2.uid + " session=" + var2.sessionId);
break;
default:
Debug.Log("login failed");
break;
}
}
}
//调用登录接口
SDKAndroid.Instance.OnStartLogin(new MyLoginCallback());
其他更多的登陆结果,见小米游戏SDK登录的登陆结果
注:登录失败时请勿直接重新调用登录接口,应在用户主动点击时调用登录接口
4. 支付
调用支付接口,支持购买消耗型商品、非消耗型商品及按金额购买商品。
- 消耗型商品:使用一次后即消耗掉,随使用减少,需要再次购买的商品。例:游戏货币,游戏道具等。
- 非消耗型商品:一次性购买,永久拥有,无需消耗。例:游戏中额外的游戏关卡、应用中无时限的高级会员等。
- 按金额购买:自行设置购买金额,相比前两者更加灵活。
//支付回调
private class MyPayCallback : IMiSDKPayCallback
{
public void FinishPayProcess(int code)
{
if (code == 0)
{
Debug.Log("购买成功,可以发货");
}
else if (code == -12 || code == -18004)
{
Debug.Log("购买取消,不要发货");
}
else if (code == -18005)
{
Debug.Log("重复购买");
}
else
{
Debug.Log("购买失败,不要发货");
}
}
}
//按计费代码支付
//productCode 计费点
//count 商品数量
//cpOrderId 游戏侧订单号
//cpUserInfo 游戏信息
//callback 支付回调
SDKAndroid.Instance.OnProduceCodePay(string productCode,
int count, string cpOrderId, string cpUserInfo, IMiSDKPayCallback callback)
//按金额支付
//amount 金额,单位元
//cpOderId 游戏侧订单号
//cpUserInfo 游戏信息
//callback 支付回调
SDKAndroid.Instance.OnAmountPay(int amount,
string cpOrderId, string cpUserInfo, IMiSDKPayCallback callback)
5. 退出
private class MyExitCallback : IMiSDKExitCallback
{
public void OnExit(int code)
{
if (code == 10001)
{
//可以退出游戏
Application.Quit();
}
else
{
//不要退出游戏
}
}
}
//退出
private void OnAppExit()
{
SDKAndroid.Instance.OnAppExit(new MyExitCallback());
}
6.发货通知(可选)
商品发货成功或失败后,通知小米侧,用于核实退款订单发货情况。
//发货通知
//cpOrderId 游戏侧订单号
//isDelivery true表示发货成功,false表示发货失败
//errMsg 发货错误信息
SDKAndroid.Instance.OnReportOrder(string cpOrderId, bool isDelivery, string errMsg);
七、混淆配置
如果项目有混淆JAVA代码的需求,请添加如下规则到proguard-user.txt中。
#小米SDK
-keep class com.xiaomi.** {*;}
#支付宝SDK
-keep class com.alipay.android.app.IAlixPay{*;}
-keep class com.alipay.android.app.IAlixPay$Stub{*;}
-keep class com.alipay.android.app.IRemoteServiceCallback{*;}
-keep class com.alipay.android.app.IRemoteServiceCallback$Stub{*;}
-keep class com.alipay.sdk.app.PayTask{ public *;}
-keep class com.alipay.sdk.app.AuthTask{ public *;}
-keep class com.alipay.sdk.app.H5PayCallback {
<fields>;
<methods>;
}
-keep class com.alipay.android.phone.mrpc.core.** { *; }
-keep class com.alipay.apmobilesecuritysdk.** { *; }
-keep class com.alipay.mobile.framework.service.annotation.** { *; }
-keep class com.alipay.mobilesecuritysdk.face.** { *; }
-keep class com.alipay.tscenter.biz.rpc.** { *; }
-keep class org.json.alipay.** { *; }
-keep class com.alipay.tscenter.** { *; }
-keep class com.ta.utdid2.** { *;}
-keep class com.ut.device.** { *;}
-dontwarn com.ta.utdid2.**
-dontwarn com.ut.device.**
-dontwarn com.alipay.mobilesecuritysdk.**
-dontwarn com.alipay.security.**
-dontwarn android.net.SSLCertificateSocketFactory