Android和unity的相互调用

强颜欢笑 提交于 2020-02-07 00:27:51

由于Android里的一些操作无法直接在unity里面直接实现
所以需要Android和unity相互调用配和去实现一些功能

协作的方式可分为两种形式

  1. 由unity打包出一个工程在Android studio里面加以补充完善,最后在Android studio打包成apk
  2. 由Android提供插件给unity使用,在unity中通过调用插件实现相关功能,最后在unity打包成apk

我们主要谈谈第二种方式

  1. 导出Jar包+扩展MainActivity+Java主导(官方不推荐)
    1、在Android studio新建一个工程
    2、在工程中新建一个Android Library模块
    3、在该模块中新建一个空Activity,删掉该Activity的布局文件
    4、将unity中的该目录下的classes.jar文件粘贴到Android studio中新增模块的libs下面
    2018.3.14f1\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Release\Classes
    在这里插入图片描述
    接下来添加这个库
    在这里插入图片描述
    5、修改新增模块的Mainifest.xml中的部分
    (可直接复制app中的Mainifest.xml,删除报错的地方)
    加上
    在这里插入图片描述
    6、在新增模块的MainActivity中写入想要新增的方法
    注意:要修改继承的类
    在这里插入图片描述
    7、build刚才新增的模块
    在这里插入图片描述
    8、build完成后找到
    AndroidStudioProjects\TestApplication\testlibrary\build\intermediates\packaged-classes\debug\libs
    该目录下的classes.jar并删掉该文件
    并将AndroidStudioProjects\TestApplication\testlibrary\build\intermediates\packaged-classes\debug目录下的classes.jar文件放入libs中

将该libs文件夹和新模块中的AndroidManifest.xml文件(可以根据需要修改包名)以及res文件夹拷贝到桌面备用
9、在unity中将发布时的包名修改成AndroidManifest.xml文件中的包名
在unity中新建Plugins/Android文件夹
将上面保存到桌面的文件拷贝到新建的文件夹中
在这里插入图片描述
10、新建一个脚本,在脚本中调用之前写的方法

    void Start()
    {
        //获取位于com.unity3d.player包下的UnityPlayerActivity类
        AndroidJavaClass ajc = new AndroidJavaClass("com.unity3d.player.UnityPlayerActivity");
        //获得ajc所代表的类下的currentActivity对象   也就是之前编辑的那个MainActivity对象
        AndroidJavaObject ajo = ajc.GetStatic<AndroidJavaObject>("currentActivity");
        int nTest = ajo.Call<int>("add",1,2);
    }

这是在unity中调用Android里的方法,那么怎么在Android中调用unity中的方法呢

在这里插入图片描述

  1. 导出Ara包+扩展MainActivity+Java主导
    1、该方法需要拷贝出的文件与1方法不同
    将output文件夹下的aar文件拷贝到桌面
    将AndroidManifest.xml文件拷贝到桌面
    2、修改AndroidManifest.xml中的包名
    3、修改aar压缩包
    删除libs中的classes.jar
    将外层的classes,jar放到libs中
    删除压缩包中的AndroidManifest.xml文件中控制label和icon的行
    4、将上面的文件拷贝到Plugins/Android文件夹下

  2. 提供额外的类+Java主导
    创建新的模块后不需要新建一个Activity,只需新建一个Class
    在Class中写入相关方法
    build成功后将classes.jar文件拷贝到unity中就可以了

如果相关方法是非静态
在这里插入图片描述
在unity中如此调用

AndroidJavaObject jo = new AndroidJavaObject("com.example.testlibrary.Test");
int nTest = jo.Call<int>("add", 1, 2);

如果相关方法是静态的
在这里插入图片描述
在unity中如此调用

AndroidJavaClass jc = new AndroidJavaClass("com.example.testlibrary.Test");
int nTest = jc.CallStatic<int>("add", 1, 2);
  1. C#主导
    不导入任何东西,直接通过unity关联的SDK来调用SDK中包含的方法
    在这里插入图片描述
    如图所示,没有导入任何资源,直接使用SDK中包含的方法输出LogCat
    注意:你要搞清楚你想调用的方法在哪个包里面等信息

总结:
在这里插入图片描述

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!