Unity与原生交互之AndroidStudio篇——Unity导出Android工程,导入AndroidStudio打包APK全流程_unity导出安卓工程-程序员宅基地

技术标签: unity  android  Unity与Android交互专栏  

一.Unity导出Android工程:

  

 

unityLibrary: unity的功能库模块 , android工程用到的重要文件夹

launcher: unity的启动器模块,包含很少的java代码

 二.AS打开unity android工程

  直接Open unity导出的整个android项目,Launcher模块作为app启动模块

 三.AS集成unityLibrary(推荐)

方式:Import Library Module 

 1.AS先New一个空项目:

 

Empty Activity 不能选择Language,默认为Kotlin语言

 Empty Views Activity 可以选择Language (新版本推荐)

包名不用跟Unity的包名相同

删除多余的Test库

 2.导入 unityLibriry模块

2.1 Import unityLibriry模块

  *等待编译后会出现报错:

解决方式:在工程级的gradle.properties文件中添加 unityStreamingAssets=.unity3d 后点右上角Try Again

 *若出现如下错误

 解决方式:打开unityLibrary下的build.gradle文件,添加如下代码,点击Try Again

android {
    namespace 'com.android.library'
}

2.2 将unityLibrary模块加入到主工程app模块的module依赖

然后打开file/Project Structure - Dependencies - 选择app - 点击右侧的+号 -

选择Module Dependency 

勾选unityLibrary - 点击OK

 

 

 2.3 修改unityLibrary下的build.gradle文件内容:

把 implementation 改为 api ,点击sync

2.4 修改主工程级的setting.gradle文件内容,点击sync

project(':unityLibrary').projectDir=new File('unityLibrary')

 2.5 修改主工程级的setting.gradle文件内容,点击sync

  flatDir {
            dirs "${project(':unityLibrary').projectDir}/libs"
            //dirs './unityLibrary/libs'
        }

 *若报错找不到路径:

解决方式1:将内容改为如下

 解决方式2:将内容改为如下

 2.6 修改unityLibrary下的 /src/main/AndroidManifest.xml文件,内容如下

在<activity 中增加一句: android:process="e.unity3d"

android:launchMode="singleTask"

android:process="e.unity3d"

这两句使unity成为独立的进程,这样退出unity时不会闪退

 2.7 将Launcher/src/main/res/values/strings.xml 文件拷贝进unityLibrary/src/main/res/values/里

不然编译会报错

 2.8 其他配置修改 

   (1)修改项目级app下的strings.xml文件

        增加一句: <string name="game_view_content_description"></string>

        解决某些程序直接闪退的问题

        

        运行后提示,通过添加上面代码后可以解决

    (2)在项目级app下AndroidManifest.xml application中添加

        tools:replace="android:icon,android:theme,android:allowBackup"  

        解决合并AndroidManifest.xml文件AppTheme冲突问题

        

 2.9 配置NDK 

unityLibrary编译时会依赖 ndk 来执行il2cpp.exe 生成libil2cpp.so文件

 解决方式1:配置NDK (推荐采用此方式)

 (1)设置支持的SO库架构

        注意:SDK中使用的so文件支持五种架构:

                       x86,x86_64,,armeabi,armeabi-v7a,arm64-v81

                  如果您应用中支持的架构超出这五种

                  请在build.gradle中使用abiFilters选择支持的架构

        在项目级(app)的build.gradle文件里的defaultConfig里加入以下代码

        设置支持的SO库架构 解决unityLibrary库 .so文件兼容问题

 ndk {
            abiFilters 'arm64-v8a','armeabi-v7a'
        }

       

 (2)配置AS ndk路径:

        打开工程级下的local.properties文件,添加如下代码 ,指定ndk路径:

        可以直接使用Unity的NDK,也可以使用自己下载的

        

        

         进入file/Project Structure-SDK Location 可以查看到SDK 与 NDK 路径配置

         若电脑中没有ndk,可点击Download下载,自动下载到配置SDK的路径下的,下载完后再在local.properties文件中配置上对应路径ndk.dir=D\:/SDK/ndk-bundle即可

          

