以为公司项目需求作为Android开发的我不得已接触到Unity领域,简单的一些Android 和 Unity互调历时一天半终于搞出来了,特此记录方便自己随时参考(本文大部分为拷贝的别人的文章,文末会贴出大神们的文章,大家可以去查看,谢谢大家体谅)

Android 部分:

  1. 首先我们打开AndroidStudio,并创建一个新项目,这里随便填写项目名、包名即可,因为这个项目我们后面并不会用到。
  2. SDK我们选最低的就行(一般情况下需要Android 创建版本和Unity Minimum API Level 版本号保持一致,以为我之前一直调不起来所以不确定是不是这里的问题,最好保持一致避免没必要的问题出现)
  3. 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所以大家见谅,这里贴出大神的文章大家可以去查看,特此记录方便自己以后使用,谢谢大家体谅。

大神一文章地址

大神二文章地址

大神三文章地址

更多相关文章

  1. android的服务进程Service的创建及启动
  2. Android实现甘特图(GanttChart)效果
  3. Android(安卓)项目实践(三)——数据库封装
  4. 转载 eoe 大神整理好的 android 开源项目
  5. eclipse配合Android(安卓)Studio部署Android(安卓)NDK开发环境
  6. 写一个自己的 Android(安卓)Hidl Service
  7. 最火的Android开源项目(二)
  8. Android中AS创建点9图片与使用
  9. Android(安卓)studio 制作aar 使用Gradle发布项目到JCenter仓库

随机推荐

  1. 选择云服务器的5个要素:性能、安全性、稳
  2. Spring Cloud分布式微服务实战,养成应对复
  3. Python代码运行速度慢?这五种方法很管用
  4. LNMP(Linux、Nginx、MySQL、PHP)安装部署
  5. LVS负载均衡集群架构
  6. iMovie 剪辑中如何更改片段速度?
  7. 学python入门需要什么基础?
  8. 【vue】 export、export default、import
  9. mysql数据库常见报错及解决方法
  10. Zabbix“专家坐诊”问题会诊1