第五十九章 Unity 发布Android平台

news2025/2/26 4:46:00

本章节我们讲解如何打包发布到安卓手机平台。要为 Android 构建和运行应用程序,必须安装 Unity Android Build Support 平台模块。还需要安装 Android 软件开发工具包(SDK)和原生开发工具包(NDK)才能在 Android 设备上构建和运行代码。默认情况下,Unity 会安装基于 OpenJDK 的 Java 开发工具包。

在我们使用Unity Hub 安装Unity Editor的时候,就会提示我们是否安装平台编译库。

上面的截图中我们发现了“Android Build Support”勾选项,如果我们的项目需要发布到安卓手机平台的话,就需要勾选此项。那么,Unity就会自动帮我们下载安装SDK,NDK以及OpenJDK了。当然,如果安装的时候没有选择也没有关系,我们可以通过Unity Hub补充安装他们。具体的操作,我们也不再详细介绍了。

Unity的平台编译库目录在“Unity Editor\2020.3.35f1c2\Editor\Data\PlaybackEngines”下

这里我们安装了三个平台:Android,WebGL,Windows

我们进入到“AndoridPlayer”目录中查看

我们可以看到NDK,OpenJDK,SDK三个目录。他们的版本与我们的Unity版本有一些关系。由于我们安装的是Unity2020版本,我们的NDK是r19版本,我们的OpenJDK是1.8版本,SDK里面有29和30两个版本。

如果多个 Unity 版本共享 Android SDK & NDK Tools 和 OpenJDK,则可以在 Unity Preferences 窗口中指定一个共享位置。为此,请在菜单栏选择Edit -> Preferences -> External Tools,并在JDK, SDK 和 NDK 字段中输入对应的安装目录即可。

介绍完编译安卓应用程序的环境配置后,我们来说一下编译安卓应用的一些配置信息。AndroidManifest.xml 是每个android程序中必须的文件,里面包含了应用程序的配置信息。该文件是一个XML格式的配置文件,其根标签是manifest,其下很多的子标签用于配置各种信息,比如application用于整个应用的配置,activity用于配置活动等等。

AndroidManifest.xml的作用是什么?

1.    描述应用的包名:Android设备根据包名来区分不同的APP。

2.    描述应用中的组件:例如Activity,Service,Provider,BroadcastReceiver等组件。

3.    描述应用所需要访问的权限。

另外,安卓应用程序一般都是通过gradle工具来构建的。谷歌官方推出的Android Studio开发工具就是使用gradle,我们的Unity也是使用它。该工具对于每一个应用程序都会生成一个build.gradle文件。在这个文件中,我们会配置应用的包名applicationId,相当应用程序的id。需要我们了解的是compileSdkVersion,minSdkVersion,targetSdkVersion三项的配置。这三项配置都对应了安卓系统的版本。关于安卓系统的版本,大家可以看以下列表。

系统版本           SDK版本    版本名称

Android 11.0      30              (Android 11)

Android 10.0      29              (Android Q)

Android 9.0        28               Pie (Android P)

Android 8.1        27               Oreo(Android O)

Android 8.0        26               Oreo(Android O)(奥利奥)

Android 7.1        25               Nougat(Android N)(牛轧糖)

Android 7.0        24               Nougat(Android N)(牛轧糖)

Android 6.0        23               Marshmallow(Android M)(棉花糖)

Android 5.1        22               Lollipop(Android L)(棒棒糖)

Android 5.0        21               Lollipop(Android L)(棒棒糖)

Android 4.4        19               KITKAT(奇巧巧克力)

Android 11是Google于2020年9月9日正式发布的新的操作系统版本。那么,为什么开发一个安卓应用程序需要配置三个版本呢?由于安卓系统发布比较频繁,且对应的API也随之发生变化。例如:有的API可能会废弃,有的新添加的API等等。那么,这就造成一个问题,我们的应用程序如何在众多版本中稳定的运行。也就是说,我们的应用程序如何才能最大程度的兼容这些不同版本的安卓系统。

首先,compileSdkVersion指定了Grandle要采用哪个版本的Android SDK编译自己的应用程序,应用程序中使用的API级别不得高于编译用的SDK的版本。Google官方建议总是使用最新版的稳定SDK编译自己的应用程序。

其次,minSdkVersion就是应用程序可以运行的最低系统版本要求。在低于minSdkVersion的Android系统上无法安装此应用程序的。在开发阶段,如果你使用了低于minSdkVersion的API,开发工具就会发出警告。对于minSdkVersion的选择,我们应该看各个api的用户使用占比。一般说来我们适配4.4以上,即minSdkVersion=19,不过还要根据自己的实际情况,去选择相应的版本号。