(3)修改unityLibrary 下的build.gradle文件,打开BuildIl2Cpp相关代码

        

  解决方式2:(推荐情况:mac电脑,无法执行exe,只能采用此方式)

        1)注释掉BuildIl2Cpp相关代码

        

        2)用unity导出apk

        3)然后解压apk,从中提取出libil2cpp.so文件

        4)拖入到AS中的unityLibrary/src/main/jniLibs/arm64-v8a/路径里

        

        

选取任意一种方式处理后,重新Build - Make Moudle 'xxx.unityLibrary' 进行编译

 *若出现报错:

 解决方式:根据日志信息,把unityLibrary下的AndroidMainfest.xml文件里第二行中的package="com.unity3d.player" 删除即可,再次Build不再报错

注:但是不知道删除此句会不会影响其他,目前运行打包均正常,未发现异常影响

        自此,unityLibrary就全部集成完毕,Android工程app模块可以正常引用com.unity3d.player.UnityPlayerActivity

3.编写MainActivity启动代码

        修改app下的MainActivity.java,继承UnityPlayerActivity

        

4.配置连接运行设备

        4.1 下载安装雷电模拟器,并运行打开模拟器

        4.2 AS会自动识别并设置运行目标设备为打开的模拟器 

        

5. 运行测试

        5.1点击绿色三角图标,运行

        

         5.2 等待编译、构建,成功后如下

        

        切换到模拟器窗口,app已被安装运行

        

6.集成unityLibrary补充配置

 6.1 在项目级别(app)的AndroidMainfest.xml文件里,在图中位置加入这两行代码(可选)

xmlns:tools="http://schemas.android.com/tools"

tools:replace="android:icon,android:theme,android:allowBackup"

 

6.2 保持原生与unityLibrary的SDK版本一致(可选)

同步项目级(app)的build.gradle部分数据到应用级(unityLibrary)的build.gradle

6.3 选择unityLibrary,Build - Make Moudle 'xxx.unityLibrary',开始编译

 *若出现报错: 

则就是ndk配置问题,找不到ndk,解决方式查看上面2.9

出现这个问题的原因是:unityLibrary编译时会依赖ndk 来执行il2cpp.exe生成libil2cpp.so文件

 7.构建APK

等待完成:

8.导入AS遇到的问题记录:

1.相关插件报错:

org.gradle.api.plugins.UnknownPluginException: Plugin [xxx] was not found in any of the following sources

当时的解决办法:

找到 gridle.properties 文件打开,在最下面添加一条
android.overridePathCheck=true 即可

然后重新编译(右键问题所有处的灯泡图标,点击TryAgain)

2.编译时SDK相关报错:

个人理解原因是:Unity自身的SDK路径不允许AS再安装其他版本的SDK,需将AS的SDK路径修改为自定义路径

Failed to install the following Android SDK packages as some licences have not been accepted.    build-tools;30.0.3 Android SDK Build-Tools 30.0.3 To build this project,

accept the SDK license agreements and install the missing components using the Android Studio SDK Manager. All licenses can be accepted using the sdkmanager command line tool: sdkmanager --licenses Or, to transfer the license agreements from one workstation to another, see https://developer.android.com/studio/intro/update.html#download-with-gradle

(1)首先licences have not been accepted的问题:

该错误是SDK中的licences未被接受

解决方法:

        1.打开cmd

        2.进入到AS里设置的SDK的安装目录下和tools下的bin目录:/tools/bin

   3.输入 sdkmanager --licenses回车,在接下来出现的lisenses中都输入y接受这些licenses,在回到AndroidStudio中重新编译项目即可。

(2)SDK无法安装的问题:

这是由于缺少相关版本的SDK Tools,正常情况下AS在编译时会自动下载缺少的版本

我遇到的问题的原因是:我的AS内设置的SDK路径是Unity编辑器自身的SDK路径,但我试图在AS中手动下载SDK Tools时,会出现安装报错:

 

 因此,我将AS的SDK路径修改为自定义的SDK路径

 

 再重新编译AS-Rebuild Project,运行正常不再有报错

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/smile_otl/article/details/130681404

智能推荐

C#连接OPC C#上位机链接PLC程序源码 1.该程序是通讯方式是CSharp通过OPC方式连接PLC_c#opc通信-程序员宅基地

