第五十九章 Unity 发布Android平台

本章节我们讲解如何打包发布到安卓手机平台。要为 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

猜你喜欢

转载自blog.csdn.net/konkon2012/article/details/130654985