Unity에서 Google Play 인스턴트 사용

Unity용 Google Play 인스턴트 플러그인은 게임의 인스턴트 앱 버전을 생성하도록 Unity 프로젝트를 구성합니다. 이 가이드에서는 이 플러그인을 설치하고 사용하는 방법을 설명합니다.

플러그인 다운로드 및 가져오기

플러그인은 Unity용 Google Play 플러그인의 일부입니다. 플러그인을 가져오려면 다음 단계를 따르세요.

  1. Unity용 Google Play 플러그인 출시에서 최신 출시를 다운로드합니다.
  2. Unity IDE 메뉴 옵션 Assets > Import package > Custom Package를 선택하고 모든 항목을 가져와서 .unitypackage 파일을 가져옵니다.

Unity Editor 기능

플러그인을 가져와 Unity에서 Google > Play Instant 하위 메뉴를 추가합니다. 이 하위 메뉴는 다음 옵션을 제공합니다.

빌드 설정

InstalledInstant 개발 모드 간에 전환할 수 있는 창을 엽니다. Instant로 전환하면 다음과 같은 변경사항이 실행됩니다.

  • #if PLAY_INSTANT#endif로 스크립팅에 사용할 수 있는 PLAY_INSTANT라는 스크립팅 정의 기호를 생성합니다.
  • android:targetSandboxVersion과 같은 특정한 필수 변경사항의 AndroidManifest.xml 업데이트를 관리합니다.

플레이어 설정

그림 1과 같이 Player Settings 대화상자에는 Google Play 인스턴트 지원 최적화, 호환성이 더 높은 그래픽 API에 대비한 개발 및 APK 크기 축소에 도움이 되는 제안사항이 표시됩니다.

구체적인 제안사항으로는 OpenGL ES 2.0만 사용하고 멀티스레드 렌더링을 사용 중지하는 것이 있습니다.
그림 1. Player Settings 대화상자

이러한 Player Settings는 RequiredRecommended 설정으로 나뉩니다. 설정에 관련 Update 버튼이 있다면 버튼을 클릭하여 원하는 값으로 설정을 변경합니다.

APK 크기를 더 줄이려면 Unity Package Manager를 열고 사용하지 않는 패키지를 모두 삭제합니다.

Quick Deploy

Quick Deploy는 AssetBundle에 일부 애셋을 패키징하여 Unity 기반 인스턴트 앱의 크기를 줄일 수 있습니다. Quick Deploy를 사용하면 Unity 게임 엔진 및 로드 화면이 인스턴트 앱 APK에 패키징되며 인스턴트 앱이 시작된 후 서버에서 AssetBundle을 검색합니다.

설치 워크플로 지원

많은 인스턴트 앱의 목표는 사용자가 정식 버전을 설치하기 전에 앱을 경험할 수 있는 기회를 제공하는 것입니다. Unity용 Google Play 인스턴트 플러그인은 Play 스토어 설치 대화상자를 표시하고 인스턴트에서 설치된 앱으로 상태를 전송하기 위한 API를 제공합니다.

설치 메시지 표시

Install 버튼이 있는 인스턴트 앱은 설치 버튼 클릭 핸들러에서 다음을 호출하여 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는 쿠키(예: 플레이어 ID 또는 레벨 완료 데이터)를 인스턴트 앱에서 해당하는 설치된 앱으로 전달하기 위한 메서드를 제공합니다. postInstallIntent 추가 항목과 달리 쿠키 상태는 사용자가 설치된 앱을 즉시 실행하지 않더라도 사용할 수 있습니다. 예를 들어 인스턴트 앱은 설치 버튼 클릭 핸들러에서 다음 코드를 호출할 수 있습니다.

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);
}

사용자가 앱 설치를 완료하면 설치된 앱은 다음 코드를 사용하여 쿠키 데이터를 검색할 수 있습니다.

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