IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android 导出arr与unity2019以上版本交互 -> 正文阅读

[移动开发]Android 导出arr与unity2019以上版本交互

引言

由于下载了最新的Unity版本,工作需要将arr导入unity中进行交互。网上试了很多的方式都是2018老版本的导入自unity2019后引擎升级后老版本的导入方式已经不适用于unity2019了,导致打包出来各种出错试了各种版本的导入有jar的有arr的。需要将class.jar的来回导入导出删除,AndroidManifest.xml进行各种修改,PackageName各种需要注意的,各种修改都失败了。经过各种测试终于找到一个试用于最新版本的引擎的方式在此记录一下供以后参考。
参考链接: [https://www.jianshu.com/p/86b275da600e]
根据各路资料深深体会到一句话供大家一起勉励:

都说程序员是站在巨人的肩膀上的,但是你也要能找到巨人。如果你不够聪明,那就靠毅力和决心吧。

最新使用引擎

  • 安卓版本:Android Studio 11.0.12;
  • unity版本:unity2021.3.4f1c1(LTS);

方案优势

  • 不需要引用unity下的class.jar
  • 不用在Unity的/Plugins/Android下放置AndroidManifest.xml文件
  • Unity打包时PackageName不依赖于引用文件
  • 发布简单,只需要导出arr并直接拷贝到/Plugins/Android目录下即可使用,不用对文件做任何修改

Android部分

  • 首先我们打开AndroidStudio,并创建一个新项目,这里随便填写项目名、包名即可,因为这个项目我们后面并不会用到。
  • Activity我们选个EmptyActivit。
  • SDK选择最低版本(这个我们需要记住后面unity中需要用到)
    在这里插入图片描述
    在这里插入图片描述
  • 项目创建好以后开始我们的主菜,选中app然后新建一个moudle
    在这里插入图片描述
    在这里插入图片描述
  • 创建之后注意好包名com.lexjay.unity后面unity中需要用到
  • Minimum SDK能选多低选多低,反正不超过unity发布的版本就行
  • 然后我们在com.lexjay.mylibrary包下创建一个类,作为Unity和Android通信的核心类,这里我们叫「Unity2Android」
    在这里插入图片描述
    在这里插入图片描述
  • 然后我们直接粘贴该类的代码,讲解直接看注释。这里我们通过Java的反射原理来获取本来导入class.jar类才能引用到的com.unity3d.player.UnityPlayer包下的currentActivity上下文。同理给unity发消息也是反射原理。「getActivity」和「callUnity」这两个方法,有一定的开发经验应该很容易理解。
    这里我们实现一个简单的接口「showToast」。
package com.lexjay.unity;

import android.app.Activity;
import android.widget.Toast;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * Created by Jing on 2018-1-18.
 */
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;
    }

    /**
     * 调用Unity的方法
     * @param gameObjectName    调用的GameObject的名称
     * @param functionName      方法名
     * @param args              参数
     * @return                  调用是否成功
     */
    boolean callUnity(String gameObjectName, String functionName, String args){
        try {
            Class<?> classtype = Class.forName("com.unity3d.player.UnityPlayer");
            Method method =classtype.getMethod("UnitySendMessage", String.class,String.class,String.class);
            method.invoke(classtype,gameObjectName,functionName,args);
            return true;
        } catch (ClassNotFoundException e) {

        } catch (NoSuchMethodException e) {

        } catch (IllegalAccessException e) {

        } catch (InvocationTargetException e) {

        }
        return false;
    }

    /**
     * Toast显示unity发送过来的内容
     * @param content           消息的内容
     * @return                  调用是否成功
     */
    public boolean showToast(String content){
        Toast.makeText(getActivity(),content,Toast.LENGTH_SHORT).show();
        //这里是主动调用Unity中的方法,该方法之后unity部分会讲到
        callUnity("Main Camera","FromAndroid", "hello unity i'm android");
        return true;
    }
}
  • 代码写好就可以导出arr了我们选中module然后选择「Build」「Rebuild Project」等待进度条结束
    在这里插入图片描述

  • 将模式切换成project找到arr文件将其复制出来接下来就是Unity部分了
    在这里插入图片描述

Unity部分

  • 创建项目,将arr导入目录Assets/Plugins/Android,我们的导入就算完成了。

  • 在这里插入图片描述

  • 在界面上放一个按钮,并且创建一个Script绑定到「Main Camera」。用一个文本控件来展示Android发送过来的消息。编写相对应andirod的代码

using UnityEngine;
using UnityEngine.UI;

public class Main : MonoBehaviour
{

    /// <summary>
    /// 场景上的文本框用来显示android发送过来的内容
    /// </summary>
    public Text text;

    /// <summary>
    /// android原生代码对象
    /// </summary>
    AndroidJavaObject _ajc;

    void Start()
    {
        //通过该API来实例化导入的arr中对应的类
        _ajc = new AndroidJavaObject("com.lexjay.unity.Unity2Android");
    }

    void Update()
    {

    }

    /// <summary>
    /// 场景上按点击时触发该方法
    /// </summary>
    public void OnBtnClick()
    {
        //通过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;
    }
}

在这里插入图片描述在这里插入图片描述

  • 打包apk这里就是需要注意的地方很重要
    在这里插入图片描述

  • 设置包名。名字随便取不要和android里的包名相同。
    在这里插入图片描述

  • 这个需要设置好不然打包apk容易出错这个也是偶然机会自己试出来的一开始只设置最低API,下面没有设置,一直报错没有找到可行的解决方案,后来偶然设置了下面的API竟然打包成功了。

  • 然后打包apk到手机上测试。再编辑器里这个是试不出来的只有在Android上才能测试成功。
    在这里插入图片描述

结束语

这是初步导入就成功了后面有其他坑继续更新。

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-06-26 17:00:33  更:2022-06-26 17:01:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 3:39:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码