说白了,我们使用SDK API的时候,需要介于minSdkVersion和compileSdkVersion之间。但是,如果我们使用的手机系统高于compileSdkVersion的话,我们的APP就不能安装运行了嘛?肯定不是的,但是某些行为可能会不同。这就涉及到targetSdkVersion的设置。

最后,targetSdkVersion目标SDK版本。targetSdkVersion理解起来要稍微比compileSdkVersion和minSdkVersion困难一些。当你设置了targetSdkVersion的时候,表示你已经充分测试过了你的应用程序在该目标版本的运行情况。targetSdkVersion 是 Android 系统提供前向兼容的主要手段。这是什么意思呢?随着 Android 版本的升级,它的某个的 API的行为可能会发生改变,但是为了保证我们应用程序的行为还是和以前兼容。只要 targetSdkVersion设置不变,即使这个应用程序安装在新Android 系统上,其行为还是保持老的系统上的行为,这样就保证了系统对老应用的向前兼容性。当然,新的系统(大于targetSdkVersion)就会表现新的API行为。因此,作为一名开发者,应该特别注意安卓系统版本更新时的API变化。因此,我们开发安卓应用程序的时候,尽量使用一些基础稳定的API来实现功能,这样即使一个老版本的应用程序放在几年后的Android新设备上依然能顺利运行。

但是对于一些新增加的API,我们就必须在新的安卓版本中才能使用。比如我们当前Andorid 9.0(SDK=28),Android 10(SDK=29) 新增了有关5G的API。我们的应用程序想要使用5G相关的API,这时只需要将compileSdkVersion设置为29版本,就能在编译阶段编译通过。此外,还需要注意的是,由于这个5G API是新增的,因此需要判断当前系统版本>=29才能使用新API,否者是不能够使用的(低于29版本的安卓系统上)。

综合来看,三者的关系是:minSdkVersion <= targetSdkVersion <= compileSdkVersion

并且建议 targetSdkVersion和compileSdkVersion一样。

那么,在Unity中如何设置compileSdkVersion,minSdkVersion,targetSdkVersion三者呢?我们点击菜单:Edit -> Project Settings -> Player,选择 Android 平台,然后在 Other Settings -> Identification 面板中就能找到了。

 

我们发现了minSdkVersion和targetSdkVersion两个项目设置,没有发现compileSdkVersion的设置。请大家注意的是,Unity的设置里默认targetSdkVersion = compileSdkVersion的。我们根据上面的截图显示,最小版本为 Android4.4(SDK=19),而目标编译版本为“Automatic”。也就是我们安装的SDK中的最高版本。我们之前提到过,Unity2020默认安装的是安卓版本是有29和30两个版本。那么,这里就非常明显了,目标编译版本就是30这个版本。也就是当下谷歌发布的最新的安卓系统版本。以上内容,我们了解就可以了。

接下来,我们就开始将我们的“TouchDemo”工程打包发布安卓应用程序。

这个3D模式下的场景内容

这是2D模式下的UI内容。

在这个工程中,我们给主相机添加了MoveScript脚本。

接下来,我们双击打开这个MoveScript脚本,修改如下

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MoveScript : MonoBehaviour
{

    // 立方体游戏对象
    public Transform cube;

    // 立方体移动速度
    private float speed = 2.0f;

    public void OnMoveTest(Vector2 v)
    {
        // 摇杆输入
        float horizontal = v.x;
        float vertical = v.y;

        // 物体位置变化
        Vector3 position = cube.position;
        position.x += speed * horizontal * Time.deltaTime;
        position.z += speed * vertical * Time.deltaTime;

        // 更新物体位置
        cube.position = position;
    }
}

修改完毕之后,我们在回到主相机的Inspector检视面板中,

我们将Hierarchy层次面板中的Cube拖拽到上图检视面板MoveScript脚本下的Cube处。说白了,我们就是想使用模拟摇杆来控制Cube移动。我们可以Play查看效果。

接下来,我们就将该工程打包到Android平台下。首先,我们点击菜单栏File -> Build Settings,然后弹出的窗口左侧选择“Android”平台。如果我们之前选择了其他平台,我们就需要再点击右下角的“Switch Platform”切换平台。

 

平台切换完毕后,我们点击左下角的“Player Settings”按钮

这里我们设置公司名称,应用名称以及启动图标。

Unity打包Android安装包的时候,在Resolution and Presentation -> Default Orientation选项中可以设置游戏的横竖屏显示以及是否允许旋转方向。默认方向:Auto Rotation(自动旋转)。

它的所有选项如下所示:

1. Portrait:竖屏

2. Portrait Upside Down:竖屏,手机倒过来

3. Landscape Right:横屏,屏幕在home键右边

4. Landscape Left:横屏,屏幕在home键左边(比较常用)

5. Auto Rotation:自动旋转屏幕

