Android 导出arr与unity2019以上版本交互

Posted lexjay

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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上才能测试成功。

结束语

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

Unity与安卓交互 | Unity2019.3版本之后,在Android Studio中写代码导出aar包与Unity中使用交互的方法

  • 🎬 博客主页:https://xiaoy.blog.csdn.net

  • 🎥 本文由 呆呆敲代码的小Y 原创,首发于 CSDN🙉

  • 🎄 学习专栏推荐:Unity系统学习专栏

  • 🌲 游戏制作专栏推荐:游戏制作

  • 🌲Unity实战100例专栏推荐:Unity 实战100例 教程

  • 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!

  • 📆 未来很长,值得我们全力奔赴更美好的生活✨

  • ------------------❤️分割线❤️-------------------------

前言

  • 由于Unity在2019.3的新版本之后,Unity的class包中的内容发生了变化。
  • 官方将UnityPlayerActivity.java单独做了一个文件夹分离了出来,所以Unity2019.3版本之后就不能跟之前一样,只复制安装磁盘 \\Unity\\Editor\\Data\\PlaybackEngines\\AndroidPlayer\\Variations\\mono\\Release\\Classes路径下的jar包到AS中了
  • 还需要将UnityPlayerActivity.java也复制到AS中去才行。

这是旧版本从AS打包aar给Unity使用的方法:
Unity与安卓交互 之 ✨ 在Android Studio中写代码导出aar包,在Unity中使用交互(小白完整篇)

下面来看一下新版具体的操作实例。


示例

第一步:新建一个AS项目,这一点就不多说了,与之前的类似

第二步:将class包与UnityPlayerActivity.java复制到AS项目中

与之前旧版本一致,只需要增加了将UnityPlayerActivity.java复制到AS中这一步骤。


第三步:打开UnityPlayerActivity添加包

添加内容如下:

import com.unity3d.player.IUnityPlayerLifecycleEvents;
import com.unity3d.player.UnityPlayer;

第四步:新建一个类并简单编写代码
到这里就与旧版本没什么区别了,其实也就只是增加了一步将UnityPlayerActivity.java额外复制。


第五步:修改AndroidManifest

与旧版本类似,修改报错部分,增加一行代码

 <meta-data android:name="unityplayer.UnityActivity" android:value="true"/>

第六步:Build->Make Project,等待执行完毕。

选中unitylibrary->Build->Make Module"unitylibrary",等待执行完毕。

第七步:aar文件修改

打开复制出来的aar包,将外边这个classes.jar剪切到libs文件夹下替换掉libs中原来的classes.jar包

第八步:新建Unity工程,新建文件夹Plugins/Android,编写脚本


这样就完成了一个简单的Unity与Android交互的方法啦!


总结

  • 官方说是为了方便 Android 端的调用所以单独将 Unity 相关内容搞成了个模块,也就是 unityLibrary。
  • 具体相关内容可以参考 官方链接
  • 如果我们还是想跟之前一样进行Unity与Android之间的交互,那就增加了第二步和第三步,其他地方与原来都是一致的操作。
  • 新版本之后也有其他方法可以同样使用Unity与Android交互,可以参考下面的内容。

新旧版本的路径

2019.2.3版本之前的路径:
class包路径是在 安装Unity的目录下,例如:

安装磁盘 \\Unity\\Editor\\Data\\PlaybackEngines\\AndroidPlayer\\Variations\\mono\\Release\\Classes

2019.3 之后的路径:

安装磁盘 \\Unity 2019.4.38f1\\Editor\\Data\\PlaybackEngines\\AndroidPlayer\\Source\\com\\unity3d\\player


其他相关信息介绍

在 Unity 2019.2.3+ 使用arm64 + IL2CPP导出的原生安卓项目会包括两个gradle项目

  • launcher
  • unityLibrary

Unity官方声明这样是为了把Unity的项目完全剥离出来,方便之后二次处理

其他内容参考链接如下:
https://www.pudn.com/news/628324a63b39c078242b6985.html
https://blog.csdn.net/d773689630/article/details/117279407

以上是关于Android 导出arr与unity2019以上版本交互的主要内容,如果未能解决你的问题,请参考以下文章

Unity与安卓交互 | Unity2019.3版本之后,在Android Studio中写代码导出aar包与Unity中使用交互的方法

修改unity导出到安卓的activity

使用Android Studio(AS)导出jar供Unity使用

unity 与android交互

「Unity」与iOSAndroid平台的整合:1导出的Xcode工程

Android Studio如何导出可供Unity使用的aar插件详解 转