zoukankan      html  css  js  c++  java
  • (转)Unity 接入Android SDK

    在网络上,关于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:

    1. public class UnityTestActivity extends UnityPlayerActivity

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

    1. AndroidJavaClass jc = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
    2. AndroidJavaObject jo = jc.GetStatic<AndroidJavaObject>("currentActivity");
    3. 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的设置,如果没有以下几行

    1. <uses-feature android:name="android.hardware.touchscreen" android:required="false" />
    2. <uses-feature android:name="android.hardware.touchscreen.multitouch" android:required="false" />
    3. <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

    转载地址:https://www.bbsmax.com/A/l1dyXkb5em/

  • 相关阅读:
    A1052. Linked List Sorting (25)
    A1032. Sharing (25)
    A1022. Digital Library (30)
    A1071. Speech Patterns (25)
    A1054. The Dominant Color (20)
    A1060. Are They Equal (25)
    A1063. Set Similarity (25)
    电子码表
    矩阵键盘
    对象追踪、临时对象追踪、绝对坐标与相对坐标
  • 原文地址:https://www.cnblogs.com/wodehao0808/p/15655348.html
Copyright © 2011-2022 走看看