将 Google Play 免安装体验与 Unity 结合使用

适用于 Unity 的 Google Play 免安装体验插件可以配置 Unity 项目,用于打造游戏的免安装应用版本。本指南将介绍如何安装和使用此插件。

下载并导入插件

该插件是适用于 Unity 的 Google Play 插件的一部分。如需导入该插件,请按以下步骤操作:

  1. 适用于 Unity 的 Google Play 插件版本页面下载最新版本。
  2. 导入 .unitypackage 文件,方法是依次选择 Unity IDE 菜单选项 Assets > Import package > Custom Package,然后导入所有条目。

Unity 编辑器功能

导入该插件,以在 Unity 中添加 Google > Play Instant 子菜单。该子菜单提供以下选项。

Build Settings

打开一个窗口,用于在 InstalledInstant 开发模式之间切换。切换到 Instant 会执行以下更改:

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

Player Settings

Player Settings 对话框(如图 1 所示)中显示的建议可帮助您优化对 Google Play 免安装体验的支持、针对兼容性更强的图形 API 进行开发,以及缩减 APK 的大小。

具体建议包括仅使用 OpenGL ES 2.0 和停用多线程渲染功能。
图 1. Player Settings 对话框

这些 Player Settings 分为必需的设置和建议的设置。如果某项设置有对应的 Update 按钮,请点击此按钮将设置更改为首选值。

如需进一步缩减 APK 大小,请打开 Unity Package Manager 并移除所有未使用的软件包。

Quick Deploy

Quick Deploy 可以将一些资源打包到 AssetBundle 中,从而缩减基于 Unity 的免安装应用的大小。使用 Quick Deploy 时,Unity 游戏引擎和加载屏幕会被打包到免安装应用 APK 中,在免安装应用启动后,Quick Deploy 会从服务器中检索该 AssetBundle。

支持安装工作流

许多免安装应用的目的是让用户在安装完整版之前有机会先体验应用。适用于 Unity 的 Google Play 免安装体验插件提供了相关的 API,用于显示 Play 商店安装对话框以及将状态从免安装应用转换为安装式应用。

显示安装提示

包含 Install 按钮的免安装应用可以显示 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 中包含的 extra 可能无法到达安装式应用。相比保留持久状态,传递 intent extra 更适合保留活跃会话状态;对于前者,请参阅 Cookie API。
  • 任何人都可以构造具有 extra 字段的 intent 来启动安装式应用,因此,如果载荷中包含有价值的内容,请将载荷设计为只能使用一次,对其进行加密签名并在服务器上验证签名。

Cookie API 提供了用于将免安装应用中的 Cookie(例如玩家 ID 或关卡完成数据)传递到相应安装式应用的方法。与 postInstallIntent extra 不同,即使用户没有立即启动安装式应用,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.
}