在网络上,关于Unity与Android如何进行交互,雨松MOMO大神已经有两篇文章简单介绍了如何操作(1)Unity3D研究院之打开Activity与调用JAVA代码传递参数(2)Unity3D研究院之与Android相互传递消息。这两篇文章简单介绍如何操作,但是具体的内部细节并没有涉及到。下面介绍两种Unity与Android交互的方式(或者说就是接入Android SDK),分别是(1)Unity导出Android工程,然后你将SDK工程作为Library来接入(2)Plugins方式,这种方式就是在Assets目录下新建Plugins/Android目录,把你需要的资源、jar包等按规定放进去。

(1)Unity导出Android项目

通过在Build Settings中选择Google Android Project选项,点击Export,可以得到一个Unity生成的Android项目。



将项目导入到Eclipse中,可以看见如下的项目结构:



让我们先不管src的源代码,首先关注libs。

libs目录

libs有三部分:前两者(armeabi-v7a, x86)表示手机的两种硬件设备,包含了各自所需的so文件,我们可以在Unity的Player Settings->Other Settings->Device Filter中来进行选择。而unity_classes.jar就是UnityPlayerActivity类所在的jar包,其实就是Unity目录下的Editor\Data\PlaybackEngines\AndroidPlayer\Variations\il2cpp\Development\Classes\classes.jar。(注意,这个路径是Unity5.3的路径,不同版本的Unity中,该路径是不同的)

下面我们来查看classes.jar(即unity_classes.jar)的内容

classes.jar

在网上下载一个Java反编译工具,比如JD-GUI,打开classes.jar,我们可以看见如下结构:



其中jnibridge应该是用来实现Java与其他语言的通信,而fmod是用来控制音频的,剩下的com.unity3d.player才是我们需要重点关注的。通常我们自己新创建的Activity,都是要继承UnityPlayerActivity类,因此我们首先查看该类,其部分内容如下:



该类的内容十分简单,其中最为重要的是UnityPlayer:



回忆一下,我们在Android里定义自己的Activity:

public class UnityTestActivity extends UnityPlayerActivity

在Unity里调用Android的方法的步骤:

  AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
jo.Call("StartActivity0","第一个Activity");

因为我们继承了UnityPlayerActivity,那么当我们的UnityTestActivity调用onCreate方法时,就同时把自己这个实例传递到了UnityPlayer中的currentActivity。因此在Unity中我们就可以利用currentActivity来调用我们自定义的UnityTestActivity中的方法。

这时回头查看src的源代码,可以发现其内容和classes.jar中差不多。

清单文件 AndroidManifest.xml

一个默认的清单文件中有以下重要内容:



这里,package是在Player Settings->Other Settings->Bundle Identifier设置。默认UnityPlayerActivity为主Activity。

PS.

除了通过导出Android工程来查看自动生成的内容,也可以通过Unity安装目录下的Editor\Data\PlaybackEngines\AndroidPlayer来查看,其目录内容如下:



我们重点看Apk、Source、Variations,这三者里面就包含默认的AndroidManifest.xml,res目录和assets目录等。


(2)Plugins/Android

我们可以通过在Plugins/Android中添加东西来影响Unity生成的Android项目。

AndroidManifest.xml

我们可以直接在Android目录下添加一个AndroidManifest.xml文件,这个文件会影响最终的Android项目中的清单文件。注意,这里的程度只是影响,而不是完全替换,比如package会最终替换为Bundle Identifier的设置,如果没有以下几行

<uses-feature android:name="android.hardware.touchscreen" android:required="false" />
<uses-feature android:name="android.hardware.touchscreen.multitouch" android:required="false" />
<uses-feature android:name="android.hardware.touchscreen.multitouch.distinct" android:required="false" />

如果是默认设置他也会默认加上去,等等。

PS: AndroidManifest.xml要放到Android目录下才会对主清单文件起作用,如果你放到其他目录,比如test,则不会对最终的Android项目有作用。

res目录

你可以在Android目录下增加一个res目录。不管这个目录是空的还是有东西,导出来的Android项目都会多一个叫unity-android-resources的Library工程,而我们的主Android工程则引用了该Library,如图:



观察这个Library就知道,这个工程主要就是存放资源的,比如我们这里把东西放到res目录中,则这些多出来的东西就会放到Library工程中。注意,res目录的东西不能随便乱放,要按照合格的目录结构来,即一般如下:



如果你是随便把资源放到res目录下,或其他错误名字的子目录,比如res/test等目录下,都会报出以下的错误:

assets目录

assets目录和res目录类似,都是存放资源的,只是res目录里面的资源会在R文件中生成ID,而assets目录不会生成ID,需要自己手动根据路径来访问资源。

jar包

在查看网上的相关文章时,发现大多数文章都说要把jar包放到Plugins/Android目录的libs或bin目录。不知道是不是Unity5做出了修改,我发现jar包不管放到哪,只要在Assets目录下,都能起作用,成为最终Android工程的libs中的内容。

Library工程

你可以在Plugins/Android目录下放置一个Android Library工程,只要设置得当,这个工程就会被Unity识别并在最终生成的Android工程中引用。这个也是我接入Android SDK时主要使用的方式,十分方便并且易于管理(毕竟这让你知道哪些资源、jar包是归哪个SDK的。而如果所有资源都放在res目录,jar包都放在libs目录,这样就不知道某个SDK原本的东西在哪了)


我的SDK接入工作流程

下面介绍我接入SDK时的流程,这只是我个人感觉比较方便的流程,如果大家有更好的流程,希望能在评论区告知。我一般会同时使用上述两种方式,因为第一种方式的缺点是不好进行项目管理(毕竟有两个分开的项目),并且要打包一个apk也比较麻烦;而第二种方式的缺点就是不直观,调试不方便。

(1)建立SDK的Android Demo工程

根据文档,将需要的功能以Unity易于调用的方式写成接口,比如我一般定义函数签名为void FuncName(String params, String callbackTarget, String callbackMethod)

这里,params就是SDK接口需要的参数(或者是参数列表,以";"等分隔符连接具体的参数,比如: "Apple;12"),callbackTarget就是Unity里调用回调方法的GameObject的名字,而callbackMethod就是回调方法的名字。

然后创建简易的界面(比如几个按钮)来调用这些写好的接口,确定接口的功能无误

(2)将Demo工程转换为Library工程

去掉Demo工程中测试用的Activity、布局文件,在清单文件中去掉主Activity的设置,最后把项目设置为Library。

(3)Unity导出Android工程,和上面的Library工程一起导入到Eclipse中

导入完成后,如果你的Library工程用到classes.jar,你需要先删掉该classes.jar,然后再添加Unity的Android工程的unity_classes.jar引用。

(4)把Library工程添加到Unity工程

通过(3),我们可以得到一个设置正确的Library工程,这时候我们可以直接把该工程拖到Unity工程的Plugins/Android目录下

(5)在Unity中编写调用Library工程接口的代码


其他

(1)Unity在直接导出Apk时,会在Temp目录(与Assets目录同级)下的StagingArea目录生成一些临时的Android代码

(2)在Eclipse中,如果adb一直提示断开连接,可以用360手机助手连上手机,这时adb就能正常工作了


参考

Unity3D研究院之打开Activity与调用JAVA代码传递参数

Unity3D研究院之与Android相互传递消息

Creating a native Android plugin for Unity3d

Unity Android plugin tutorial

