U
章 05导出到手机7 课 — 点击打开
02 / 07 · 9 分钟
导出到手机

关键的 Player Settings

到目前为止的项目

Assets/

link.xml

Scripts/

MobileBoot.cs

项目设置

Android moduleplatform switchpackage nameIL2CPP + ARM64

你已经有的这一课新增

你在 tab 03 搭的那个触控 canvas,正是这一 tab 重要的原因:屏幕方向、安全区和 CPU 架构这几项设置没配对,Knight 的操作按钮就不会长在拇指够得着的地方。

Player Settings 里差不多有二百个选项,其中十二个决定了你的 build 能不能跑、能不能发、能不能过审。

动态图解

屏幕方向和安全区,决定了你的 UI 到了真机上能不能活下来。

身份信息 —— 第一次 build 之前就配好

  1. 1

    Edit▸Project Settings▸Player,设置 Company Name 和 Product Name。

  2. 2

    Other Settings → Package Name 填 com.yourstudio.yourgame。这个是永久的 —— Google Play 永远靠它来认你的应用。

  3. 3

    Version 填 1.0.0,Bundle Version Code 填 1。每次上传都要把 code 加 1;重复的号码 Play 会直接拒收。

  4. 4

    应用图标在 Icon → Adaptive 里设置。Android 要一个前景层加一个背景层,不是一张平的图片。

分辨率与显示设置

  • Default Orientation 选 Landscape Left,或者 Portrait。只有一种朝向合理却还开着 Auto Rotation,只会让玩家烦躁。

  • Render Outside Safe Area 保持勾选,让游戏铺满整屏,然后 UI 里用 Screen.safeArea 来处理 Notch。

  • 只有真的看到卡顿时才去掉 Optimized Frame Pacing 的勾;在大多数机器上它是有帮助的。

Other Settings —— 专门搞坏 build 的那一组

  1. 1

    Scripting Backend 选 IL2CPP。64-bit 下 Play Store 不允许用 Mono,而且 IL2CPP 本来就快得多。

  2. 2

    Target Architectures 把 ARMv7 和 ARM64 都勾上。ARM64 是必须的,ARMv7 用来覆盖老机型。

  3. 3

    Minimum API Level 设 23 或 24(Android 6–7)几乎就能覆盖所有用户。Target API Level → Automatic(highest installed)。

  4. 4

    Managed Stripping Level 选 Medium。High 剥得更狠,但会把只能通过 reflection 访问的代码也一起删掉。

  5. 5

    Graphics APIs 里去掉 Auto,把 Vulkan 排第一、OpenGLES3 排第二。OpenGLES2 整个删掉。

Assets/link.xml
<linker>
  <assembly fullname="Assembly-CSharp">
    <type fullname="SaveData" preserve="all" />
    <namespace fullname="Game.Data" preserve="all" />
  </assembly>
</linker>

选 APK 还是 AAB?

✓ APK

就一个文件,拷到手机上就能直接装。整个开发过程都用它。

✓ AAB (App Bundle)

Google Play 强制要求这个。Google 会用它给每台机型单独生成 APK,所以下载包更小。

帧率 —— Unity 不会替你操心

MobileBoot.cs — attach to an object in your first scene
using UnityEngine;

public class MobileBoot : MonoBehaviour
{
    void Awake()
    {
        // mobile defaults to 30 fps unless you say otherwise
        Application.targetFrameRate = 60;

        // VSync must be off for targetFrameRate to be respected
        QualitySettings.vSyncCount = 0;

        // stop the screen dimming during gameplay
        Screen.sleepTimeout = SleepTimeout.NeverSleep;

        DontDestroyOnLoad(gameObject);
    }
}