【Unity与Android】01-Unity与Android交互通信的简易实现
前言
使用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