适用于 Unity 和 PC 版 Google Play 游戏的使用入门

1. 简介

Google Play 游戏徽标

上次更新日期:2022 年 4 月 25 日

如何为 Google Play Games on PC 准备游戏?

Google Play 游戏可让您轻松将移动游戏转移到 Windows PC 上。这意味着,您无需重新设计游戏或重新设计业务模式,就可以提高玩家互动度和受众群体。您仍要进行一些更改,以便为您的新 PC 玩家提供最佳体验。

学习内容

此 Codelab 介绍了要求核对清单的基本部分,以帮助您上手游戏,并帮助您准备自己的 PC 版 Unity 游戏。没有更深入的集成,例如 Play 游戏登录和 Play Integrity API。

  • 如何利用 Unity 构建适用于 x86 架构的应用。
  • 如何测试并部署到 Google Play 游戏模拟器。
  • 如何修改界面,在 PC 上呈现精美外观。
  • 如何检测您是否在 Google Play 游戏模拟器中运行应用,并相应地调整您的游戏。

所需条件

2. 进行设置

打开或创建新项目

  1. 使用 2D 平台微型游戏创建一个新项目,或打开您自己的项目。

Unity 的“新项目”屏幕。系统会选择“2D 平台微型游戏”作为要创建的模板。

  1. 从项目中依次选择 File -> Build Settings,然后检查是否已设置为针对 Android 进行构建。

Unity“Build Settings”窗口的屏幕截图。“Android”平台处于有效状态。

3.准备 Google Play 游戏模拟器

首先,从此页面下载模拟器。如果您没有看到下载链接,请检查您登录的帐号是不是已添加到 play-mp-emu 群组。此模拟器的成员有可用更新时,他们会收到相关通知,因此请确保您可以收到来自 play-mp-emu@googlegroups.com 的电子邮件。

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

Google Play 游戏模拟器窗口的屏幕截图。系统会显示 Android 主屏幕。

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

❯ adb devices
List of devices attached
localhost:6520  device

您需要最新版本的 adb 才能检测模拟器。与 Android Studio 捆绑的版本兼容,但随 Unity 一起提供的 adb 可能无法运行。兼容的版本与模拟器捆绑在一起,您可以在 C:\Program Files\Google\HPE_Dev\emulator 中找到它。为了获得最佳的开发者体验,您可能需要安装 Android Studio 并将其用于管理 Android SDK。

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

adb connect localhost:6520

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

Unity 随附的 adb 版本可能与模拟器不兼容。要确保此文件处于选中状态,请依次选择 File -> Build Settings,然后选中 Run Device 对话框,看看它是否已列出。

在“Build Settings”(构建设置)窗口中运行设备。系统选择了“Run Device”,只有可见元素是“Default device”和“Allcompatible devices”。

根据您的项目、构建流程和舒适程度,您可以选择将 Unity 配置为直接部署到 Google Play 游戏模拟器,也可以构建 APK 并通过 adb install 手动部署。手动部署需要的变更极少,但可能会减缓您的迭代周期。

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

  1. 将 Unity 配置为使用其他 Unity SDK,最好由 Android Studio 安装的 Unity SDK。
  2. 更新 Build Tools 版本以解决 Unity 中的错误

由于 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 选项。

“Preferences”窗口中的“External Tools”的屏幕截图

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

“Build Settings”窗口的屏幕截图。系统会显示“Run Device”和“Google HPE”。

根据此 bug 的状态和 Unity 版本,您可能还需要更改构建工具版本。为此,请检查您是否生成了 mainTemplate.gradlelauncherTemplate.gradle

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

“Project Settings”窗口中“Player”部分的屏幕截图。  “自定义主 Gradle 模板”和“自定义启动器 Gradle 模板”对应的复选框都处于选中状态。

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

5. 部署到 Chromebook(可选)

