本文对拥有相关经验的同学会有一些帮助,如果没有相关经验,请移步学习Android基础和Unity基础。如果有些看不懂的东西欢迎留言……

一、Unity和Android交互

     目前Unity和Android交互主要有两种方案:

  1. Android 打出 jar包或者aar包放在Unity的plugin/Android文件夹中以供调用;
  2. 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

更多相关文章

  1. 【Android(安卓)文件管理】分区存储 ( 修改与删除图片文件 )
  2. Android预优化那些事
  3. android布局文件中各属性所代表的意义
  4. android > 修改Android工程版本
  5. [Android]发布Sqlite数据库
  6. Android(安卓)Development
  7. 【魔幻塔防】60关配置文件
  8. Android配置文件中标签
  9. 【魔幻塔防】80关配置文件

随机推荐

  1. Android(安卓)Button Drawable
  2. Android中线程的处理
  3. Download Android(安卓)1.5 NDK, Release
  4. android小代码
  5. Android(安卓)Resources
  6. Android(安卓)startActivityForResult 和
  7. Android(安卓)Web应用调试
  8. [置顶] Android使用WebView加载图片防止O
  9. A Parcelable Tutorial for Android
  10. Android(安卓)Studio系列教程三--快捷键