Unity和Android的交互,Unity与Android的交互融合之道

马肤

温馨提示:这篇文章已超过395天没有更新,请注意相关的内容是否还可用!

摘要:Unity与Android的交互指的是Unity游戏引擎与Android操作系统的连接与通信。Unity支持跨平台开发,包括Android平台。开发者可以使用Unity创建游戏或应用程序,并通过导出为Android平台,实现与Android设备的交互。这种交互包括游戏控制、数据传输、用户交互等方面,使得Unity成为Android游戏开发的重要工具之一。

Unity和Android的交互

  • 一、前言
  • 二、Android导出jar/aar包到Unity
    • 2.1 版本说明
    • 2.2 拷贝Unity的classes.jar给Android工程
      • 2.2.1 classes.jar的位置
      • 2.2.2 Android Studio创建module
      • 2.2.3 拷贝classes.jar 到 Android工程并启用
      • 2.3 编写Android工程代码
        • 2.3.1 创建 MainActivity
        • 2.3.2 MainActivity改继承 UnityPlayerActivity
        • 2.3.3 拷贝 UnityPlayerActivity
        • 2.3.4 编写Android工程代码
        • 2.3.5 编写AndroidManifest.xml
        • 2.4 编写Unity工程代码
          • 2.4.1 搭建游戏物体GameObject
          • 2.5 导出和构建APK
            • 2.5.1 导出Java文件
            • 2.5.2 导出Jar包
              • 2.5.2.1 构建Jar包
              • 2.5.2.2 新建Task任务构建和重命名Jar包
              • 2.5.3 导出aar包
                • 2.5.3.1 构建aar和修改aar包
                • 2.5.3.2 压缩aar包细节
                • 2.5.3.3 解决Androidmainfest合并问题
                • 2.5.3.4 解决桌面2个启动图标

                  一、前言

                  Unity和Android原生交互的方式大概有2种,一种是Android导出jar/aar包给Unity,然后Unity来构建apk;另外一种是Unity勾选Export Project,导出为一个Android工程,然后用AndroidStudio构建APK;这里讲讲第一种方式

                  二、Android导出jar/aar包到Unity

                  2.1 版本说明

                  • 这里我用的Unity版本是 2020.3.33f1c2; AndroidStudio 用的版本是 2021.3.1

                    思路大致是一致的,但不同版本可能导出的文件路径不太一样或内容可能不太一样,这个要注意一下

                    2.2 拷贝Unity的classes.jar给Android工程

                    2.2.1 classes.jar的位置

                    classes.jar 位于 {Unity 安装位置}\Editor\Data\PlaybackEngines\AndroidPlayer\Variations{mono或il2cpp}\Release\Classes\ 目录下

                    • 这里主要涉及到2个变量,一个是Unity版本,一个是mono或il2cpp;

                      不同Unity版本的安装路径不一样,可以用UnityHub点击 设置按钮-在资源管理中显示。快速进入到对应版本的目录;

                      Unity和Android的交互,Unity与Android的交互融合之道 第1张

                      至于mono或il2cpp,主要看你选用哪种打包方式。由于是示例空工程,并且要快速构建,所以我这里选了mono;

                      2.2.2 Android Studio创建module

                      先用Android Studio新建一个Android Studio空工程,接着我们创建一个module模块来实现功能

                      点击 File-New-New Module,拉起创建面板

                      Unity和Android的交互,Unity与Android的交互融合之道 第2张

                      注意,这里要先切换到Android Library页签,然后可以输入你喜欢的module名字

                      Unity和Android的交互,Unity与Android的交互融合之道 第3张

                      2.2.3 拷贝classes.jar 到 Android工程并启用

                      • 拷贝第一步的classes.jar,并粘贴进模块的libs目录下

                        Unity和Android的交互,Unity与Android的交互融合之道 第4张

                      • 启用classes.jar

                        粘贴进来后,其实还没起作用。右键classes.jar,然后点击 Add as Library

                        Unity和Android的交互,Unity与Android的交互融合之道 第5张

                        然后你会发现classes.jar有个三角标了,这时才起作用了。

                        Unity和Android的交互,Unity与Android的交互融合之道 第6张

                        Add as Library 这一步操作等同于在module的build.gradle里添加 implementation files(‘libs\classes.jar’), 然后 点击 File - Sync Project with Gradle Files按钮;

                        我们也可以通过修改文件的方式来快速的添加和移除lib

                        Unity和Android的交互,Unity与Android的交互融合之道 第7张

                        2.3 编写Android工程代码

                        2.3.1 创建 MainActivity

                        在模块下创建MainActivity ,也不一定要这个名字,可以根据你喜欢的来

                        Unity和Android的交互,Unity与Android的交互融合之道 第8张

                        2.3.2 MainActivity改继承 UnityPlayerActivity

                        这里MainActivity 改继承自UnityPlayerActivity,不出意外,改继承后这里会报红。这是因为新版本的Unity(大概是2019和之后的版本),导出的 classes.jar 不再包含 UnityPlayerActivity了。所以我们需要再拷贝一个UnityPlayerActivity过来

                        Unity和Android的交互,Unity与Android的交互融合之道 第9张

                        2.3.3 拷贝 UnityPlayerActivity

                        这个路径在对应Unity版本的 Editor\Data\PlaybackEngines\AndroidPlayer\Source\com\unity3d\player目录下。只要找到前面的classes.jar,相信这个对你来说也是轻松找到

                        Unity和Android的交互,Unity与Android的交互融合之道 第10张

                        • 拷贝进Android工程

                          如下图,可以保持和MainActivity同级,拷贝进来

                          Unity和Android的交互,Unity与Android的交互融合之道 第11张

                          然后修改package路径(可以从MainActivity.java里拷贝package路径粘贴进来)和 引入命名空间

                          代码如下,熟悉的朋友也可以在报红处按下Alt + Enter,手动引入

                          package com.example.linkunitylibrary; //这里拷贝你MainActivity的package
                          //import导入依赖
                          import com.unity3d.player.IUnityPlayerLifecycleEvents;
                          import com.unity3d.player.MultiWindowSupport;
                          import com.unity3d.player.UnityPlayer;
                          

                          然后 MainActivity就不报红了

                          Unity和Android的交互,Unity与Android的交互融合之道 第12张

                          • 题外话

                            记得好像有些教程是放在com.unity3d.player目录下,并保持原包名,如下图的层级和package路径。我有测试过,但在最后构建apk会报错。

                            Unity和Android的交互,Unity与Android的交互融合之道 第13张

                          • 原因我觉得是这样:因为最终我们要把android studio构建出来的jar包或aar包,放回unity。那如果这里保持一样的包名,到时放回unity,就相当于有2个一样的 com.unity3d.player.UnityPlayerActivity 类了,那就会报错。所以我觉得这种方式应该不可行…

                            2.3.4 编写Android工程代码

                            这里我们分别 写一个方法给Unity调用 和 调用Unity里的一个方法

                            Unity和Android的交互,Unity与Android的交互融合之道 第14张

                            代码如下

                            package com.example.linkunitylibrary;
                            import android.os.Bundle;
                            import com.unity3d.player.UnityPlayer;
                            /**
                             * Created by super41 on 2024/4/5.
                             */
                            public class MainActivity extends UnityPlayerActivity {
                                @Override
                                protected void onCreate(Bundle savedInstanceState) {
                                    super.onCreate(savedInstanceState);
                                    //调用Unity的方法
                                    a2u_add(1,5);
                                }
                                //写一个方法给Unity调用
                                public int u2a_add(int a,int b){
                                    return a + b;
                                }
                                //调用unity里的方法
                                public void a2u_add(int a,int b){
                                    sendMsg2Unity("a2u_add",a+"|"+b);
                                }
                                private static final String LinkGameObjectName  = "UnityLinkAndroidGo";
                                /**
                                 * 给Unity发消息
                                 * @param methodName 方法名
                                 * @param params 参数
                                 */
                                private void sendMsg2Unity(String methodName,String params){
                                    //依次传入 GameObjectName, GameObject里的方法,参数
                                    //因为这里 GameObjectName 一般固定,所以封装起来
                                    //只能传递一个参数,多个参数拼接在params里
                                    UnityPlayer.UnitySendMessage(LinkGameObjectName,methodName,params);
                                }
                            }
                            

                            2.3.5 编写AndroidManifest.xml

                            修改AndroidManifest.xml,这里记得替换为你自己的包名和类名

                            
                                
                                     
                                        
                                             
                                             
                                        
                                        
                                    
                                
                            
                            

                            2.4 编写Unity工程代码

                            2.4.1 搭建游戏物体GameObject

                            • 创建2个Text文本,一个显示Unity_Call_Android的加法结果,一个显示Android_Call_Android的加法结果

                              Unity和Android的交互,Unity与Android的交互融合之道 第15张

                            • 创建UnityLinkAndroidGo物体,这里游戏名字要跟Android代码里的物体名字一致。

                              创建任意名字的脚本,如UnityLinkAndroidScript,代码如下

                              using System.Collections;
                              using System.Collections.Generic;
                              using UnityEngine;
                              using UnityEngine.UI;
                              public class UnityLinkAndroidScript : MonoBehaviour
                              {
                                  public Text Txt1;
                                  public Text Txt2;
                                  
                                  // Start is called before the first frame update
                                  void Start()
                                  {
                                      u2a_add(100,200);
                                  }
                                  /// 
                                  /// Unity调用Android
                                  /// 
                                  void u2a_add(int a, int b)
                                  {
                                      //标准操作,获取MainActivity对象
                                      AndroidJavaClass javaClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
                                      AndroidJavaObject javaObject = javaClass.GetStatic("currentActivity");
                                      //调用方法
                                      var result = javaObject.Call("u2a_add", a, b);
                                      Txt1.text = $"UnityCallAndroid {a} + {b} = {result}";
                                  }
                                  /// 
                                  /// 给android调用的方法
                                  /// 
                                  /// 
                                  void a2u_add(string objs)
                                  {
                                      var arrays = objs.Split('|');
                                      var a = int.Parse(arrays[0]);
                                      var b = int.Parse(arrays[1]);
                                      var result = a + b;
                                      Txt2.text = $"AndroidCallUnity {a} + {b} = {result}";
                                  }
                                  
                              }
                              

                              然后把2个Text附上

                              Unity和Android的交互,Unity与Android的交互融合之道 第16张

                              2.5 导出和构建APK

                              一切准备就绪,接下来就是导出和构建APK了

                              2.5.1 导出Java文件

                              我们一般是导出jar包和aar包文件。其实也可以用导出java文件的方式

                              如下图,3个文件导出到Unity的Assets/Plugins/Android/目录下,如没有目录则创建

                              Unity和Android的交互,Unity与Android的交互融合之道 第17张

                              Unity和Android的交互,Unity与Android的交互融合之道 第18张

                              接着就是常规的构建apk了。我们来看运行结果。可以看到成功运行了起来

                              Unity和Android的交互,Unity与Android的交互融合之道 第19张

                              2.5.2 导出Jar包

                              2.5.2.1 构建Jar包

                              上面的导出java文件一般不是主流的方式,还是导出成一个压缩包的形式更好管理一点。我们来看看怎么导出jar包

                              选中你的module,然后点击 Build - Make Module xxx. 然后打开资源管理器,就可以看到这里生成了一个build目录

                              Unity和Android的交互,Unity与Android的交互融合之道 第20张

                              进入build\intermediates\aar_main_jar\debug\目录(这里不同Android版本可能输出路径不一样,思路是一致的)

                              可以找到classes.jar

                              Unity和Android的交互,Unity与Android的交互融合之道 第21张

                              拷贝这里的classes.jar拷贝到Plugins/Android/目录下,并删除掉原来的java文件。如下图

                              Unity和Android的交互,Unity与Android的交互融合之道 第22张

                              然后就是构建apk了,也可以得到我们想要的效果;

                              2.5.2.2 新建Task任务构建和重命名Jar包
                              • 一般我们需要重命名我们的jar包,不然叫classes.jar不太好,手动改每次都要来一遍不太好。我们可以添加task任务来实现这一步骤。打开module的build.grade,在文件的最后添加任务

                                Unity和Android的交互,Unity与Android的交互融合之道 第23张

                                代码如下:

                                //删除旧jar包
                                task tryDeleteOldJar(type:Delete){
                                    delete('release/HelloWorld.jar')
                                }
                                //导出并重命名jar包
                                task exportJar(type : Copy){
                                    from('build\intermediates\aar_main_jar\debug')//从这个路径拷贝
                                    into('release') //拷贝到这个路径
                                    include('classes.jar')
                                    rename('classes.jar','HelloWorld.jar')
                                }
                                //添加依赖
                                exportJar.dependsOn(tryDeleteOldJar,build)
                                

                                然后Sync刷新一下

                                Unity和Android的交互,Unity与Android的交互融合之道 第24张

                                点击右侧的Gradle,然后点击Task/other

                                Unity和Android的交互,Unity与Android的交互融合之道 第25张

                                就可以看到exportJar任务了

                                Unity和Android的交互,Unity与Android的交互融合之道 第26张

                                双击执行它,我们可以得到一个重命名好的HelloWorld.jar

                                Unity和Android的交互,Unity与Android的交互融合之道 第27张

                                如果看不到Task任务,那是一些版本的AndroidStudio隐藏掉了,可以进入File-Setting-Experimental,然后取消勾选这个Do not build… 选项,然后点击OK后你就可以看到Task了(当然不同版本可能设置不一样,这里主要介绍一种解决思路)

                                Unity和Android的交互,Unity与Android的交互融合之道 第28张

                                到此,导出Jar包的形式也好了

                                2.5.3 导出aar包

                                我们还可以导出aar包,aar和jar包的区别是,jar包一般只包含java文件,而aar包除此之外,还可以包含res和AndroidMainfest.xml

                                2.5.3.1 构建aar和修改aar包

                                接下来我们来实现导出aar包;

                                和之前一样,我们选中Module,点击Build-Make Module来构建

                                Unity和Android的交互,Unity与Android的交互融合之道 第29张

                                可以在build/outputs/aar里面找到aar

                                Unity和Android的交互,Unity与Android的交互融合之道 第30张

                                aar包本质上是一个压缩包,我们改为.zip格式,然后用压缩文件打开。目录大致如下

                                Unity和Android的交互,Unity与Android的交互融合之道 第31张

                                还记得我们从unity拷贝了一个classes.jar过来嘛,这个文件也会被构建进aar包,然后当我们把aar包放回unity,那么就会有重名的类。所以我们需要删除掉这个classes.jar

                                Unity和Android的交互,Unity与Android的交互融合之道 第32张

                                具体的操作方式是:

                                把libs里的classes.jar删掉,然后箭头的classes.jar拖进libs目录

                                Unity和Android的交互,Unity与Android的交互融合之道 第33张

                                2.5.3.2 压缩aar包细节

                                然后接下来就是重新压缩成一个aar包了。压缩这里有2点很关键,我当时自己也是踩坑了好几个小时。

                                现在说一下:

                                • 选中你的文件列表,然后右键进行压缩,如下图。注意不要在外层目录压缩,不然会多嵌套一层文件夹,导致Unity识别不到;

                                  Unity和Android的交互,Unity与Android的交互融合之道 第34张

                                • 压缩格式这里选zip,不要选默认的rar… 当时就是选rar,然后就进坑了…

                                  Unity和Android的交互,Unity与Android的交互融合之道 第35张

                                  然后把得到的压缩包改为aar后缀

                                  Unity和Android的交互,Unity与Android的交互融合之道 第36张

                                  然后放回Unity,因为aar包已经有了AndroidMainfest.xml,所以可以把之前的删掉,只留下aar包

                                  Unity和Android的交互,Unity与Android的交互融合之道 第37张

                                  接下来就是构建出APK了,也可以得到我们想到的效果;

                                  2.5.3.3 解决Androidmainfest合并问题

                                  如果构建过程中提示AndroidMainfest 合并失败,如下图。是因为最小sdk版本要改一下

                                  Unity和Android的交互,Unity与Android的交互融合之道 第38张

                                  这里你可以对aar包里的minSdkVersion进行修改,改成提示的版本,比如我这里是改成19,然后导出为压缩包

                                  Unity和Android的交互,Unity与Android的交互融合之道 第39张

                                  也可以对Modudle的build.gradle改下minsdk版本,我这里是改成19,这种方式更好一点。然后重新构建aar包

                                  Unity和Android的交互,Unity与Android的交互融合之道 第40张

                                  2.5.3.4 解决桌面2个启动图标

                                  使用导出aar的方式构建出的apk,桌面上可能会有2个程序入口,也就是2个图标。

                                  我们需要修改下AndroidMainfest.xml

                                  进入PlayerSetting,勾选 CustomMainfest.xml

                                  Unity和Android的交互,Unity与Android的交互融合之道 第41张

                                  然后会自动生成AndroidMainfest.xml

                                  Unity和Android的交互,Unity与Android的交互融合之道 第42张

                                  进入AndroidMainfest.xml,把这个activity整段删掉,然后再构建apk即可

                                  Unity和Android的交互,Unity与Android的交互融合之道 第43张

                                  最后导出APK就可以了。至此我们就完成了3种导出方式


