Unity 调用Android(安卓)arr包(互相调用并传值)
以为公司项目需求作为Android开发的我不得已接触到Unity领域,简单的一些Android 和 Unity互调历时一天半终于搞出来了,特此记录方便自己随时参考(本文大部分为拷贝的别人的文章,文末会贴出大神们的文章,大家可以去查看,谢谢大家体谅)
Android 部分:
- 首先我们打开AndroidStudio,并创建一个新项目,这里随便填写项目名、包名即可,因为这个项目我们后面并不会用到。
- SDK我们选最低的就行(一般情况下需要Android 创建版本和Unity Minimum API Level 版本号保持一致,以为我之前一直调不起来所以不确定是不是这里的问题,最好保持一致避免没必要的问题出现)
- Activity我们选个EmptyActivity也行(因为创建的这个Activity咱们也用不到无所谓)
然后我们点击「Finish」完成AndroidStudio项目创建。
创建和unity交互的Moudle项目
1.项目创建好以后开始我们的主菜,选中app然后新建一个moudle
2.类型选择「Android Library」
3.Application/Library name认真填写,之后为arr导出的名称,这里我们叫「MyUnityLib」。
4.Module name没有强迫症就不用管它
5.Package name认真填写,之后unity里会用到,不过它和unity导出的包名没有什么关系这里我们叫「com.jing.unity」好了
6.Minimum SDK能选多低选多低,反正不超过unity发布的版本就行(我选择的是4.1 api 16)
7.创建
8.然后我们在com.jing.unity(因为我比较懒直接拷贝的别人的所以包和代码中的不一致)包下创建一个类,作为Unity和Android通信的核心类,名字尽量炫酷一点,这里我们叫「Unity2Android」
编写Android端代码
然后我们直接粘贴该类的代码,讲解直接看注释。这里我们通过Java的反射原理来获取本来导入class.jar类才能引用到的com.unity3d.player.UnityPlayer包下的currentActivity上下文。同理给unity发消息也是反射原理。「getActivity」和「UnityPlayer.UnitySendMessage」这两个方法,有一定的开发经验应该很容易理解。
这里我们实现一个简单的接口「showToast」
package com.unity.unitylib;import android.app.Activity;import android.widget.Toast;import com.unity3d.player.UnityPlayer;import java.lang.reflect.InvocationTargetException;import java.lang.reflect.Method;public class Unity2Android { /** * unity项目启动时的的上下文 */ private Activity _unityActivity; /** * 获取unity项目的上下文 * @return */ Activity getActivity(){ if(null == _unityActivity) { try { Class<?> classtype = Class.forName("com.unity3d.player.UnityPlayer"); Activity activity = (Activity) classtype.getDeclaredField("currentActivity").get(classtype); _unityActivity = activity; } catch (ClassNotFoundException e) { } catch (IllegalAccessException e) { } catch (NoSuchFieldException e) { } } return _unityActivity; } /** * Toast显示unity发送过来的内容 * @param content 消息的内容 * @return 调用是否成功 */ public boolean showToast(String content){ Toast.makeText(getActivity(),content,Toast.LENGTH_SHORT).show(); //这里是主动调用Unity中的方法,该方法之后unity部分会讲到 /** * 参数一:为游戏物体名 * 参数二:为Android调用Unity方法(.cs 脚本方法名称) * 参数三:为Android要传递给Unity的数据 */ UnityPlayer.UnitySendMessage("Main Camera", "FromAndroid", "hello unity i'm android"); return true; }}
导出arr准备给unity使用
10.代码写好了我们选中module然后选择「Build」「Rebuild Project」
11.接着将这个arr文件找到,就是我们要导入到unity的文件了。(一般会在。build -> outputs -> aar 文件下)
Unity部分
1.创建一个unity项目
2.创建目录Assets/Plugins/Android,并将刚才导出的arr文件放到该文件夹下,我们的导入就算完成了。没错就是这么Easy,然后我们看看怎么来调用它。
3.在界面上放一个按钮,并且创建一个Script绑定到「Main Camera」。用一个文本控件来展示Android发送过来的消息。
4.Script的代码内容如下
using System.Collections;using System.Collections.Generic;using UnityEngine;using UnityEngine.UI;public class Test : MonoBehaviour{ public Button button; public Text text; AndroidJavaObject _ajc; public void Start() { //通过该API来实例化导入的arr中对应的类 _ajc = new AndroidJavaObject("com.unity.unitylib.Unity2Android"); button.onClick.AddListener(Func); } public void Func() { //text.text = "变量了"; //通过API来调用原生代码的方法 bool success = _ajc.Call("showToast", "this is unity"); if (true == success) { //请求成功 Debug.Log("请求成功"); } } /// /// 原生层通过该方法传回信息 /// /// public void FromAndroid(string content) { text.text = content; }}
5.然后打包APK到我们的Android设备上进行测试。
6.点击按钮,查看效果
这样就算是完成了,但是有的时候还是调不起来或者Unity打包失败报jar包异常,那是因为Unity在导入打包的过程中会自动将自己的classes.jar文件给打包进去,所以需要我们手动去把导入Unity工程下的aar包中的 lib/classes.jar 删除掉,我用的是2345好压打开的aar文件
这是删除后的效果
然后再打包应该就ok了,这篇文章是我拷贝的大神的文章,因为自己是做Android开发的不得已才自己调试的Unity所以大家见谅,这里贴出大神的文章大家可以去查看,特此记录方便自己以后使用,谢谢大家体谅。
大神一文章地址
大神二文章地址
大神三文章地址
更多相关文章
- android的服务进程Service的创建及启动
- Android实现甘特图(GanttChart)效果
- Android(安卓)项目实践(三)——数据库封装
- 转载 eoe 大神整理好的 android 开源项目
- eclipse配合Android(安卓)Studio部署Android(安卓)NDK开发环境
- 写一个自己的 Android(安卓)Hidl Service
- 最火的Android开源项目(二)
- Android中AS创建点9图片与使用
- Android(安卓)studio 制作aar 使用Gradle发布项目到JCenter仓库