[Unity]ストアレビュー機能の実装方法(iOS、Android両対応)

Unity

はじめに

App StoreやGoogle Playにゲームをリリースした後に気になるのがゲームの評価。自分の作ったゲームの評価が高かった場合には、テンションが上ります。

App Store、Google Play共に評価機能はあるものの、なかなかレビューされず悲しい思いをしている人がいると思います。

レビューされない理由としてゲームをインストールしてくれる人はいたとしても、わざわざ評価までしてくれる人はごくわずかだからです。

そのレビューの少なさを解決するためにApple、Googleはアプリ内からレビューをリクエストする機能が提供されています。今回はそのリクエストレビュー機能をUnityでどうすれば実装できるのかを紹介します。

環境

  • Unity 2020.1.14f1
  • External Dependency Manager 1.2.161

※この記事を作成している時にExternal Dependency Managerは1.2.162が最新でしたが、うまく動作してくれませんでした。

準備

この後、記載しますがiOSのみUnityがリクエストレビュー機能が既に実装してくれており、プログラムも1行書けば動作します。

しかし、Androidのリクエストレビュー機能は実装されていないので自分で実装する必要があります。この準備では主にAndroidでリクエストレビューを実装するための準備です。

External Dependency Managerのダウンロード

まずは下記のサイトからExternal Dependency ManagerのUnity Packageを取得します。基本的には最新のもので平気です。

Releases · googlesamples/unity-jar-resolver
Unity plugin which resolves Android & iOS dependencies and performs version management - googlesamples/unity-jar-resolver

External Dependency Managerをインポート

[Assets]→[Import Package]→[Custom Package]から先程ダウンロードしたUnity Packageを選択

下記のように、インポートする内容が表示されるので「Import」を選択してインポートします。

インポートが終わると下記のような画面が表示されるので、「Game Package Registry by Google」にチェックが入っていることを確認し「Add Selected Registries」を選択

インポートするパッケージが古いとバージョンアップを促されるので、「Apply」を選択

全て終わると下記のようなダイアログがでるので「Close」を選択してインポート完了です。

補足

External Dependency ManagerとはiOS、Androidで利用する様々なプラグインの依存関係を自動で解決してくれるライブラリです。またこのライブラリを入れることでGoogle系のサービスのFirebase等のライブラリもUnity Package Managerから追加することができるようになります。

External Dependency Managerをインポートする前は、Package Managerには何も登録されていません。

インポートすると下記のように、「Game Package Registry by Google」という項目が追加されます。これにより、Unity Package ManagerからGoogle系のサービスのライブラリを簡単にインポートできるようになります。

また最初はProjectのAssetsフォルダ配下にExternalDependencyManagerとPlayServicesResolverがありましたが、インポートが終わるとなくなっています。

実はなくなったのではなくPackageフォルダという所に移動しているだけです。ただしPlayServicesResolverはExternal Dependency Managerの古い形式なので削除されます。

もしPackageフォルダの中身が空の場合はProjectビューの右にある目のようなアイコンを押してみてください。非表示になっているだけかもしれません。

またPackageフォルダの中身はどこにあるの?と思うかもしれませんが以下にあります。

作成したUnityプロジェクトのフォルダ/Library/PackageCache

Google Play In-app Reviewの追加

Androidでリクエストレビューをするためのライブラリのインポートをするために[Window]→[Package Manager]を開きます。

[Packages: InProject]となっているところを[Package: My Registries]に変更します。

するとGoogle系のライブラリが一覧で表示されるので「Google Play In-app Review」を選択し「Install」します。

インストールが終わるとインストールされたパッケージの名前の横に緑色のチェックマークが付きます。Google Play In-app Review以外もインストールされているライブラリがありますが、Google Play In-app Reviewに必要なライブラリなので自動でインストールされます。

これで全ての準備完了です。

実装方法

iOS

前述の通りiOSはプログラムを一行書くだけで実装できます。

public void RequestReview()
{
    UnityEngine.iOS.Device.RequestStoreReview();
}

Android

Androidの場合は以下で実装できます。


public void RequestReview()
{
    StartCoroutine(RequestReviewAndroid());
}