0
收藏0
文章版权声明:除非注明,否则均为VPS857原创文章,转载或复制请以超链接形式并注明出处。

相关阅读

  • 【研发日记】Matlab/Simulink自动生成代码(二)——五种选择结构实现方法,Matlab/Simulink自动生成代码的五种选择结构实现方法(二),Matlab/Simulink自动生成代码的五种选择结构实现方法详解(二)
  • 超级好用的C++实用库之跨平台实用方法,跨平台实用方法的C++实用库超好用指南,C++跨平台实用库使用指南,超好用实用方法集合,C++跨平台实用库超好用指南,方法与技巧集合
  • 【动态规划】斐波那契数列模型(C++),斐波那契数列模型(C++实现与动态规划解析),斐波那契数列模型解析与C++实现(动态规划)
  • 【C++】,string类底层的模拟实现,C++中string类的模拟底层实现探究
  • uniapp 小程序实现微信授权登录(前端和后端),Uniapp小程序实现微信授权登录全流程(前端后端全攻略),Uniapp小程序微信授权登录全流程攻略,前端后端全指南
  • Vue脚手架的安装(保姆级教程),Vue脚手架保姆级安装教程,Vue脚手架保姆级安装指南,Vue脚手架保姆级安装指南,从零开始教你如何安装Vue脚手架
  • 如何在树莓派 Raspberry Pi中本地部署一个web站点并实现无公网IP远程访问,树莓派上本地部署Web站点及无公网IP远程访问指南,树莓派部署Web站点及无公网IP远程访问指南,本地部署与远程访问实践,树莓派部署Web站点及无公网IP远程访问实践指南,树莓派部署Web站点及无公网IP远程访问实践指南,本地部署与远程访问详解,树莓派部署Web站点及无公网IP远程访问实践详解,本地部署与远程访问指南,树莓派部署Web站点及无公网IP远程访问实践详解,本地部署与远程访问指南。
  • vue2技术栈实现AI问答机器人功能(流式与非流式两种接口方法),Vue2技术栈实现AI问答机器人功能,流式与非流式接口方法探究,Vue2技术栈实现AI问答机器人功能,流式与非流式接口方法详解
  • 发表评论

    快捷回复:表情:
    评论列表 (暂无评论,0人围观)

    还没有评论,来说两句吧...

    目录[+]

    取消
    微信二维码
    微信二维码
    支付宝二维码