这里,我们选择一个Landscape Left吧。

然后我们继续展开“Other Settings”

然后找到 Identification 项目

这里我们只修改安卓应用程序的包名即可。Unity要求包名的格式为:包名称必须遵循约定“com.YourCompanyName.YourProductName”,并且只能包含字母数字和下划线字符。其中,YourCompanyName和YourProductName基本上已经锁定了。所以,这里基本不用改动。最后我们关闭当前窗口,回到Build Settings窗口,点击右下角的“Build”按钮打包发布了。

选择一个存储目录(E:\workspace\TouchDemo),起名为“TouchDemo.apk”,然后点击保存。

 

开始打包发布中,等待一段时间后就打包完成了,我们去“E:\workspace\TouchDemo”查看

我们将这个APP的安装包发给手机(也可以使用模拟器测试)上面安装就可以了。

 

 

 

 

这是运行后的效果,可以借助“摇杆”来控制Cube移动。

本课程涉及的内容已经共享到百度网盘:https://pan.baidu.com/s/1e1jClK3MnN66GlxBmqoJWA?pwd=b2id

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/520816.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【UDS】ISO15765-2之诊断时间参数

文章目录 简介分类1. P2client2. P2server3. P2*client4. P2*server5. S3client5. S3server 总结 ->返回总目录<- 简介 诊断层包含六种定时器时间参数&#xff1a;P2client, P2client, P2server, P2server, S3client, S3server。 相对来说&#xff0c;比较好理解。就是…

Unity的UGUI避免行的开头出现符号

一、遇到问题 大家好&#xff0c;我是阿赵。最近在游戏过版署的时候&#xff0c;修改意见里面有一条&#xff0c;游戏内部分文本内容中有标点符号出现在行首的问题。 一般来说&#xff0c;我们编辑文本的时候&#xff0c;是会注意不要把标点符号在换行的时候刚好出现的在行首的…

从学校到职场:在阿里的这7年

简介&#xff1a; 本文不仅希望能给一些初入职场的同学一些思考&#xff0c;也是通过自己阿里7年的总结&#xff0c;对自己未来的一种期望&#xff0c;也希望自己未来再遇到槽糕的处境迷茫的时候&#xff0c;可以回看下自己的心路历程&#xff0c;并做出更理性的选择。 引言&a…

软件测试基础知识整理(二) - 常用dos命令、服务器和域名

目录 一、常用dos命令 二、服务器和域名 2.1 网站上线的基本条件 2.1.1 域名 2.1.2 空间、服务器、云存储 一、常用dos命令 Win R 打开运行窗口&#xff0c;输入cmd即可进入命令行窗口 常用命令作用举例ipconfig/all查看IP的主机信息&#xff0c;DNS信息&#xff0c;物理…

高效理解机器学习

对于初学者来说&#xff0c;机器学习相当复杂&#xff0c;可能很容易迷失在细节的海洋里。本文通过将机器学习算法分为三个类别&#xff0c;梳理出一条相对清晰的路线&#xff0c;帮助初学者理解机器学习算法的基本原理&#xff0c;从而更高效的学习机器学习。原文: Machine Le…

《设计模式》访问者模式

《设计模式》访问者模式 定义&#xff1a; 访问者模式用于封装一些作用于某种数据结构中的各元素的操作&#xff0c;将数据结构和数据操作分离&#xff0c;它可以在不改变这个数据结构的前提下定义作用于这些元素的新操作。属于行为型模式。 访问模式的角色组成&#xff1a; …

基本数据类型不一定存储在栈中,是不是颠覆了你的认知

大家好&#xff0c;我是三叔&#xff0c;很高兴这期又和大家见面了&#xff0c;有很多小伙伴问我&#xff0c;基本数据类型一定在栈内存中吗&#xff1f;网上答案也是五花八门&#xff0c;部分读者都有被误导过&#xff0c;基本数据类型不一定在栈内存中&#xff01; 虽然基本…

使用Lychee荔枝图床+cpolar内网穿透快速搭建稳定的私人图床【无需公网IP】

文章目录 1.前言2. Lychee网站搭建2.1. Lychee下载和安装2.2 Lychee网页测试2.3 cpolar的安装和注册 3.本地网页发布3.1 Cpolar云端设置3.2 Cpolar本地设置 4.公网访问测试5.结语 1.前言 图床作为图片集中存放的服务网站&#xff0c;可以看做是云存储的一部分&#xff0c;既可…

【Linux内核解析-linux-5.14.10-内核源码注释】自旋锁spinlock机制

自旋锁 Note: 在使用自旋锁时应该避免长时间持有锁&#xff0c;否则可能会导致其他线程或进程无法访问共享资源。因此&#xff0c;建议将锁的持有时间尽量缩短&#xff0c;以提高系统的并发性能。 Linux中的自旋锁机制是一种用于同步多个线程或进程访问共享资源的技术。当一个…