private IEnumerator RequestReviewAndroid()
{
    var reviewManager = new Google.Play.Review.ReviewManager();
    var requestFlowOperation = reviewManager.RequestReviewFlow();
    yield return requestFlowOperation;
    if (requestFlowOperation.Error != Google.Play.Review.ReviewErrorCode.NoError)
    {
        // Log error. For example, using requestFlowOperation.Error.ToString().
        yield break;
    }
    var playReviewInfo = requestFlowOperation.GetResult();
    var launchFlowOperation = reviewManager.LaunchReviewFlow(playReviewInfo);
    yield return launchFlowOperation;
    playReviewInfo = null; // Reset the object
    if (launchFlowOperation.Error != Google.Play.Review.ReviewErrorCode.NoError)
    {
        // Log error. For example, using requestFlowOperation.Error.ToString().
        yield break;
    }
}

テスト

上記のコードをiOSで動かすと以下のようなダイアログが出てきます。Androidではテストしません。理由は次で説明します。

注意点

リクエストレビューが完成し、いざ実機でテストだ!と思っても焦ってはいけません。

このリクエストレビュー機能にはがあります。

iOS

  • Xcodeから直接インストールした実機では表示されます
  • TestFlightからインストールした実機では表示されません

Android

  • apkから直接インストールした実機では表示されません
  • Google Playからインストール(内部テスト版等含む)した実機では表示されます

応用編

実装方法」で紹介したやり方でもいいのですが、毎回同じコードを実装するのはめんどくさいですし、もしAndroidのリクエストレビューが表示される前にスクリプトが破棄されてしまった場合、リクエストレビューが表示されません。

そこでリクエストレビューの機能を1つにまとめて簡単に呼び出せるようにしたいと思います。

内容は簡単でシングルトンにして、どちらのプラットフォームでも同じメソッドで呼び出せるようにします。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class StoreReviewManager : MonoBehaviour
{
    private static StoreReviewManager instance;
    public static StoreReviewManager Instance
    {
        get
        {
            if (!instance)
            {
                System.Type type = typeof(StoreReviewManager);
                instance = (StoreReviewManager)FindObjectOfType(type);
                if (!instance)
                {
                    GameObject obj = new GameObject(type.ToString(), type);
                    instance = obj.GetComponent<StoreReviewManager>();
                }
            }
            if (!instance)
            {
                Debug.LogError("Not Found StoreReviewManager.");
            }
            return instance;
        }
    }

    void Awake()
    {
        DontDestroyOnLoad(gameObject);
    }

    // Start is called before the first frame update
    void Start()
    {

    }

    public void RequestReview()
    {
#if UNITY_IOS && !UNITY_EDITOR
        UnityEngine.iOS.Device.RequestStoreReview();
#elif UNITY_ANDROID && !UNITY_EDITOR
        StartCoroutine(RequestReviewAndroid());
#else
        Debug.LogWarning("This platform is not support RequestReview.");
#endif
    }

#if UNITY_ANDROID
    private IEnumerator RequestReviewAndroid()
    {
        var reviewManager = new Google.Play.Review.ReviewManager();
        var requestFlowOperation = reviewManager.RequestReviewFlow();
        yield return requestFlowOperation;
        if (requestFlowOperation.Error != Google.Play.Review.ReviewErrorCode.NoError)
        {
            // Log error. For example, using requestFlowOperation.Error.ToString().
            yield break;
        }
        var playReviewInfo = requestFlowOperation.GetResult();
        var launchFlowOperation = reviewManager.LaunchReviewFlow(playReviewInfo);
        yield return launchFlowOperation;
        playReviewInfo = null; // Reset the object
        if (launchFlowOperation.Error != Google.Play.Review.ReviewErrorCode.NoError)
        {
            // Log error. For example, using requestFlowOperation.Error.ToString().
            yield break;
        }
    }
#endif

}

使い方は以下です。

private void RequetReview()
{
    StoreReviewManager.Instance.RequestReview();
}

参考

Unity - Scripting API: iOS.Device.RequestStoreReview
Integrate in-app reviews (Unity)  |  Android Developers

さいごに

ぜひ、このリクエストレビュー機能を実装してみてください。

おすすめ参考書

コメント

タイトルとURLをコピーしました