Unity 和 Google Play 游戏电脑版使用入门

1. 简介

Google Play Games 徽标

上次更新时间:2022 年 10 月 18 日

如何为 Google Play 游戏电脑版准备游戏?

借助 Google Play 游戏,您可以轻松将手游移植到 Windows PC。这意味着,您无需重新设计游戏或重新设计业务模式,即可提高玩家互动度和扩大受众群体。不过,您仍需进行一些更改,才能为新 PC 玩家提供尽可能出色的体验。

学习内容

此 Codelab 涵盖了要求核对清单的基本部分,可帮助您让游戏顺利起步,并帮助您为 Google Play 游戏电脑版准备自己的 Unity 游戏。更深入的集成(例如 Play 游戏登录和 Play Integrity API)不在本文档的讨论范围内。

  • 如何从 Unity 构建 x86 架构。
  • 如何测试并部署到 Google Play 游戏模拟器。
  • 如何修改界面,使其在 PC 上呈现出惊艳的效果。
  • 如何检测游戏是否在 Google Play 游戏模拟器中运行,并相应地调整游戏。

所需条件

2. 进行设置

打开或创建新项目

  1. 使用 2D Platformer Microgame 创建新项目,或打开您自己的项目。

Unity

  1. 在项目中,选择 File -> Build Settings,并检查您是否已设置为构建 Android 应用。

Unity 屏幕截图

3. 准备 Google Play 游戏模拟器

首先,下载模拟器

安装完成后,您应该会在窗口中看到 Android 桌面:

Google Play 游戏模拟器窗口的屏幕截图。Android 主屏幕可见。

这是一个功能齐全的高性能 Android 环境,适合游戏开发。它应在 Android 调试桥 (adb) 中显示为 localhost 上的设备:

❯ adb devices
List of devices attached
localhost:6520  device

您需要使用最新版本的 adb 才能检测到模拟器。与 Android Studio 捆绑的版本可以正常运行,但 Unity 随附的 adb 可能无法正常运行。模拟器捆绑了兼容的版本,您可以在 C:\Program Files\Google\Play Games Developer Emulator\current\emulator 中找到它。为了获得最佳的开发者体验,您可能需要安装 Android Studio 并使用它来管理 Android SDK。

如果模拟器与 adb 断开连接,请通过命令行重新连接,如下所示:

adb connect localhost:6520

4. 配置 Unity 以直接构建并部署到模拟器(可选)

Unity 随附的 adb 版本可能与模拟器不兼容。为确保设备已连接,请依次选择 File -> Build Settings,然后检查 Run Device 对话框中是否列出了该设备。

在

根据您的项目、构建流程和舒适度,您可以选择配置 Unity 以直接部署到 Google Play 游戏模拟器,也可以构建 APK 并使用 adb install 手动部署。手动部署所需的更改最少,但可能会减慢迭代周期。

通过以下两个步骤直接部署到模拟器:

  1. 将 Unity 配置为使用其他 Unity SDK,最好是 Android Studio 安装的 SDK。
  2. 更新了 build tools 版本,以解决 Unity 中的 bug

由于 Unity 随附的 Android SDK 版本可能无法检测到模拟器,因此您可以使用 Android Studio 安装更新近的 SDK。

  1. 打开 Android Studio,然后依次选择 Edit -> Preferences -> External Tools
  2. 取消选中 Android SDK Tools Installed with Unity,然后提供 Android Studio 安装路径(通常为 AppData/Local/Android/sdk)。请勿更改 Android NDK 选项。

Android Studio 中

刷新已连接的设备时,您应该会在 build 窗口中看到 Google HPE device (localhost:6520)

屏幕截图

根据此 bug 的状态和您的 Unity 版本,您可能还需要更改 build tools 版本。为此,请检查您是否正在生成 mainTemplate.gradlelauncherTemplate.gradle

  1. 打开 Project Settings 窗口,前往 Player Settings,然后找到 Publishing Settings 部分。
  2. 向下滚动到 Build 选项,然后选中“Custom Main Gradle Template”和“Custom Launcher Gradle Template”,这将在 Assets\Plugins\Android\ 下生成这两个 Gradle 文件。

屏幕截图

  1. 将字符串 **BUILDTOOLS** 的所有实例替换为 30.0.0。在这两个文件中,相应部分的代码现在应如下所示:
android {
    compileSdkVersion **APIVERSION**
    buildToolsVersion '30.0.0'

5. 部署到 Chromebook(可选)

您可以使用 ChromeOS 设备开始为 Google Play 游戏 开发游戏,而无需访问 Google Play 游戏 模拟器。与 Google Play 游戏电脑版类似,Chromebook 配备键盘和鼠标,拥有大屏幕,并提供 x86 配置。我们将在 Chromebook 上使用 Android Logcat Unity 插件。

  1. 打开软件包管理器,然后在 Unity Registry 下搜索 Android Logcat

显示了以下内容的软件包管理器窗口

您还需要配置 Chromebook 以进行 Android 开发。首先,启用 Linux。

  1. 依次选择“设置”->“开发者”->“Linux”。

动画图片:展示如何启用 Linux 支持。在“设置”窗口中选择“开发者”。然后

然后启用 ADB 调试。

  1. 依次选择设置 -> 开发者 -> Linux 开发环境 -> 开发 Android 应用 -> 启用 ADB 调试

已从“开发者”菜单中启用 ADB 调试。

您还需要获取 Chromebook 的 IP 地址。最简单的方法是

  1. 点击网络信息图标,获取 Chromebook 的 IP 地址。

Chromebook 上打开的网络窗口的屏幕截图。

点击了网络信息按钮,显示 IP 地址。

  1. 选择 Window -> Analysis -> Android Logcat 以打开 Android Logcat 窗口。

在 Unity 中打开的“窗口”>“分析”

  1. 打开设备列表。如果目前未连接任何设备,该列表可能会显示 No Device

显示 Android Logcat 窗口,并选择设备下拉菜单。

  1. 点击其他连接选项,然后输入 Chromebook 的 IP 地址。

“其他连接”窗口打开。输入 IP 地址。

  1. 点击连接。您应该会看到一个成功窗口:

系统会显示一个对话框,提示

您的 Chromebook 现在会显示在 Unity 的“运行设备”列表中(您可能需要先刷新屏幕):

Unity

现在,您可以将游戏部署到 Chromebook,并在类似 PC 的硬件上开始测试和开发。

6. 部署测试 build

Google Play 游戏要求您部署游戏的 x86 版本,这是它在桌面 PC 上达到性能基准的方式之一。所有 LTS 版本的 Unity 都可以生成与 x86 和 x86-64 兼容的 Android build(标记为“ChromeOS”),而 Unity 版本 2018 及更早版本可以生成 x86 build。如需解锁这些架构,您首先需要切换到 IL2CPP 脚本后端,这可能是您在生产环境中为支持 arm64 而已采取的措施。

  1. 选择 File -> Build Settings 以打开“Build Settings”窗口,然后点击 Player Settings

屏幕截图

  1. 前往其他设置部分,并将 Scripting Backend 切换为 IL2CPP

屏幕截图

您还应启用 x86 或 x86-64 支持。如需在 Google Play 游戏平台上发布游戏,您只需支持 x86,不过我们建议您支持 x86-64。

“玩家设置”的“配置”部分的屏幕截图

Unity 捆绑的Frame Pacing库版本也与 Google Play 游戏 不兼容,会导致游戏在启动时崩溃。

  1. 如需在 Player Settings 窗口中停用帧步调,请打开 Resolution and Presentation 部分,然后取消选中 Optimized Frame Pacing

屏幕截图

现在,您已准备好进行构建!

  1. 再次打开 Build Settings 窗口,然后点击 Build And Run。您的游戏会显示在模拟器窗口中。

Google Play 游戏模拟器的屏幕截图,其中显示了

如果您无法部署游戏,请检查“运行设备”列表中是否显示“Google HPE 设备 (localhost:6520)”。如果缺少该文件,请确保 HPE_Dev 正在运行,并且您可以看到 Android 主屏幕。如果该设备仍未显示在设备列表中,请使用您正在使用的确切 adb.exe 运行 adb connect localhost:6520。如果您使用 Android Logcat Unity 插件,请选择 Tools -> Open Terminal 以打开一个终端,该终端指向与 adb.exe Unity 正在使用的目录相同的目录。

屏幕截图“打开终端”突出显示" style="width: 624.00px" src="img/9101ce3c95fb1aa2.png" srcset="img/9101ce3c95fb1aa2_36.png 36w, img/9101ce3c95fb1aa2_48.png 48w, img/9101ce3c95fb1aa2_72.png 72w, img/9101ce3c95fb1aa2_96.png 96w, img/9101ce3c95fb1aa2_480.png 480w, img/9101ce3c95fb1aa2_720.png 720w, img/9101ce3c95fb1aa2_856.png 856w, img/9101ce3c95fb1aa2_960.png 960w, img/9101ce3c95fb1aa2_1440.png 1440w, img/9101ce3c95fb1aa2_1920.png 1920w, img/9101ce3c95fb1aa2_2880.png 2880w" sizes="(max-width: 840px) 100vw, 856px">

7. 让游戏适应 PC

如果可以,请尝试根据与平台无关的指标或某些功能的存在情况对游戏进行任何更改。例如,Android 玩家可以连接鼠标和键盘或插入显示器,因此,根据设备配置更改控制方案或 HUD 元素可让您在所有受支持的平台上利用 Google Play 游戏电脑版。

如果需要根据玩家是否在 Google Play 游戏或 ChromeOS 中来更改逻辑,此脚本可通过检查 HPE_EXPERIENCE 系统功能来帮助您检测到这一点:

using UnityEngine;

public class GoogleDeviceUtilities
{
#if UNITY_ANDROID && !UNITY_EDITOR
    private static AndroidJavaObject PackageManager
    {
        get
        {
            var unityPlayerClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            var currentActivity = unityPlayerClass.GetStatic<AndroidJavaObject>("currentActivity");
            return currentActivity.Call<AndroidJavaObject>("getPackageManager");
        }
    }

    public static bool IsChromeOS => PackageManager.Call<bool>("hasSystemFeature", "org.chromium.arc");

    public static bool IsGooglePlayGames =>
        PackageManager.Call<bool>("hasSystemFeature", "com.google.android.play.feature.HPE_EXPERIENCE");

    public static bool HasKeyboard
    {
        get
        {
            var unityPlayerClass = new AndroidJavaClass("com.unity3d.player.UnityPlayer");
            var currentActivity = unityPlayerClass.GetStatic<AndroidJavaObject>("currentActivity");
            var resources = currentActivity.Call<AndroidJavaObject>("getResources");
            var configuration = resources.Call<AndroidJavaObject>("getConfiguration");
            var keyboard = configuration.Get<int>("keyboard");
            return keyboard == 2; // Configuration.KEYBOARD_QWERTY
        }
    }
#else
    public static bool IsChromeOS => false;
    public static bool IsGooglePlayGames => false;
    public static bool HasKeyboard => true;
#endif
}

PC 的显示屏比典型的 Android 手机大。如果可能,我们建议 HUD 占用的屏幕空间不超过 20%。由于许多移动游戏都使用“随屏幕尺寸缩放”,因此将此设置更改为“恒定物理尺寸”或“恒定像素尺寸”是实现此目标的第一步。

屏幕截图

如果您检测到自己正在 Google Play 游戏 中运行,可能还想在运行时使用 QualitySettings.SetQualityLevel 命令动态设置质量设置。Google Play 游戏模拟器使用 ANGLE 从 OpenGL Unity 发出的指令中发出原生 DirectX 或 Vulkan 命令,因此您可能会获得比移动游戏 build 更高的图形保真度。

8. 输入处理

在 Google Play 游戏 上发布的游戏应围绕鼠标和键盘输入进行构建。您需要规划如何使用鼠标和键盘与游戏互动,因此请立即花时间获取 Input SDK unitypackage。如果您在该页面上没有看到下载内容,请确保您登录的账号属于 play-mp-libs 群组。

出于测试目的,许多游戏会构建基本的鼠标和键盘控制,以便在编辑器中进行开发。如果可能,您可能需要在 ChromeOS 设备上或在 Google Play 游戏模拟器中运行时启用这些功能。

默认情况下,Google Play 游戏和 ChromeOS 会将鼠标输入转换为模拟触控。如果您使用 Input.GetTouchInput.touchCount,游戏会继续按预期运行。如果您依赖多点触控输入(例如双拇指控制或双指张合缩放),则需要将相应操作映射到按键。您还应将游戏内操作映射到按键,例如按 i 打开物品栏、按 escape 关闭对话框,以及按 enter 发送游戏内消息。

2D 平台游戏微游戏使用箭头键移动,使用空格键跳跃。如果您使用的是自己的游戏,请确保您已设置好所需的按键绑定,以便进行下一步操作。

9. 输入 SDK 集成

现在,您已设置好鼠标和键盘控件,接下来需要添加输入 SDK 支持。这有助于玩家通过便捷的弹出式窗口发现您的 PC 输入:

  1. 将 SDK 导入到您的项目后,创建一个名为 InputMappingProviderBehaviour.cs 的文件并添加以下内容:
using System.Collections.Generic;
using Google.Play.InputMapping;
using UnityEngine;
using Input = Google.Play.InputMapping.Input;

public class InputMappingProviderBehaviour : MonoBehaviour
{
    private void Start()
    {
        Input.GetInputMappingClient().RegisterInputMappingProvider(new MyInputMappingProvider());
    }

    private class MyInputMappingProvider : InputMappingProvider
    {
        public InputMap OnProvideInputMap()
        {
            return new InputMap
            {
                InputGroups = new List<InputGroup> { },
                MouseSettings = new MouseSettings
                {
                    InvertMouseMovement = false,
                    AllowMouseSensitivityAdjustment = false
                }
            };
        }
    }

    private enum ActionIds
    {
    }
}
  1. 现在,请在 ActionIds 中填写您在游戏中使用的操作列表。对于 2D 平台游戏微游戏,动作包括“向左”“向右”和“跳跃”:
private enum ActionIds
{
    Left,
    Right,
    Jump
}
  1. OnProvideInputMap 中,为每个操作创建一个 InputAction。为此,您需要操作名称、输入,然后是与该操作绑定的鼠标按钮或键码。对于示例游戏:
var leftAction = new InputAction
{
    ActionLabel = "Walk Left",
    UniqueId = (int)ActionIds.Left,
    InputControls = new InputControls
    {
        AndroidKeycodes = new[]
        {
            AndroidKeyCode.KEYCODE_DPAD_LEFT
        }
    }
};

var rightAction = new InputAction
{
    ActionLabel = "Walk Right",
    UniqueId = (int)ActionIds.Right,
    InputControls = new InputControls
    {
        AndroidKeycodes = new[]
        {
            AndroidKeyCode.KEYCODE_DPAD_RIGHT
        }
    }
};

var jumpAction = new InputAction
{
    ActionLabel = "Jump",
    UniqueId = (int)ActionIds.Jump,
    InputControls = new InputControls
    {
        AndroidKeycodes = new[]
        {
            AndroidKeyCode.KEYCODE_SPACE
        }
    }
};
  1. 接下来,将这些输入操作分组。

对于微游戏,我们只有一个群组,但您可以根据需要创建任意数量的群组,以帮助玩家找到所需的操作。将以下内容添加到 OnProvideInputMap 中:

var movementInputGroup = new InputGroup
{
    GroupLabel = "Movement",
    InputActions = new List<InputAction>
    {
        leftAction, rightAction, jumpAction
    }
};
  1. 将您创建的所有输入组添加到输入映射中。将 OnProvideInputMap 中的 return 语句修改为:
return new InputMap
{
    InputGroups = new List<InputGroup> { movementInputGroup },
    MouseSettings = new MouseSettings
    {
        InvertMouseMovement = false,
        AllowMouseSensitivityAdjustment = false
    }
};
  1. 最后,将您创建的脚本添加到游戏中:

名为

  1. 再次部署游戏时,按 Shift+Tab 打开游戏内叠加界面。

屏幕截图

  1. 点击控件即可查看您已配置的控件。

屏幕截图

10. 移除嵌入式 WebView

为了让玩家获得出色的体验,您应移除嵌入式 WebView。通常会使用嵌入式 WebView 来显示隐私权政策或服务条款等内容。虽然这些链接可在 Google Play 游戏 中正常运行,但它们会显示在嵌入式“移动”浏览器中,而不是玩家首选的桌面浏览器中,这可能会让 PC 玩家感到困惑。因此,在 Unity 中,如果您使用任何扩展程序来显示嵌入式浏览器,请回退到 Application.OpenURL(url)

11. 权限和功能

Google Play Games 中不支持多项 Android 功能和权限。一般而言,PC 版 build 绝不应弹出权限对话框。现在,您已准备好 build,接下来最好是完成一次典型的新安装,并记下您看到的任何对话框,以便将其添加到游戏提交的“待办”列表中。

某些 Unity 游戏会使用 Android.Permission API 请求权限。您应将这些内容封装在 if (GoogleDeviceUtilities.IsGooglePlayGames) 检查中,并在适用情况下直接转到失败逻辑。

12. 桌面优化

Google Play 游戏与典型的 Android 手机相比存在一些差异,您可能需要相应地配置游戏。

切换到 DXT 进行纹理压缩。如果无法直接传递到播放器的 GPU,则会在运行时在内存中解码常见的 Android 纹理格式(例如 ETC)。ASTC 可提供最佳的桌面设备兼容性,但您需要使用桌面 GPU 分析工具来验证游戏的预期行为。

Unity

由于您现在使用的是桌面 GPU,因此可能还需要提高图形质量。您可以在项目设置中的画质下直接调整此设置

屏幕截图

13. 恭喜

您已做好一切准备,可以开始为 Google Play 游戏 开发游戏了。您可以开始测试和迭代游戏。请注意,虽然您可以保留相同的代码库,但仍需调整游戏,使其看起来像原生 PC 游戏。

后续操作

若要在 Google Play 游戏上发布游戏,还需要完成更多工作:

最后,您目前为支持 Google Play 游戏所做的许多工作也有助于您在 ChromeOS 上发布游戏,您应考虑同时支持该平台和 PC。