搭配 Unity 使用 Google Play 免安裝

警告:Google Play 免安裝應用程式將停止提供服務。2025 年 12 月起,您無法透過 Google Play 發布免安裝應用程式,且所有 Google Play 服務免安裝 API 都將停止運作。Play 不會再透過任何機制向使用者提供免安裝應用程式。

我們根據開發人員的意見,並持續投入資源改善 Google Play 免安裝推出後的生態系統,因此做出這項變更。

如要持續促進使用人數成長,建議開發人員使用深層連結,將使用者導向標準版應用程式或遊戲,並在適當情況下將他們重新導向特定路徑或功能。

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」子選單。這個子選單提供下列選項。

建構設定

開啟視窗,以便在「已安裝」和「即時」開發模式之間切換。切換至「即時」會進行下列變更:

  • 建立名為 PLAY_INSTANT 的 Scripting Define Symbol,可用於搭配 #if PLAY_INSTANT#endif 進行指令碼編寫。
  • 管理 AndroidManifest.xml 的更新,以進行特定必要變更,例如 android:targetSandboxVersion

播放器設定

圖 1 所示的「Player Settings」對話方塊會顯示建議,協助您最佳化 Google Play 免安裝應用程式的支援功能、使用更多相容的圖形 API 進行開發,以及縮減 APK 大小。

具體建議包括只使用 OpenGL ES 2.0,以及停用多執行緒轉譯。
圖 1. 「Player Settings」對話方塊

這些播放器設定分為「必要」和「建議」設定。如果設定有對應的「更新」按鈕,請按一下該按鈕,將設定變更為偏好的值。

如要進一步縮減 APK 大小,請開啟 Unity Package Manager 並移除所有未使用的套件。

快速部署

快速部署功能可將部分資產封裝在 AssetBundle 中,藉此縮減以 Unity 為基礎的免安裝應用程式大小。使用快速部署功能時,Unity 遊戲引擎和載入畫面會封裝到免安裝應用程式 APK 中,免安裝應用程式啟動後,會從伺服器擷取 AssetBundle。

支援安裝工作流程

許多免安裝應用程式的目標是讓使用者在安裝完整版之前,先體驗應用程式。Unity 專用 Google Play 免安裝外掛程式提供 API,可顯示 Google Play 商店安裝對話方塊,以及將狀態從免安裝應用程式轉移至安裝版應用程式。

顯示安裝提示

如果免安裝應用程式有「安裝」按鈕,可以從安裝按鈕點選處理常式呼叫下列項目,顯示 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中包含的額外內容可能無法傳送至已安裝的應用程式。傳遞 Intent 額外資訊較適合用於保留有效工作階段狀態,而非保留持續性狀態;如要保留後者,請參閱 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.
}