【Unity】Firebase Cloud Firestoreを実装してみた

はじめに

今回はUnityでFirebase Cloud Firestoreを実装してみたいと思います

公式ドキュメントはこちらです。

Cloud Firestore  |  Firebase

Firebase Console上での画面はここです。

f:id:dasuko:20200802140114p:plain

Firebase Cloud Firestoreとは

Google の柔軟でスケーラブルな NoSQL クラウド データベースを使用して、クライアント側開発とサーバー側開発のデータを保存、同期します。

Cloud Firestore は、Firebase と Google Cloud Platform からのモバイル、ウェブ、サーバー開発に対応した、柔軟でスケーラブルなデータベースです。Firebase Realtime Database と同様に、リアルタイム リスナーを介してクライアント アプリ間でデータを同期し、モバイルとウェブのオフライン サポートを提供します。これにより、ネットワークの遅延やインターネット接続に関係なく機能するレスポンシブ アプリを構築できます。Cloud Firestore は、その他の Firebase および Google Cloud Platform プロダクト(Cloud Functions など)とのシームレスな統合も実現します。

Cloud Firestore  |  Firebaseより引用

Firebase Cloud Firestoreはデータベースを使ってユーザのデータを保存・管理したい場合に使うと便利です。

FirebaseのデータベースにはCloud Firestoreの他にRealtime Databaseもあります。

どちらがいいかはこちらをご参考ください

データベースの選択: Cloud Firestore または Realtime Database  |  Firebase

データベースの作成

f:id:dasuko:20200804003254p:plain

Firebase Consoleからデータベースの作成を選択します。

すると、以下のような画面になります。

f:id:dasuko:20200804003423p:plain

こちらでデータのセキュリティを保護するルールを作成します。

ルールには本番環境とテストモードがあります。

本番環境・・・データはデフォルトで非公開になります。セキュリティルールで非公開になります。セキュリティルールで指定されている通りに、クライアントの読み取り/書き込み権限のみ付与されます。

テストモード・・デフォルトでデータが開き、クイックセットアップが有効になります。セキュリティルールが更新されない場合、クライアントの読み取り/書き込みアクセスは30日後に拒否されます。

今回はテストモードで作成してみます。

  

 

次にロケーションを設定します。

f:id:dasuko:20200804003939p:plain

ロケーションを選択したら、完了ボタンを押します。

  

データベースを作成すると、以下のような画面になります。

f:id:dasuko:20200804004352p:plain

ルールタブを選択すればいつでもセキュリティ保護のルールを変更できます。

f:id:dasuko:20200804004502p:plain

もし、Realtime Databaseが選択されていて、FireStoreに変更したい場合は以下をクリックします。

f:id:dasuko:20200804011624p:plain

f:id:dasuko:20200804013808p:plain

UnityPackageをインポート

FirebaseFirestore.unitypackageをUnityプロジェクトにインポートします。

実装

実装してみたいと思います。

データの追加

まずはデータを追加してみます。

        var docRef = Firebase.Firestore.FirebaseFirestore.DefaultInstance.Collection("users").Document("user");
        var user = new System.Collections.Generic.Dictionary<string, object>
        {
            { "Name", "Hogehoge" }
        };

        docRef.SetAsync(user).ContinueWithOnMainThread(task => {
            Debug.Log("Completed");
        });

これを実行すると、Firebase Console上でデータが追加されたことが確認できます。

f:id:dasuko:20200804013739p:plain

ドキュメントが存在しない場合には、ドキュメントが新規で作成され、ドキュメントが存在する場合には、上書きします。

ただ、以下のようにSetOptionsを指定することにより、データを統合するように指定することも可能です。

        docRef.SetAsync(user, Firebase.Firestore.SetOptions.MergeAll).ContinueWithOnMainThread(task => {
            Debug.Log("Completed");
        });

以下のようにカスタムクラスを使ってデータを定義することもできます。

        var docRef = Firebase.Firestore.FirebaseFirestore.DefaultInstance.Collection("users").Document("user");
        var user = new User
        {
            Name = "Hugahuga"
        };

        docRef.SetAsync(user).ContinueWithOnMainThread(task => {
            Debug.Log("Completed");
        });

.....

[Firebase.Firestore.FirestoreData]
public class User
{
    [Firebase.Firestore.FirestoreProperty]
    public string Name { get; set; }
}

プロパティを使えるのはいいですね!

データを更新する場合は以下のようにUpdateAsyncを実行します。

        var docRef = Firebase.Firestore.FirebaseFirestore.DefaultInstance.Collection("users").Document("user");
        var user = new System.Collections.Generic.Dictionary<string, object>
        {
            { "Name", "Hogehoge" }
        };

        docRef.UpdateAsync(user).ContinueWithOnMainThread(task => {
            Debug.Log("Completed");
        });

最後に

今回はFirebaseのCloud Firestoreを実装してみました。

機会があれば、Realtime Databaseも記事にしてみたいと思います。(どちらも過去に実装したことはあります)

参考

Cloud Firestore  |  Firebase