一分钟图情论文:《公共图书馆法》视域下的馆员知识与能力体系探究

一分钟图情论文&#xff1a;《公共图书馆法》视域下的馆员知识与能力体系探究 在公共服务体系建设过程中&#xff0c;图书馆建设是十分关键地一环&#xff0c;在图书馆建设过程中又以图书馆员队伍的建设首当其冲。在当今复杂的信息环境下&#xff0c;我们该如何培养图书馆员&a…

语言与专业的奇迹:如何利用ChatGPT优化跨国贸易

贸易公司&#xff0c;在进行跨国贸易时&#xff0c;往往需要面对不同国家的甲方或者乙方&#xff0c;在与之沟通的过程中&#xff0c;语言和专业是必须要过的一关&#xff0c;顺畅的交流&#xff0c;往往会带来更好的收益。 今天以“茶”为例&#xff0c;给大家介绍一“知否AI…

Nacos 服务网格2

博主介绍&#xff1a;✌全网粉丝4W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战、定制、远程&#xff0c;博主也曾写过优秀论文&#xff0c;查重率极低&#xff0c;在这方面…

cam_lidar_calibration标定速腾激光雷达和单目相机外参

目录 一、资源链接二、代码测试2.1安装依赖2.2代码下载和修改2.2.1 optimiser.h文件2.2.2 feature_extractor.h文件 2.3编译代码2.4测试数据集2.4.1迭代计算2.4.2查看校准结果 三、标定自己激光雷达和相机3.1修改代码3.1.1camera_info.yaml配置文件3.1.2params.yaml配置文件3.1…

跳槽,如果没有更好的选择,可以去美团试试···

在美团干了半年&#xff0c;说一下自己的感受&#xff0c;美团是一家福利中等&#xff0c;工资待遇中上&#xff0c;高层管理团队强大&#xff0c;加班强度一般&#xff0c;技术不错&#xff0c;办公环境一般&#xff0c;工作氛围中上&#xff0c;部门差距之间工作体验差距巨大…

阿里巴巴官方上线!号称国内Java八股文天花板(终极版)首次开源

铜三铁四已经结束了&#xff0c;但还是有很多Java程序员没有找到工作或者成功跳槽&#xff0c;跳槽成功的也只是从一个坑中&#xff0c;跳入另一个坑中…… 在LZ看来&#xff0c;真正有意义的就业与跳槽&#xff0c;是要进入到一个有绝对潜力的行业或者薪资能实现爆炸式增长的。…

Science Advances:宋艳课题组发现经颅近红外激光刺激可提升人类工作记忆

图1. 新闻稿封面 工作记忆——在几秒钟内主动“记住”有用信息的能力——在许多高级认知活动中起着至关重要的作用。由于工作记忆能力的个体差异可以预测流体智力和广泛的认知功能&#xff0c;这使得提高工作记忆能力成为干预和增强的有吸引力的目标。 美国食品及药品管理局声…

SpringSecurity 一文彻底掌握

文章目录 前言一、SpringSecurity Web方案&#x1f353;Test Controller 测试请求控制器&#x1f923;SpringSecurity 基本原理&#x1f30d;代码底层流程&#xff1a;重点看三个过滤器FilterSecurityInterceptor 方法级的权限过滤器ExceptionTranslationFilter 异常过滤器User…

智能玩具机器人语音识别方案——NRK3301离线语音IC

机器人玩具已经成为儿童玩具和教育用品的主流&#xff0c;它不仅能充分激发和满足了儿童消费群体的好奇心&#xff0c;同时还能强化了消费群体和玩具的互动体验。 机器人玩具主要是通过语音识别技术&#xff0c;让我们可以与玩具对话&#xff0c;可以用语音对玩具发出命令&…

ENVI实现基于像元方法的栅格图像镶嵌拼接(所有图像无需地理信息)

本文介绍基于ENVI软件&#xff0c;利用“Pixel Based Mosaicking”工具实现栅格遥感影像镶嵌拼接的方法。 首先需要说明的是&#xff0c;本文需要镶嵌的遥感影像并不含地理参考信息&#xff0c;因此仅可以使用ENVI中的“Pixel Based Mosaicking”工具&#xff08;该工具可以对…

SpringMVC简介、请求与响应、REST风格、SSM整合、拦截器

目录 SpringMVC简介 SpringMVC概述 入门案例 入门案例工作流程分析 Controller加载控制 PostMan 请求与响应 设置请求映射路径 五种类型参数传递 JSON数据传输参数 JSON对象数据 JSON对象数组 日期类型参数传递 响应 REST风格 REST风格简介 RESTful入门案例…