文章浏览阅读565次。本文主要介绍如何使用C#通过OPC方式连接PLC,并提供了相应的程序和学习资料,以便读者学习和使用。OPC服务器是一种软件,可以将PLC的数据转换为标准的OPC格式,允许其他软件通过标准接口读取或控制PLC的数据。此外,本文还提供了一些学习资料,包括OPC和PLC的基础知识,C#编程语言的教程和实例代码。这些资料可以帮助读者更好地理解和应用本文介绍的程序。1.该程序是通讯方式是CSharp通过OPC方式连接PLC,用这种方式连PLC不用考虑什么种类PLC,只要OPC服务器里有的PLC都可以连。_c#opc通信

Hyper-V内的虚拟机复制粘贴_win10 hyper-v ubuntu18.04 文件拷贝-程序员宅基地

文章浏览阅读1.6w次,点赞3次,收藏10次。实践环境物理机:Windows10教育版,操作系统版本 17763.914虚拟机:Ubuntu18.04.3桌面版在Hyper-V中的刚安装好Ubuntu虚拟机之后,会发现鼠标滑动很不顺畅,也不能向虚拟机中拖拽文件或者复制内容。在VMware中,可以通过安装VMware tools来使物理机和虚拟机之间达到更好的交互。在Hyper-V中,也有这样的工具。这款工具可以完成更好的鼠标交互,我的..._win10 hyper-v ubuntu18.04 文件拷贝

java静态变量初始化多线程,持续更新中_类初始化一个静态属性 为线程池-程序员宅基地

文章浏览阅读156次。前言互联网时代,瞬息万变。一个小小的走错,就有可能落后于别人。我们没办法去预测任何行业、任何职业未来十年会怎么样,因为未来谁都不能确定。只能说只要有互联网存在,程序员依然是个高薪热门行业。只要跟随着时代的脚步,学习新的知识。程序员是不可能会消失的,或者说不可能会没钱赚的。我们经常可以听到很多人说,程序员是一个吃青春饭的行当。因为大多数人认为这是一个需要高强度脑力劳动的工种,而30岁、40岁,甚至50岁的程序员身体机能逐渐弱化,家庭琐事缠身,已经不能再进行这样高强度的工作了。那么,这样的说法是对的么?_类初始化一个静态属性 为线程池

idea 配置maven,其实不用单独下载Maven的。以及设置新项目配置,省略每次创建新项目都要配置一次Maven_安装idea后是不是不需要安装maven了?-程序员宅基地

文章浏览阅读1w次,点赞13次,收藏43次。说来也是惭愧,一直以来,在装环境的时候都会从官网下载Maven。然后再在idea里配置Maven。以为从官网下载的Maven是必须的步骤,直到今天才得知,idea有捆绑的 Maven 我们只需要搞一个配置文件就行了无需再官网下载Maven包以后再在新电脑装环境的时候,只需要下载idea ,网上找一个Maven的配置文件 放到 默认的 包下面就可以了!也省得每次创建项目都要重新配一次Maven了。如果不想每次新建项目都要重新配置Maven,一种方法就是使用默认的配置,另一种方法就是配置 .._安装idea后是不是不需要安装maven了?

奶爸奶妈必看给宝宝摄影大全-程序员宅基地

文章浏览阅读45次。家是我们一生中最重要的地方,小时候,我们在这里哭、在这里笑、在这里学习走路,在这里有我们最真实的时光,用相机把它记下吧。  很多家庭在拍摄孩子时有一个看法,认为儿童摄影团购必须是在风景秀丽的户外,即便是室内那也是像大酒店一样...

构建Docker镜像指南,含实战案例_rocker/r-base镜像-程序员宅基地

文章浏览阅读429次。Dockerfile介绍Dockerfile是构建镜像的指令文件,由一组指令组成,文件中每条指令对应linux中一条命令,在执行构建Docker镜像时,将读取Dockerfile中的指令,根据指令来操作生成指定Docker镜像。Dockerfile结构:主要由基础镜像信息、维护者信息、镜像操作指令、容器启动时执行指令。每行支持一条指令,每条指令可以携带多个参数。注释可以使用#开头。指令说明FROM 镜像 : 指定新的镜像所基于的镜像MAINTAINER 名字 : 说明新镜像的维护(制作)人,留下_rocker/r-base镜像

