本文对拥有相关经验的同学会有一些帮助,如果没有相关经验,请移步学习Android基础和Unity基础。如果有些看不懂的东西欢迎留言……
目前Unity和Android交互主要有两种方案:
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("currentActivity");
#endif
}
//获取设备ID
public string GetDeviceID()
{
#if UNITY_ANDROID && !UNITY_EDITOR
string s = androidJavaObject.Call("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()
{
}
}
首先在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,必须带有活动以及标签。
参考:
android:versionCode="1"
android:versionName="1.0" >
这里有一个小技巧,导出工程时Unity写引用Android方法不需要导入jar包,仅需要在Android中导出即可
如图所示导出Android 工程,这里有个天坑,后面会说下:
导出Android工程后就可以在AndroidStudio中打开工程了,后面在Android中的编辑工作参考上面Activity代码。
引入三方SDK时候player setting需要这样处理Scripting Backend 选择IL2Cpp(上架版需要支持64位),不然打开外挂程序(例如三方SDK)时候会发现莫名其妙的崩溃,初步认为是monolib.so文件的问题(也就是Unity的锅)
刚开始重新捡起Android和IOS接入的东西,有些思路不太完善,如果对读者产生了误导,请见谅,本人接受任何留言批评,并会尽快改正。
这里要感谢@lizhengwei1989@jiaxunnanling两位大佬的两篇文章,让我避免了一些踩坑的东西(也是很久不做这些东西忘得差不多了),感谢大佬让我有一次提高的东西,顺便引用下两位的文章。
如有侵权请联系,本人会自行删除引用。
最后附上大佬的文章地址:
Android与Unity交互以及各种踩的坑:https://blog.csdn.net/lizhengwei1989/article/details/54631241
Unity与Android交互-基础知识:https://blog.csdn.net/jiaxunnanling/article/details/89947744