借助 Chrome 操作系统设备,您无需访问 Google Play 游戏模拟器即可开始开发 Google Play 游戏游戏。与 PC 版 Google Play 游戏非常相似,Chromebook 采用键盘和鼠标,拥有大屏幕和 x86 配置。我们将在 Chromebook 上使用 Android Logcat Unity 插件。

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

已安装“Android Logcat”的软件包管理器窗口。

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

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

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

然后启用 ADB 调试。

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

开发者菜单已启用 ADB 调试。

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

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

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

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

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

窗口 > 在 Unity 中打开“Analysis”(分析)工具,并选择“Android Logcat”(Android Logcat)。

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

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

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

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

  1. 点击连接。您应该会看到 Success 窗口:

系统会打开显示“成功”的对话框。

现在,您的 Chromebook 会显示在 Unity 的 Run Device 列表中(您可能需要先刷新屏幕):

Unity“Build Settings”窗口已打开。Chrome 操作系统设备会显示在“运行设备”下拉列表中。

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

6.部署测试 build

Google Play 游戏要求您部署 x86 版本的游戏,这是它在桌面设备上达到其性能基准的一部分。 Unity 的所有 LTS 变体都可以生成与 x86 和 x86-64 兼容的 Android build(标记为“Chrome 操作系统”),而 Unity 2018 及更低版本可以生成 x86 build。要解锁这些架构,您首先需要切换到 IL2CPP 脚本后端(您可能已经在生产环境中这样做,以便实现 arm64 支持)。

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

聚焦于“Player Settings”按钮的“Build Settings”窗口的屏幕截图。

  1. 转到其他设置部分,然后将 Scripting Backend 切换为 IL2CPP

“Player Settings”中“Other Settings”部分的屏幕截图

您还应启用 x86 或 x86-64 支持。若要在 Google Play 游戏平台上发货,您只需要支持 x86,但我们建议使用 x86-64。

播放器设置“脚本后端”的“配置”部分的屏幕截图设为了“IL2CPP”,而目标架构已选中“x86(Chrome 操作系统)”,并突出显示了“x86-64 (Chrome 操作系统)”。

Frame Pacing 库的 Unity 软件包版本也与 Google Play 游戏不兼容,并且会导致游戏在启动时崩溃。

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

“分辨率和呈现效果”的屏幕截图,未选中“优化的帧同步”

现在,您可以开始构建项目了!

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

运行“2D 平台微型游戏”的 Google Play 游戏模拟器的屏幕截图

如果您无法部署游戏,请检查“运行设备”列表中是否显示了“Google HPE 设备 (localhost:6520)”。如果没有找到,请确保 HPE_Dev 正在运行,并且您能看到 Android 主屏幕。如果它仍未出现在您的设备列表中,请使用您正使用的 adb.exe 运行 adb connect localhost:6520。如果您使用的是 Android Logcat Unity 插件,请依次选择 Tools -> Open Terminal(工具 -> 打开终端),以便使用 Unity 所用的同一 adb.exe 目录打开一个终端。

“Android Logcat”Unity 窗口的屏幕截图,其中突出显示了“Tools”>“Open Terminal”

7. 针对 PC 调整游戏

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

如果有必要根据玩家使用的是 Google Play 游戏还是 Chrome 操作系统来更改逻辑,此脚本可帮助您通过检查 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%。由于许多移动游戏都使用“按比例缩放屏幕大小”,因此将其更改为“常量物理尺寸”或“常量像素尺寸”可能是实现此目标的第一步。

显示“UI Scale Modes”的“Canvas Scaler”检查器的屏幕截图,其中突出显示了 Scale 模式为“Constant Pixel Size”、“Scale With Screen Size”和“Constant Size Size”。已选择“常量像素大小”。

如果您检测到玩家在 Google Play 游戏中玩游戏,不妨在运行时使用 QualitySettings.SetQualityLevel 命令动态设置画质设置。Google Play 游戏模拟器使用 ANGLE 从 OpenGL Unity 发出的 (emit) 发出原生 DirectX 或 Vulkan 命令,因此,其图形保真度可能会高于移动游戏 build 中的图形保真度。