Unity - 接入Android SDK的更多相关文章

  1. 2018年Unity结合Android SDK下载安装及配置教程

    原文:2018年Unity结合Android SDK下载安装及配置教程 首先声明: Unity版本2017.1f3        最近试着在Unity中利用网易做AR开发时,发布项目文件需要发布到An ...

  2. unity工程接入Android sdk后真机测试解锁屏后退出的解决

    unity工程接入如91.移动支付等Android sdk后,真机运行尤其是在4.0+以上坏境,往往会出现解锁屏后退出的情况,解决办法如下: 可以在AndroidManifest.xml中所有的con ...

  3. unity接入安卓SDK,与安卓相互通信

    .接SDK是个什么样的活计? SDK的工作流程: 1. 从unity端出发,向安卓发起一系列的请求(unity call android). 2. 安卓端收到unity端调用,然后在具体调用SDK的一 ...

  4. unity配置Android SDK,并构建导出apk格式

    1.点击 Edit  -->   preferences出现如图界面 2.在Android中SDK选项中放入Android SDK:JDK选项中放入Java JDK.(下载地址:http://t ...

  5. unity接入安卓sdk (unity调用安卓工程)

    1.安装jdk 并且配置环境,这个网上资料很多,这里不说了 2.安卓开发软件eclipse集成环境版 下载地址 http://tools.android-studio.org/index.php/ad ...

  6. 【转】unity开发android游戏(一)搭建Unity安卓开发环境

    http://blog.csdn.net/chenggong2dm/article/details/20654075 1,下载安装Java的JDK: http://www.oracle.com/tec ...

  7. unity开发android游戏(一)搭建Unity安卓开发环境

    unity开发android游戏(一)搭建Unity安卓开发环境 分类: Unity2014-03-23 16:14 5626人阅读 评论(2) 收藏 举报 unity开发androidunity安卓 ...

  8. 教你高速高效接入SDK——Unity统一接入渠道SDK(Android篇)

    U8SDK的设计之初,就是为了可以支持各种游戏引擎开发的游戏,而不不过Android的原生平台.眼下一大半的手游,都是採用Unity3D和Cocos2dx开发,那么这里,我们就先来一步步给大家演示,用 ...

  9. Unity与Android交互-Unity接入高德地图实现定位以及搜索周边的功能(使用Android Studio)详细操作

    刚进公司给安排的任务就是Unity接入高德地图,算是踩了不少坑总算做出来了,抽点时间写个博客记录一下 废话不多说 先上效果图 获取定位并根据手机朝向显示周边信息            使用的Unity ...

随机推荐

  1. jquery中的ajax参数说明

    本文只作为记录,方便以后查阅. 内容原地址:$.ajax( )方法详解及案例_JQuery_wodi0007的博客_程序员博客网 http://u.cxyblog.com/28/article-aid ...

  2. webstorm添加*.vue文件代码提醒支持webstorm支持es6vue里支持es6写法

    本文转自:http://www.lred.me/2016/01/07/webstorm%E6%B7%BB%E5%8A%A0-vue%E6%96%87%E4%BB%B6%E6%94%AF%E6%8C%8 ...

  3. 两个单选按钮(一个是,一个否 ),一个div层,实现点击隐藏,显示div

    <script type="text/javascript"> function diva(){ document.getElementById('div1').sty ...

  4. python之路:Day03 --- Python基础3 >>函数

    本节内容 1.函数基本语法及特性 2.参数 3.局部变量与全局变量 4.返回值 嵌套函数 5.递归 6.匿名函数 7.高阶函数 8.内置函数 一.函数基本语法及特性 区别 面向过程编程:根据业务逻辑从 ...

  5. CSS 布局

    近日开发中,总感觉页面布局方面力不从心.以前也曾学过这方面的内容,但是不够系统,因此我打算整理一下. 在web 页面中一般有 table 和 css+div 两种布局方式. 其中css+div 又分为 ...

  6. **crontab的使用方式介绍和no crontab for root 提示的处理

    crontab的使用方式介绍   定时任务参数详解如下:  crontab -l     |  crontab -e    www.2cto.com   #*/30 * * * * ntpdate 1 ...

  7. ubantu16.04+mxnet +opencv+cuda8.0 环境搭建

    ubantu16.04+mxnet +opencv+cuda8.0 环境搭建 建议:环境搭建完成之后,不要更新系统(内核) 转载请注明出处: 微微苏荷 一 我的安装环境 系统:ubuntu16.04 ...

  8. css雪碧图生成工具4.3更新

    v3.0更新介绍地址:http://www.cnblogs.com/wang4517/p/4476758.html v4.0更新介绍地址:http://www.cnblogs.com/wang4517 ...

  9. iOS-语法syntax

    成员变量语法 定义的是外部可见的属性 #import <Foundation/Foundation.h> @interface People : NSObject @property (n ...

  10. 1 Maximum Product Subarray_Leetcode

    Find the contiguous subarray within an array (containing at least one number) which has the largest ...