在 Unity 中使用 Google Play Instant

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

下载并导入插件

此插件是 Google Play Plugins for Unity 的一部分。要导入此插件,请按以下步骤操作:

  1. Google Play Plugins for Unity releases 下载最新版本。
  2. 选择 Unity IDE 菜单选项 Assets > Import package > Custom Package 并导入所有项目,以导入 .unitypackage 文件。

Unity 编辑器功能

导入插件可在 Unity 中添加一个 Google > Play Instant 子菜单。此子菜单提供以下选项。

构建设置

打开一个窗口,可在已安装免安装开发模式之间切换。切换到免安装模式会执行以下更改:

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

播放器设置

图 1 所示的播放器设置对话框会显示建议,以帮助您优化对 Google Play Instant 的支持,针对更兼容的图形 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 Instant 插件提供了 API,用于显示 Play 商店安装对话框以及将状态从免安装应用传输到已安装应用。

显示安装提示

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

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

ShowInstallPrompt() 方法有一个重载,允许以下一项或多项功能:

  • 确定用户是否取消了安装过程。在免安装应用的主 activity 中覆盖 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 中包含的额外数据可能无法到达已安装的应用。传递 intent 额外数据更适合保留活跃会话状态,而不是保留持久状态;对于后者,请参阅 Cookie API。
  • 任何人都可以构建包含额外字段的 intent 来启动已安装的应用,因此,如果有效负载授予有价值的东西,请设计有效负载,使其只能使用一次,进行加密签名,并在服务器上验证签名。

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.
}