效果预览实现部分1.找到Unity工程内部的AndroidManifest.xml进行改造，找到如下内容： <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> <meta-data android:name="unityplayer.UnityActivity" android:value="true" /> 2.在 标签里添加如下：android:supportsPictureInPicture="true" android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation" [collapse status="false" title="对于标签的解释"]android:supportsPictureInPicture="true"：这个属性用于声明该 Activity 支持画中画模式。这样，当用户按下 Home 键或者切换到其他应用时，你的应用就有可能进入画中画模式。这个属性的值为布尔型，表示是否支持画中画模式。android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"：这个属性用于配置在特定配置更改时 Activity 是否应该被销毁并重新创建。在这里，你声明了在屏幕大小变化、最小屏幕大小变化、屏幕布局变化、屏幕方向变化时，Activity 不会被销毁，而是系统将调用 onConfigurationChanged 方法。这对于画中画模式很重要，因为在画中画模式下，屏幕大小和方向可能会发生变化。[/collapse]修改后代码如下： <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> <meta-data android:name="unityplayer.UnityActivity" android:value="true" /> 3.编写一个Activity继承自UnityPlayerActivity，写入函数然后在Unity中显式调用即可，部分机型支持直接调用无需显式调用，函数如下：/** * 小窗悬浮 */ public void EnterPIPMode() { enterPictureInPictureMode(new PictureInPictureParams.Builder().build()); }
支付宝和微信支付安卓版接入Unity说明（2023版）
[scode type="blue"]环境配置[/scode]Unity版本：2021.3.11fAndroid Studio版本：2022.2.1 Patch 2 内部版本号#AI-222.4459.24.2221.10121639JDK版本17.0.6Android API 最低级别：Android 6.0(API Level 23)[scode type="blue"]Android Studio配置[/scode]文件-设置，进入以下界面。 工具-SDKManager，安装对应的Android SDK版本。 文件-新建-新建项目，选择No Activity，填写项目信息，选择完成后等待下载完成。 左上角点击Android将模式切换为项目。 右键根目录-新建-Module，把ModuleName随便填写一下。 打开pay项目下的build.gradle，在dependencies中填写如下两句话之后。//导入libs文件夹下后缀为.jar和.aar的文件，这里用于支付宝和Unity的SDK存放 implementation fileTree(dir: 'libs', include: ['*.jar','*.aar']) //导入微信的SDK，从网络直接下载到库中 implementation 'com.tencent.mm.opensdk:wechat-sdk-android-without-mta:+' 点击右上角Sync Now同步，点击下方菜单中的构建，显示打钩即可。打开Unity安装目录找到Classes，我使用的是IL2CPP和Release，所以目录是C:\Program Files\Unity\Hub\Editor\2021.3.11f1c2\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\il2cpp\Release\Classes，如果使用Mono切换到Variations选择Mono即可，如果使用Develop切换到il2cpp选择Development即可。将该目录下的classes.jar放到项目里的libs文件夹下即可完成UnitySDK的导入。打开从支付宝官网下载的AliPaySDKDemo，点这里前往支付宝开发者中心下载，打开之后在左侧外部库里找到alipaysdk-android-15.8.14，将其中的classes.jar改名为alipaysdk-android-15.8.14.jar，同第九步丢入项目里的libs文件夹下，如此一来，支付宝SDK和微信SDK的前置准备工作就完成了。 接下来在项目中右键pay-新建-Activity-Empty Views Activity，新建一个页面，配置如图，包名与项目包名一致。 如果版本比较早的可以在如图所示下找到UnityPlayerActivity，可以直接略过这一步。如果找不到的情况下打开C:\Program Files\Unity\Hub\Editor\2021.3.11f1c2\Editor\Data\PlaybackEngines\AndroidPlayer\Source\com\unity3d\player，找到UnityPlayerActivity.java，放入到与MainActivity.java同级目录下。 接下来对AndroidManifest.xml进行改造，打开pay/src/main目录下的AndroidManifest.xml修改为如下代码：<?xml version="1.0" encoding="utf-8"?> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" /> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> <meta-data android:name="unityplayer.UnityActivity" android:value="true" /> 如果android:label="@string/app_name"报错，打开pay/src/main/res下找到strings.xml添加如下代码： com.unity3d.player 接下来对页面代码内容进行改造，如图所示 添加支付宝支付和微信支付的代码，如需添加回调取消注释即可。选中pay-点击构建-Make Module 'SuiBianXieGe.pay'编译aar，然后将build/output目录下构建好的pay-debug.aar拷贝至Unity端的Assets/Plugin/Android目录下，至此Android Studio部分完毕。完整代码如下：package com.unity3d.player; import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import com.tencent.mm.opensdk.modelpay.PayReq; import com.tencent.mm.opensdk.openapi.IWXAPI; import com.tencent.mm.opensdk.openapi.WXAPIFactory; import com.alipay.sdk.app.PayTask; public class MainActivity extends UnityPlayerActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } /** * 支付宝App支付 */ public void AliPayByApp(final String orderInfo){ Log.i("Unity", "启动线程"); Runnable payRun=new Runnable() { @Override public void run() { PayTask task=new PayTask(MainActivity.this); String result= task.pay(orderInfo, true); Log.i("Unity", "onALIPayFinish, result = " + result); //支付回调 //UnityPlayer.UnitySendMessage("GamePaySDK", "ALiPayResult", result); } }; Thread payThread = new Thread(payRun); payThread.start(); } private IWXAPI msgApi; /** * 微信App支付 */ public void WxPayByApp(String appId,String partnerId,String prepayId,String nonceStr,String timeStamp,String sign){ msgApi = WXAPIFactory.createWXAPI(this, appId); PayReq request = new PayReq(); request.appId = appId; request.partnerId =partnerId; request.prepayId= prepayId; request.packageValue = "Sign=WXPay"; request.nonceStr= nonceStr; request.timeStamp= timeStamp; request.sign=sign; Log.d("Unity",request.checkArgs()+"");//输出验签是否正确 msgApi.sendReq(request); } } [scode type="blue"]Unity配置[/scode]首先使用压缩包的形式打开pay-debug.aar，进入如图目录。 使用压缩包的形式打开classes.jar，一路打开文件夹到最深处，删除UnityPlayerActivity.class后关闭，询问是否保存classes.jar时，选择是。然后打开libs，删除classes.jar。如果这一步不这么做将来在Unity打包apk的时候因为和Unity自带的Classes.jar和UnityPlayerActivity.class冲突导致打包失败。将AndroidManifest.xml拷一份出来，放到和aar同级目录下。在场景中创建一个空对象名字随便起，我这边叫GamePaySDK，新建一个脚本也叫GamePaySDK，编写如下代码，按需调用即可。public partial class GamePaySDK : MonoBehaviour { private AndroidJavaObject activity; private void Start() { AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); activity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity"); } private void AliPayByApp(string orderInfo) { //activity.Call("AliPayByApp", url); } private void WxPayByApp(string appId, string partnerId, string prepayId, string nonceStr, string timeStamp, string sign) { activity.Call("WxPayByApp", appId, partnerId, prepayId, nonceStr, timeStamp, sign); } } 如果需要回调，直接添加方法在Java端按需添加即可，之前写的代码取消回调注释即可。public void ALiPayResult(string result) { show.text = result; } 进行打包测试，至此Unity端结束。[scode type="blue"]扩展：不打包aar的取巧方式[/scode]将支付宝SDK和微信SDK的Jar文件提取出来，拷贝至Assets/Plugin/Android目录下。将修改好的AndroidManifest.xml和MainActivity.java，拷贝至Assets/Plugin/Android目录下。在场景中新建一个空对象命名为GamePaySDK，将GamePaySDK.cs拷贝过来附加到该对象上。打包测试即可。[scode type="blue"]扩展：我只通过了H5支付方式的审核？[/scode]网络下载一个安卓端内置浏览器的插件，本人使用的插件为UniWebView。找后端要到url后，使用如下代码打开即可调起相应App。//H5临时支付方式 if (_uniWebView == null) { _uniWebView = gameObject.AddComponent<UniWebView>(); } _uniWebView.Frame = new Rect(0, 0, Screen.width, Screen.height); _uniWebView.Load(url); _uniWebView.Show(); 打包测试即可。[scode type="blue"]下载地址[/scode]Android工程地址