本文对拥有相关经验的同学会有一些帮助,如果没有相关经验,请移步学习Android基础和Unity基础。如果有些看不懂的东西欢迎留言……
一、Unity和Android交互
目前Unity和Android交互主要有两种方案:
- Android 打出 jar包或者aar包放在Unity的plugin/Android文件夹中以供调用;
- Unity 导出Android工程供Android Studio处理(早期这里也支持Eclipse,但是那东西太丑了这里不予讨论哈哈哈)
1.先说下Unity如何和Java进行交互
Unity和Java交互,Unity为我们提供了一个很好用的工具类AndroidJavaClass,具体用法的话废话少说上代码。
public class SDK : MonoBehaviour
{
private static SDK sdkInstance;
#if UNITY_ANDROID //&& !UNITY_EDITOR
private AndroidJavaClass androidJavaClass;
private AndroidJavaObject androidJavaObject;
#endif
public static SDK Instance
{
get
{
if (sdkInstance == null)
{
sdkInstance = new SDK();
return sdkInstance;
}
else
{
return sdkInstance;
}
}
}
private SDK()
{
Init();
}
public void Init()
{
#if UNITY_ANDROID && !UNITY_EDITOR
androidJavaClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
androidJavaObject = androidJavaClass.GetStatic<AndroidJavaObject>("currentActivity");
#endif
}
//获取设备ID
public string GetDeviceID()
{
#if UNITY_ANDROID && !UNITY_EDITOR
string s = androidJavaObject.Call<string>("getDeviceId");//这里是调用Android Activity中注册的接口方法,怎么注册下面会讲到
return s;
#else
return "123456";//这里是写一个没有SDK的临时返回值,防止一些异常
#endif
}
public void ShowSDKLoginTips()
{
#if UNITY_ANDROID && !UNITY_EDITOR
androidJavaObject.Call("showSDKLoginTips");//这里是接口中的无返回值方法
#endif
}
}
下面是对应的Android MainActivity方法:
public class MainActivity extends UnityPlayerActivity {
public MainActivity() {
}
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
public String showTest() {
return "show test success";
}
//这里是接口方法 获取设备ID
public String getDeviceId() {
String m_szDevIDShort = "35" + Build.BOARD.length() % 10 + Build.BRAND.length() % 10 + Build.CPU_ABI.length() % 10 + Build.DEVICE.length() % 10 + Build.MANUFACTURER.length() % 10 + Build.MODEL.length() % 10 + Build.PRODUCT.length() % 10;
String serial = null;
try {
serial = Build.class.getField("SERIAL").get((Object)null).toString();
return (new UUID((long)m_szDevIDShort.hashCode(), (long)serial.hashCode())).toString();
} catch (Exception var4) {
serial = "serial";
return "null";
}
}
//这里是接口方法
public void showSDKLoginTips()
{
}
}2.再来说下Unity引入Jar包的方案
首先在Android Studio中新建一个工程一个Empty Activity就可以了,然后引入Unity的class.jar包下面是Jar包相对路径,参考自己的Unity安装文件夹:../Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Development\Classes\class.jar(如何引入Jar包自己去参考Android Studio教程,后面也会发一篇别人教程的链接)
要打Jar包的话记得处理下build.gradle 首先将 apply plugin: 'com.android.application' 改成 apply plugin: 'com.android.library'
在MainActivity(可以自定义名字,但是记得要继承UnityPlayerActivity不然会出问题)中写入自己的接口,代码上面我复制了就不黏贴了。
最后就是打jar包出来:
在项目根目录下的build.gradle末尾加入如下代码:
task makeJar(type: Copy) {
delete 'build/outputs/mydemosdk.jar' //mydemosdk名字可自定义
from('app/build/intermediates/aar_main_jar/release/') //只适用于androidstudio 3.0或4.0及以上
into('build/outputs/') //输出路径,可自定义
include('classes.jar')
rename ('classes.jar', 'mydemosdk.jar') //111名字可自定义
}然后在Android Studio的右上角Gradle中就会出现如下截图的方法 路径:../task/other

这里有一个坑需要避免:from('app/build/intermediates/aar_main_jar/release/') //只适用于androidstudio 3.0或4.0及以上,这里的aar_main_jar在不同版本中可能名字不一样,可以自己在intermediates文件夹中查找。(备注:jar包塞入Unity后可以随意命名)
如果需要aar的话aar在输出目录下自行查找(这里也有一个坑,记得用压缩工具打开aar包删除class.jar,不然会出问题)。
最后就是把jar包导入到Unity 工程中这里还需要引入AndroidManifest.xml到工程中
Unity发布Android的APK时
如果在Plugins/Android( Unity特殊目录 ),不存在AndroidManifest文件,会使用Unity默认的AndroidManifest文件。默认的AndroidManifest文件目录在:Unity\Editor\Data\PlaybackEngines\AndroidPlayer\Apk如果存在AndroidManifest文件,那么Unity会使用它代替默认的AndroidManifest文件,这个AndroidManifest,必须带有活动以及标签。
参考:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.mypackge.test"<!--这里填你自己的包名-->
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="16"
android:targetSdkVersion="28" />
<application
android:label="@string/app_name"
android:usesCleartextTraffic="true" >
<activity android:name="com.mypackge.test.MainActivity" ><!--这里前面加上自己的包名避免引用冲突-->
<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>
3.Unity导出Android工程的方案
这里有一个小技巧,导出工程时Unity写引用Android方法不需要导入jar包,仅需要在Android中导出即可
如图所示导出Android 工程,这里有个天坑,后面会说下:

导出Android工程后就可以在AndroidStudio中打开工程了,后面在Android中的编辑工作参考上面Activity代码。
4.踩到的一个天坑
引入三方SDK时候player setting需要这样处理Scripting Backend 选择IL2Cpp(上架版需要支持64位),不然打开外挂程序(例如三方SDK)时候会发现莫名其妙的崩溃,初步认为是monolib.so文件的问题(也就是Unity的锅)

5.致谢 以及 参考链接地址
刚开始重新捡起Android和IOS接入的东西,有些思路不太完善,如果对读者产生了误导,请见谅,本人接受任何留言批评,并会尽快改正。
这里要感谢@lizhengwei1989@jiaxunnanling两位大佬的两篇文章,让我避免了一些踩坑的东西(也是很久不做这些东西忘得差不多了),感谢大佬让我有一次提高的东西,顺便引用下两位的文章。
如有侵权请联系,本人会自行删除引用。
最后附上大佬的文章地址:
Android与Unity交互以及各种踩的坑:https://blog.csdn.net/lizhengwei1989/article/details/54631241
Unity与Android交互-基础知识:https://blog.csdn.net/jiaxunnanling/article/details/89947744