Unity 调用Android arr包(互相调用并传值)

以为公司项目需求作为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<bool>("showToast", "this is unity");

        if (true == success)
        {
            //请求成功
            Debug.Log("请求成功");
        }
    }

    /// <summary>
    /// 原生层通过该方法传回信息
    /// </summary>
    /// <param name="content"></param>
    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所以大家见谅,这里贴出大神的文章大家可以去查看,特此记录方便自己以后使用,谢谢大家体谅。

大神一文章地址

大神二文章地址

大神三文章地址

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Unity调用Android相册可以通过编写本地插件来实现。以下是一种方法: 首先,创建一个Java类作为我们的本地插件。在Android Studio中,创建一个新的Java类文件,并添加以下代码: ```java import android.content.Intent; import android.net.Uri; import android.provider.MediaStore; public class GalleryPlugin { public static void OpenGallery() { Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); intent.setType("image/*"); intent.putExtra(Intent.EXTRA_MIME_TYPES, new String[]{"image/jpeg", "image/png"}); UnityPlayer.currentActivity.startActivityForResult(intent, 1); } } ``` 然后,在Unity中创建一个C#脚本来调用这个本地插件。在脚本中,我们将使用`DllImport`来导入Android库,并定义一个静态方法来调用Java类中的方法: ```csharp using System.Runtime.InteropServices; public class AndroidGallery : MonoBehaviour { [DllImport("gallery_plugin")] private static extern void OpenGallery(); public void OpenAndroidGallery() { OpenGallery(); } } ``` 在Unity中创建一个UI按钮,并将其连接到`OpenAndroidGallery`方法。这样,当我们点击按钮时,将调用本地插件的方法。 最后,将生成的Java类文件和C#脚本文件分别放在对应的目录中,并导出到Android项目中。 通过这种方式,我们可以在Unity调用Android相册,并允许用户选择图片。一旦用户选择了图片,可以使用Unity的处理方法进行后续操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值