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

智能推荐

while循环&CPU占用率高问题深入分析与解决方案_main函数使用while(1)循环cpu占用99-程序员宅基地

文章浏览阅读3.8k次,点赞9次,收藏28次。直接上一个工作中碰到的问题,另外一个系统开启多线程调用我这边的接口,然后我这边会开启多线程批量查询第三方接口并且返回给调用方。使用的是两三年前别人遗留下来的方法,放到线上后发现确实是可以正常取到结果,但是一旦调用,CPU占用就直接100%(部署环境是win server服务器)。因此查看了下相关的老代码并使用JProfiler查看发现是在某个while循环的时候有问题。具体项目代码就不贴了,类似于下面这段代码。​​​​​​while(flag) {//your code;}这里的flag._main函数使用while(1)循环cpu占用99

【无标题】jetbrains idea shift f6不生效_idea shift +f6快捷键不生效-程序员宅基地

文章浏览阅读347次。idea shift f6 快捷键无效_idea shift +f6快捷键不生效

node.js学习笔记之Node中的核心模块_node模块中有很多核心模块,以下不属于核心模块,使用时需下载的是-程序员宅基地

文章浏览阅读135次。Ecmacript 中没有DOM 和 BOM核心模块Node为JavaScript提供了很多服务器级别,这些API绝大多数都被包装到了一个具名和核心模块中了,例如文件操作的 fs 核心模块 ,http服务构建的http 模块 path 路径操作模块 os 操作系统信息模块// 用来获取机器信息的var os = require('os')// 用来操作路径的var path = require('path')// 获取当前机器的 CPU 信息console.log(os.cpus._node模块中有很多核心模块,以下不属于核心模块,使用时需下载的是

数学建模【SPSS 下载-安装、方差分析与回归分析的SPSS实现(软件概述、方差分析、回归分析)】_化工数学模型数据回归软件-程序员宅基地

文章浏览阅读10w+次,点赞435次,收藏3.4k次。SPSS 22 下载安装过程7.6 方差分析与回归分析的SPSS实现7.6.1 SPSS软件概述1 SPSS版本与安装2 SPSS界面3 SPSS特点4 SPSS数据7.6.2 SPSS与方差分析1 单因素方差分析2 双因素方差分析7.6.3 SPSS与回归分析SPSS回归分析过程牙膏价格问题的回归分析_化工数学模型数据回归软件

利用hutool实现邮件发送功能_hutool发送邮件-程序员宅基地

文章浏览阅读7.5k次。如何利用hutool工具包实现邮件发送功能呢?1、首先引入hutool依赖<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.7.19</version></dependency>2、编写邮件发送工具类package com.pc.c..._hutool发送邮件

docker安装elasticsearch,elasticsearch-head,kibana,ik分词器_docker安装kibana连接elasticsearch并且elasticsearch有密码-程序员宅基地

文章浏览阅读867次,点赞2次,收藏2次。docker安装elasticsearch,elasticsearch-head,kibana,ik分词器安装方式基本有两种,一种是pull的方式,一种是Dockerfile的方式,由于pull的方式pull下来后还需配置许多东西且不便于复用,个人比较喜欢使用Dockerfile的方式所有docker支持的镜像基本都在https://hub.docker.com/docker的官网上能找到合..._docker安装kibana连接elasticsearch并且elasticsearch有密码

随便推点

Python 攻克移动开发失败!_beeware-程序员宅基地

文章浏览阅读1.3w次,点赞57次,收藏92次。整理 | 郑丽媛出品 | CSDN(ID:CSDNnews)近年来,随着机器学习的兴起,有一门编程语言逐渐变得火热——Python。得益于其针对机器学习提供了大量开源框架和第三方模块,内置..._beeware

Swift4.0_Timer 的基本使用_swift timer 暂停-程序员宅基地

文章浏览阅读7.9k次。//// ViewController.swift// Day_10_Timer//// Created by dongqiangfei on 2018/10/15.// Copyright 2018年 飞飞. All rights reserved.//import UIKitclass ViewController: UIViewController { ..._swift timer 暂停

元素三大等待-程序员宅基地

文章浏览阅读986次,点赞2次,收藏2次。1.硬性等待让当前线程暂停执行,应用场景:代码执行速度太快了,但是UI元素没有立马加载出来,造成两者不同步,这时候就可以让代码等待一下,再去执行找元素的动作线程休眠,强制等待 Thread.sleep(long mills)package com.example.demo;import org.junit.jupiter.api.Test;import org.openqa.selenium.By;import org.openqa.selenium.firefox.Firefox.._元素三大等待

Java软件工程师职位分析_java岗位分析-程序员宅基地

文章浏览阅读3k次,点赞4次,收藏14次。Java软件工程师职位分析_java岗位分析

Java:Unreachable code的解决方法_java unreachable code-程序员宅基地

文章浏览阅读2k次。Java:Unreachable code的解决方法_java unreachable code

标签data-*自定义属性值和根据data属性值查找对应标签_如何根据data-*属性获取对应的标签对象-程序员宅基地

文章浏览阅读1w次。1、html中设置标签data-*的值 标题 11111 222222、点击获取当前标签的data-url的值$('dd').on('click', function() { var urlVal = $(this).data('ur_如何根据data-*属性获取对应的标签对象

推荐文章

热门文章

相关标签