随便推点

毕设基于微信小程序的小区管理系统的设计ssm毕业设计_ssm基于微信小程序的公寓生活管理系统-程序员宅基地

文章浏览阅读223次。该系统将提供便捷的信息发布、物业报修、社区互动等功能,为小区居民提供更加便利、高效的服务。引言: 随着城市化进程的加速,小区管理成为一个日益重要的任务。因此,设计一个基于微信小程序的小区管理系统成为了一项具有挑战性和重要性的毕设课题。本文将介绍该小区管理系统的设计思路和功能,以期为小区提供更便捷、高效的管理手段。四、总结与展望: 通过本次毕设项目,我们实现了一个基于微信小程序的小区管理系统,为小区居民提供了更加便捷、高效的服务。通过该系统的设计与实现,能够提高小区管理水平,提供更好的居住环境和服务。_ssm基于微信小程序的公寓生活管理系统

如何正确的使用Ubuntu以及安装常用的渗透工具集.-程序员宅基地

文章浏览阅读635次。文章来源i春秋入坑Ubuntu半年多了记得一开始学的时候基本一星期重装三四次=-= 尴尬了 觉得自己差不多可以的时候 就吧Windows10干掉了 c盘装Ubuntu 专心学习. 这里主要来说一下使用Ubuntu的正确姿势Ubuntu(友帮拓、优般图、乌班图)是一个以桌面应用为主的开源GNU/Linux操作系统,Ubuntu 是基于DebianGNU/Linux,支..._ubuntu安装攻击工具包

JNI参数传递引用_jni引用byte[]-程序员宅基地

文章浏览阅读335次。需求:C++中将BYTE型数组传递给Java中,考虑到内存释放问题,未采用通过返回值进行数据传递。public class demoClass{public native boolean getData(byte[] tempData);}JNIEXPORT jboolean JNICALL Java_com_core_getData(JNIEnv *env, jobject thisObj, jbyteArray tempData){ //resultsize为s..._jni引用byte[]

三维重建工具——pclpy教程之点云分割_pclpy.pcl.pointcloud.pointxyzi转为numpy-程序员宅基地

文章浏览阅读2.1k次,点赞5次,收藏30次。本教程代码开源:GitHub 欢迎star文章目录一、平面模型分割1. 代码2. 说明3. 运行二、圆柱模型分割1. 代码2. 说明3. 运行三、欧几里得聚类提取1. 代码2. 说明3. 运行四、区域生长分割1. 代码2. 说明3. 运行五、基于最小切割的分割1. 代码2. 说明3. 运行六、使用 ProgressiveMorphologicalFilter 分割地面1. 代码2. 说明3. 运行一、平面模型分割在本教程中,我们将学习如何对一组点进行简单的平面分割,即找到支持平面模型的点云中的所有._pclpy.pcl.pointcloud.pointxyzi转为numpy

以NFS启动方式构建arm-linux仿真运行环境-程序员宅基地

文章浏览阅读141次。一 其实在 skyeye 上移植 arm-linux 并非难事,网上也有不少资料, 只是大都遗漏细节, 以致细微之处卡壳,所以本文力求详实清析, 希望能对大家有点用处。本文旨在将 arm-linux 在 skyeye 上搭建起来,并在 arm-linux 上能成功 mount NFS 为目标, 最终我们能在 arm-linux 里运行我们自己的应用程序. 二 安装 Sky..._nfs启动 arm

攻防世界 Pwn 进阶 第二页_pwn snprintf-程序员宅基地

文章浏览阅读598次,点赞2次,收藏5次。00为了形成一个体系,想将前面学过的一些东西都拉来放在一起总结总结,方便学习,方便记忆。攻防世界 Pwn 新手攻防世界 Pwn 进阶 第一页01 4-ReeHY-main-100超详细的wp1超详细的wp203 format2栈迁移的两种作用之一:栈溢出太小,进行栈迁移从而能够写入更多shellcode,进行更多操作。栈迁移一篇搞定有个陌生的函数。C 库函数 void *memcpy(void *str1, const void *str2, size_t n) 从存储区 str2 _pwn snprintf

推荐文章

热门文章

相关标签