前言

使用Unity也有不短的时间了,安卓包也打过不少,但是对Unity与Android的交互却知之甚少。

因工作需求,需要在Android平台接一些sdk(扩展功能)。我就借此机会了解了下Unity与Android交互的一些知识,并做了一个简易实现。

现将实现步骤记录下来以供日后查阅。

一、开发准备

Unity、Android Stuido以及JDK安装,这些都是基本操作了,网上也有很多教程,这里不细述。

本次开发所使用的软件版本如下:

Android Studio 3.5

Unity 2018.3.10f1

Java 1.8.0191

 

二、要实现的功能

要在unity项目中进行安卓功能扩展,有两种方式:

1、Unity项目导出为Android工程,然后在Android Studio(以后简称为AS)中进行二次开发,添加扩展功能。这样的方式开发起来很灵活,改动起来也很方便,但是就是很麻烦,因为每次改动都要打一回安卓工程。

2、将扩展功能制作成Android库文件(jar包),然后将jar包导入到Unity中,直接使用。这样的方式,使用者无法修改这个库文件的功能,但也更便于使用 。

 

因为我将要做的功能可能会在团队内传播使用,也不需要每个人都去做改动。因此选择第二种方式。

所以本文的目的就是:

制作一个Android库文件(jar包),然后在Unity中使用它。

三、如何制作Android库文件

1、新建Android工程

 打开AS,新建一个Android工程,选择Empty Activity,配置工程名称、包名、位置以及语言,如下图

 语言最好选Java,因为Java和C#的语法极为相似,学习成本很低。

 

工程创建之后,默认显示的是Android视图下app的工程结构,如下图。能看到在包名下有一个MainActivity.java的文件,这是安卓app的入口,不过这里并不打算使用它,忽略即可。

 

2、创建一个Android Library 模块

 选中app,然后右键,选Module,在Create New Module窗口中选择 Android Library 

 

 填入Library name、Module name 、Package name以及Language后,点完成。

 这里的Package name好像是可以改的,不必和之前创建工程时完全一样(未验证)。不过为了少点事,还是先保持一致吧。

 

 现在可以看到,在工程中同时存在着app和mysdk模块,它俩是平级存在的,并且都有自己的源码目录(com.letui.mysdk),以及清单目录(manifests)。

 app部分可以不用管了,后续只对mysdk模块进行操作。

 

 3、引入Unity对接Android的库文件 

  1)在unity的安装目录下件,找到一个名为classes.jar的文件

  我的目录为 D:\Unity2018\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\mono\Development\Classes

  2)然后将classes.jar粘贴到mysdk模块的libs目录下(需要将工程切换到project视图)

  额外说明:

  在il2cpp目录下也有一个名称一样的classes.jar文件,其目录为

   D:\Unity2018\Editor\Data\PlaybackEngines\AndroidPlayer\Variations\il2cpp\Development\Classes

  这两个文件的选择,与unity的Player Setting中脚本后端设置有关。如下图

  

    脚本后端用哪个就,就选哪个目录下的classes.jar

  3)选中刚粘贴的classes.jar文件,右键,选择 Add as Library,出现一个弹窗口,默认选中mysdk模块,直接点确定

  然后,这个classes.jar文件就被引入到工程中了,展开三角,可以看到如下三个模块,其中就有com.unity3d.player。如下

  

 4、创建本模块的Activity文件

  1)展开mysdk模块下的src目录,选中com.leitui.mysdk,然后右键,新建一个Activity,选择Empty Activity,输入Activity Name以及Package Name和Language,勾掉Generate Layout File, 完成。

 

 新建的SDKMainAcivity.java脚本,默认继承自AppCompatActivity,并带有一个onCreate方法,如下:

 

现将SDKMainActivity脚本内容修改为继续自UnityPlayerActivity ,并添加两个方法 UnityCallAndroid 和 AndroidCallUnity

UnityCallAndroid 用来接受Unity的调用,AndroidCallUnity用于向unity发起调用。具体代码如下:

复制代码
 1 package com.letui.mysdk;  2  3 import