Unity和Android交互笔记——接入Android(安卓)SDK
本文对拥有相关经验的同学会有一些帮助,如果没有相关经验,请移步学习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("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() { }}
1.先说下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"?> android:versionCode="1" android:versionName="1.0" >
2.再说下Unity导出Android工程的方案
这里有一个小技巧,导出工程时Unity写引用Android方法不需要导入jar包,仅需要在Android中导出即可
如图所示导出Android 工程,这里有个天坑,后面会说下:
导出Android工程后就可以在AndroidStudio中打开工程了,后面在Android中的编辑工作参考上面Activity代码。
3.踩到的一个天坑
引入三方SDK时候player setting需要这样处理Scripting Backend 选择IL2Cpp(上架版需要支持64位),不然打开外挂程序(例如三方SDK)时候会发现莫名其妙的崩溃,初步认为是monolib.so文件的问题(也就是Unity的锅)
4.致谢 以及 参考链接地址
刚开始重新捡起Android和IOS接入的东西,有些思路不太完善,如果对读者产生了误导,请见谅,本人接受任何留言批评,并会尽快改正。
这里要感谢@lizhengwei1989@jiaxunnanling两位大佬的两篇文章,让我避免了一些踩坑的东西(也是很久不做这些东西忘得差不多了),感谢大佬让我有一次提高的东西,顺便引用下两位的文章。
如有侵权请联系,本人会自行删除引用。
最后附上大佬的文章地址:
Android与Unity交互以及各种踩的坑:https://blog.csdn.net/lizhengwei1989/article/details/54631241
Unity与Android交互-基础知识:https://blog.csdn.net/jiaxunnanling/article/details/89947744
更多相关文章
- 【Android(安卓)文件管理】分区存储 ( 修改与删除图片文件 )
- Android预优化那些事
- android布局文件中各属性所代表的意义
- android > 修改Android工程版本
- [Android]发布Sqlite数据库
- Android(安卓)Development
- 【魔幻塔防】60关配置文件
- Android配置文件中标签
- 【魔幻塔防】80关配置文件