将Google Play即时游戏与Unity结合使用

Unity的Google Play即时游戏插件可配置您的Unity项目以创建游戏的即时应用版本。本指南介绍如何安装和使用此插件。

下载并导入插件

该插件是Unity的Google Play插件的一部分。要导入插件,请按照以下步骤操作

  1. Unity的Google Play插件发行版下载最新版本。
  2. 通过选择Unity IDE菜单选项资源>导入包>自定义包并导入所有项目来导入.unitypackage文件。

Unity编辑器功能

导入插件可在Unity中添加Google> Play即时游戏子菜单。此子菜单提供以下选项。

构建设置

打开一个窗口,该窗口允许在已安装即时开发模式之间切换。切换到即时模式将执行以下更改

  • 创建一个名为PLAY_INSTANT的脚本定义符号,可用于使用#if PLAY_INSTANT#endif进行脚本编写。
  • 管理对AndroidManifest.xml的更新,以进行某些必要的更改,例如android:targetSandboxVersion

播放器设置

图1所示的播放器设置对话框显示了一些建议,可帮助您优化对Google Play即时游戏的支持,针对更兼容的图形API进行开发,并减小APK的大小。

Specific suggestions include using OpenGL ES 2.0 only and
  disabling Multithreaded Rendering.
图1. 播放器设置对话框

这些播放器设置分为必需推荐设置。如果设置具有相应的更新按钮,请单击它以将设置更改为首选值。

为了进一步减小APK的大小,请打开Unity Package Manager并删除任何未使用的包。

快速部署

快速部署可以通过将某些资源打包到AssetBundle中来减小基于Unity的即时应用的大小。使用快速部署时,Unity游戏引擎和加载屏幕将打包到即时应用APK中,并且在即时应用启动后,它将从服务器检索AssetBundle。

支持安装工作流程

许多即时应用的目标是在用户安装完整版本之前让用户有机会体验该应用。Unity的Google Play即时游戏插件提供了用于显示Play商店安装对话框以及将状态从即时应用转移到已安装应用的API。

显示安装提示

具有安装按钮的即时应用可以通过从安装按钮点击处理程序调用以下内容来显示Play商店安装对话框

Google.Play.Instant.InstallLauncher.ShowInstallPrompt();

ShowInstallPrompt()方法有一个重载,允许使用以下一项或多项

  • 确定用户是否取消了安装过程。覆盖即时应用主活动中的onActivityResult(),并在指定的requestCode上检查RESULT_CANCELED
  • 通过referrer参数传递安装推荐程序字符串。
  • 通过PutPostInstallIntentStringExtra()传递有关当前游戏会话的状态。

这些在以下示例中进行了演示

using Google.Play.Instant;
...
const int requestCode = 123;
var sessionInfo = /* Object serialized as a string representing player's current location, etc. */;
using (var activity = UnityPlayerHelper.GetCurrentActivity())
using (var postInstallIntent = InstallLauncher.CreatePostInstallIntent(activity))
{
    InstallLauncher.PutPostInstallIntentStringExtra(postInstallIntent, "sessionInfo", sessionInfo);
    InstallLauncher.ShowInstallPrompt(activity, requestCode, postInstallIntent, "test-referrer");
}

如果用户完成了应用安装,Play商店将使用提供的postInstallIntent重新启动应用。已安装的应用可以使用以下内容检索在postInstallIntent中设置的值

var sessionInfo = InstallLauncher.GetPostInstallIntentStringExtra("sessionInfo");

备注

  • 如果用户安装了应用但取消了安装后启动,则postInstallIntent中包含的额外内容可能无法到达已安装的应用。传递意图额外内容更适合保留活动会话状态,而不是保留持久状态;对于后者,请参阅Cookie API。
  • 任何人都可以使用额外字段构建意图来启动已安装的应用,因此,如果有效负载授予某些有价值的东西,请设计有效负载使其只能使用一次,对其进行加密签名,并在服务器上验证签名。

Cookie API 提供了在即时应用与其对应的已安装应用之间传递 Cookie 的方法(例如,玩家 ID 或关卡完成数据)。与 postInstallIntent 附加数据不同,即使用户没有立即启动已安装应用,Cookie 状态也能保持可用。例如,即时应用可以从安装按钮点击处理程序中调用以下代码

using Google.Play.Instant;
...
var playerInfo = /* Object serialized as a string representing game levels completed, etc. */;
var cookieBytes = System.Text.Encoding.UTF8.GetBytes(playerInfo);
try
{
    var maxCookieSize = CookieApi.GetInstantAppCookieMaxSize();
    if (cookieBytes.Length > maxCookieSize)
    {
        UnityEngine.Debug.LogErrorFormat("Cookie length {0} exceeds limit {1}.", cookieBytes.Length, maxCookieSize);
    }
    else if (CookieApi.SetInstantAppCookie(cookieBytes))
    {
        UnityEngine.Debug.Log("Successfully set cookie. Now display the app install dialog...");
        InstallLauncher.ShowInstallPrompt();
    }
    else
    {
        UnityEngine.Debug.LogError("Failed to set cookie.");
    }
}
catch (CookieApi.InstantAppCookieException ex)
{
    UnityEngine.Debug.LogErrorFormat("Failed to set cookie: {0}", ex);
}

如果用户完成了应用安装,已安装应用可以使用以下代码检索 Cookie 数据

var cookieBytes = CookieApi.GetInstantAppCookie();
var playerInfoString = System.Text.Encoding.UTF8.GetString(cookieBytes);
if (!string.IsNullOrEmpty(playerInfoString))
{
    // Initialize game state based on the cookie, e.g. skip tutorial level completed in instant app.
}