1、在Android Studio中创建一个新工程
选择No Activity
选项如下
Unity的Minimum API Level如下图所示
点击Finish,如下图,第一步结束
2、创建Module
点击Android切换到Project
切换完如下图所示
右键MyApplication,创建一个Module
选项如下,点击Finish
查看build.gradle,确保compileSdk和targetSdk和Unity的Target API Level保持一致
3、导入Unity相关文件和库
首先,导入classes.jar
该文件在D:\Program Files\Unity\Hub\Editor\2021.3.37f1c1\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\il2cpp\Release\Classes里
即“你的Unity.exe所在文件夹”/../“对应Editor版本”/../下,其中2021.3.37f1c1是我所用的Editor版本,il2cpp、Release对应Unity的配置,如下图,如果Unity里的Scripting Backend是Mono,则选mono文件夹下的
将这个classes.jar复制到mylibrary的libs文件夹下,并且Add As Library,如下图
Add As Library之后,你会在build.gradle里看到
implementation files('libs\\classes.jar')
这样classes.jar就导入完成了。
然后,导入UnityPlayerActivity.java
该文件在D:\Program Files\Unity\Hub\Editor\2021.3.37f1c1\Editor\Data\PlaybackEngines\AndroidPlayer\Source,直接将com文件夹复制到mylibrary/src/main/java文件夹下,如下图
至此,导入unity文件结束。
4、接入支付宝支付
1、去Alipay的maven地址下载最新的支付sdk,https://mvnrepository.com/artifact/com.alipay.sdk/alipaysdk-android
2、将下载好的文件alipaysdk-android-15.8.17.aar,复制到mylibrary的libs文件夹下,这次不用Add As Library了,因为aar没有这个选项,用另一种方式引入aar,导入后如下图所示
3、引入alipaysdk-android-15.8.17.aar,操作如下,操作完之后就能使用支付宝支付的api了。
compileOnly fileTree(include: ['*.jar','*.aar'], dir: 'libs')
4、编写支付代码
在mylibrary/src/main/java/com.xxx.xxxx下创建一个java文件,我这里取名为MainActivity
MainActivity.java代码如下
package com.xxx.xxxx; import android.os.Bundle; import android.util.Log; import com.alipay.sdk.app.PayTask; import com.unity3d.player.UnityPlayer; import com.unity3d.player.UnityPlayerActivity; public class MainActivity extends UnityPlayerActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); } // 支付宝支付 public void AliPay(final String orderInfo, String callBackObjectName, String CallBackFuncName) { Log.i("Unity", " >>> enter alipay native"); 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); // 这里可以自己添加Unity回调接收 UnityPlayer.UnitySendMessage(callBackObjectName, CallBackFuncName, result); } }; Thread payThread = new Thread(payRun); payThread.start(); } }
记得修改pachage的包名为你的包名
5、修改AndroidManifest.xml,如下
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.xxx.xxxx" > <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" /> <!-- 如果您的 App 的 targetSdkVersion 大于或等于 30,则需要在 AndroidManifest.xml 中提供下面的应用可见性声明, 让支付宝 SDK 感知设备上是否已经安装了支付宝 App。同时,您可能还需要升级 Gradle Plugin 到最新版本。 关于 Android 11 的 "应用可见性" 机制,参见 https://developer.android.com/about/versions/11/privacy/package-visibility?hl=zh-cn --> <queries> <package android:name="com.eg.android.AlipayGphone" /> <!-- 支付宝 --> <package android:name="hk.alipay.wallet" /> <!-- AlipayHK --> </queries> <application android:allowBackup="true" android:label="@string/app_name" android:supportsRtl="true" > <activity android:name="com.xxx.xxxx.MainActivity" android:exported="true" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <meta-data android:name="unityplayer.UnityActivity" android:value="true" /> </activity> </application> </manifest>
基本就是把Unity里的AndroidManiFest的内容拷贝过来,添加支付宝所需的
<queries> <package android:name="com.eg.android.AlipayGphone" /> <!-- 支付宝 --> <package android:name="hk.alipay.wallet" /> <!-- AlipayHK --> </queries>
然后修改 application下的activity 的name为com.xxx.xxxx.MainActivity,也就是你的包名加上刚才创建的java文件名。
如果下面这块代码显示红字报错的话,在main下创建
android:label="@string/app_name"
填写File name为strings,直接点击ok
创建完后如下图,res和java文件夹同级。
在strings.xml里添加代码
<string name="app_name">com.unity3d.player</string>
保存后,AndroidManifest.xml的android:label="@string/app_name"就不会报错了。
5、打包出aar
选中mylibrary,点击Build-->Make Module
Build完成后,右键mylibrary,Reload from Disk,就能看到多出了一个build文件夹
然后点击右侧栏的Gradle,点击build下的assemble,会在刚才的outputs/aar下生成一个release版本的aar,这就是我们所需的aar了。
6、将aar导入Unity
将mylibrary-release.aar复制一份出来进行修改,用压缩软件右键打开aar文件,导入到Unity之前需要对压缩包进行相关操作。
a、删除libs里的classes.jar文件;
b、删除classes.jar里的com/unity3d/player目录下的UnityPlayerActivity.class;
c、右键编辑AndroidManifest.xml文件,删除以下代码并保存
<uses-sdk android:minSdkVersion="22" />
然后用这个压缩包的AndroidManifest.xml的内容替换Unity里的AndroidManifest.xml。
最后,将修改过的mylibrary-release.aar和之前下载的alipaysdk-android-15.8.17.aar一起复制到Unity项目的Plugins/Android下
至此导入完毕
7、Unity调用支付宝支付
调用代码如下currentActivity.Call里的第一个参数就是Android Studio项目里MainActivity.java里的方法名,payinfo是该方法的第一个参数,UnityAndroidConnector是第二个参数,即响应Android回调的脚本名,AliPayCallback是第三个参数,即脚本里的方法名,有两个参数内容可由你自己决定
public void Buy(string payinfo) { //固定不变 AndroidJavaClass unityPlayer = new AndroidJavaClass("com.unity3d.player.UnityPlayer"); //固定不变 AndroidJavaObject currentActivity = unityPlayer.GetStatic<AndroidJavaObject>("currentActivity"); //这里的第一个参数是Java函数名,第三个参数是当前脚本挂载物体的名称,一定要对!!!!!! //最后一个参数是回调的Unity3D中的函数名 currentActivity.Call("AliPay", payinfo, "UnityAndroidConnector", "AliPayCallback"); }
请确保Unity运行时场景里有名字为响应Android回调的脚本名的组件,并且挂载着该响应Android回调的脚本,脚本里有public的方法
public class UnityAndroidConnector : MonoSingleton<UnityAndroidConnector> { public void Init() { } public void AliPayCallback(string msg) { UtilLog.Log("AliPayCallback:" + msg); } }