8. 输入处理

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

出于测试目的,许多游戏都会构建基本的鼠标和键盘控件,以便在编辑器中进行开发。如果可能,当您在 Chrome 操作系统设备或 Google Play 游戏模拟器中运行应用时,可能需要启用这些 API。

默认情况下,Google Play 游戏和 Chrome 操作系统会将鼠标输入转换为模拟触摸。如果您使用 Input.GetTouchInput.touchCount,您的游戏将继续正常运行。如果您依赖于多点触控输入(例如双拇指控件或双指张合缩放),则需要将操作映射到按键操作。此外,您还应将游戏内操作映射到按键操作,例如按 i 键打开广告资源,按 Esc 键关闭对话框,以及 Enter 键发送游戏内消息。

2D 平台微型游戏使用箭头来移动,并使用空间来跳跃。如果您使用的是自己的游戏,请确保您拥有用于下一步的首选按键组合。

9. 输入 SDK 集成

现在您已设置了鼠标和键盘控件,接下来需要添加 Input 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. 最后,将您创建的脚本添加到您的游戏中:

名为“InputSdk”且附加了“Input Mapping Provider Behaviour”的节点的屏幕截图

  1. 当您再次部署游戏时,按 Shift+Tab 可打开游戏内叠加层。

Google Play 游戏模拟器中“游戏选项”叠加层的屏幕截图

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

Google Play 游戏模拟器中“控件”叠加层的屏幕截图

10. 移除广告和嵌入式网站数据视图

我们不会介绍需要更新的所有逻辑,但您可以立即解决两个问题,让应用获得批准,同时为玩家提供良好的体验。

首先,我们经常使用嵌入式网页视图来显示隐私权政策或服务条款等内容。虽然这些游戏可在 Google Play 游戏中显示,但它们会显示在嵌入式“移动”浏览器中,而不是玩家的首选桌面浏览器,这可能会给 PC 玩家造成一些困惑。因此,在 Unity 中,如果您使用任何扩展程序来显示嵌入式浏览器,则请改用 Application.OpenURL(url)

第二,目前不允许在 Google Play 游戏中展示广告,但您可以为您的移动和 ChromeOS 播放器保留广告 SDK。使用 GoogleDeviceUtilities.IsGooglePlayGames 来确定是否应添加游戏内广告。其他与付款相关的 API(如 Google Pay)会按预期运行。

11. 权限和功能

Google Play 游戏不支持 Android 的某些功能和权限。一般来说,您的 PC build 应绝不弹出权限对话框。现在,您已经准备好了 build,接下来最好完成一个典型的新安装,并记下您看到的所有添加到“待办事项”列表中的对话框,以便提交您的游戏。

某些 Unity 游戏使用 Android.Permission API 请求权限。您应将这些检查封装在 if (GoogleDeviceUtilities.IsGooglePlayGames) 检查中,并直接转到故障逻辑(如果适用)。

12. 桌面设备优化

与典型的 Android 手机相比,Google Play 游戏有一些不同之处,您可能需要相应地配置您的游戏。

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

打开 Unity 的“Build Settings”窗口,并展开“Texture Compression”。“DXT (Tegra)”是突出显示的纹理压缩替换。

由于您现在是在桌面设备 GPU 上运行,因此可能还需要提高图形质量。你可以在项目设置中的质量下直接调整颜色

“项目设置”的“质量”部分的屏幕截图

13. 恭喜

一切准备就绪,可以开始开发 Google Play 游戏了。您可以开始对游戏进行测试和迭代。请注意,尽管您可以保留相同的代码库,但您希望调整自己的游戏,使其看起来像原生 PC 游戏。

后续操作

若要在 Google Play 游戏中发布游戏,我们还有更多工作要做:

最后,到目前为止,您为支持 Google Play 游戏所做的大部分工作也有助于您在 ChromeOS 上开发应用,您还应该考虑在 PC 上支持该平台。