概述
Unity开发过程中,需要用到某些java库或者java接口实现比较方便,这时候就需要用到unity3D与AndroidStudio交互开发,由AndroidStudio生成集成的包,导入到unity3D后使用.
但是之前一直没搞清楚,如何实现java和c#的通信和调用,很多旧的方法都是导入jar包,导入mainfest.xml等,导了一大堆东西出来,调用的时候还特麻烦,最近参考其他大佬的方案,深入研究了一下,整理出来一个接口调用简单,只需要导出aar包的方法,大部分方法和接口都已经封装好了,最大程度上去除了Android和unity开发的耦合性.
先贴上源码地址: Android及unity源码
大致执行逻辑:
- Android中提供Java方法调用接口;
- Unity调用Java接口方法;
- Java执行具体逻辑;
- Java回调Unity方法,返回计算结果。
Android Studio部分
作用:
- 实现Java逻辑;
- 提供供Unity调用的方法接口;
- 回调Unity方法(主要是将Java运算结果返回到Unity中)
此方法只需生成aar包即可.
- 新建Android Studio工程,工程名字随意命名,因为后续用不到它.比如叫做AndroidvsUnity.
软件版本应该无所谓,我用的3.2.
- SDK版本尽量选择unity开发过程中需要的版本,没有要求的话,我这里选的6.0;
- 因为是创建arr包,app中不需要管,所以开始不需要像应用开发那样创建Activity,选择no Activity即可,后面的类和Activity在新创建的模块中实现;
- 点击finish后,工程就创建完成了;
- 接下来,创建一个新的Moudle,这里需要稍微注意一下,我们这里创建的是arr包,不是apk应用,所以这里应该选择"Android Library";
- 这里的moudle的名字是导入unity的aar包,所以要认真取个名字;
- 接下来,创建几个通信类,可以参照我这里的名字,也可以任意取别的类名.
下面是几个类的源码,具体功能在注释中已经写的很清楚了.
AndroidCallBack: 供unity调用Android方法
IUnityCallBack: 供Android调用unity方法
UnityCallBackSingleton: Android调用unity方法的辅助类.
1. AndroidCallBack.java
/**
* Android方法,在与Unity通信开发过程中,供Unity调用.
* 用于unity调用java方法的初始化啊,参数传递啊之类的操作.
*/
public class AndroidCallBack {
private static final String TAG = "AndroidCallBack";
/**
* Unity中调用方法.
* 应在unity中的onstart()方法中,调用此方法,设置callback.
* @param callback unity中实现IUnityCallBack接口的类的对象,其中实现了IUnityCallBack接口声明的各个方法,供Android调用.
*/
public void setAndroidUnityCallback(IUnityCallBack callback){
try {
UnityCallBackSingleton.getInstance().setUnityCallback(callback);
}
catch (Exception ex)
{
Log.v(TAG,ex.toString());
}
}
/**
* Android方法,供unity调用,获得unity传入多个参数,执行相关动作.
* @param param 传入string参数.
* @param array 传入int[]参数
*/
public void androidFunc(String str, int[] array){
Log.d(TAG, "androidFunc: get a string from unity: " + str);
Log.d(TAG, "androidFunc: get a array from unity: " + Arrays.toString(array));
//Android主动调用unity中的方法.
IUnityCallBack callBack = UnityCallBackSingleton.getInstance().getUnityCallback();
if(callBack != null){
String unityStr = callBack.getUnityStringFunc(); //调用unity方法,获取返回值.
Log.d(TAG, "androidFunc: call the unity function and get the result: " + unityStr);
callBack.setUnityValueFunc