gracetory’s blog

東池袋にある合同会社グレストリのエンジニアブログです

UnityでFirebaseのDatabaseを使ってみた話

f:id:ykira:20190607114940p:plain

こんにちは。ykira(@rakipagu)です。

先日、初めてUnityを使ったアプリをリリースしました!

ClickerGold(クリッカーゴールド)というゲームアプリです。

リンクを載せておくので、良かったらプレイしてみてください。

Clicker Gold

Clicker Gold

  • Gracetory
  • ゲーム
  • 無料

play.google.com

さて、今回はClickerGoldを作成する時に使った「Firebase」のデータベースについて

具体的なコードなども交えて書きたいと思います。

Firebaseとは?

ひとことで言うと、GoogleのmBaaSです。

詳しい説明はサイトを見ていただければと思います。

firebase.google.com

同じようなものにニフクラのmobile backendなどがあります。

Firebaseのデータベースとは?

今回はRealtime Databaseという機能を使いました。

Json形式でアプリのデータを保存できます。

さらにリアルタイムで同期できたりもするのですが、今回は純粋にデータの保存用としてだけ使用しています。

無料枠として、同時接続数:100・保存容量:1GB・ダウンロード容量:10GB/月が用意されています。

軽く使ってみる分には十分な分量だと思います。

Firebaseにプロジェクトを作成する

ClickerGoldでは本番用と開発用で2つのプロジェクトを作成しました。

f:id:ykira:20190607120843p:plain

以後は開発用のプロジェクトで説明をしていきたいと思います。

Realtime Databaseのアクセスルールを設定する

データベースへのアクセスルールを設定する必要があります。

とりあえず触ってみる程度なので、readとwriteどちらもtrueでいいと思います。

※使い終わったらfalseにしておくとかする

f:id:ykira:20190607121901p:plain

本番はちゃんとしたほうがいいと思います。

Unityの設定とか

Unity用のFirebase公式マニュアルが用意されています。

firebase.google.com

firebase.google.com

本当に至れり尽くせりでcocos2dxなどとは比較にならないくらい恵まれてるなと思います。

流れとしては、下記だけで簡単にデータを保存することができます。

  1. UnityのプロジェクトにFirebaseのSDKや設定ファイルなどを追加

  2. マニュアルの「データを保存する」のページを参考にコードを書く

結果としてFirebaseのコンソールでは下記のように保存されたデータが表示されます。

f:id:ykira:20190607121430p:plain

開発用と本番用でFirebaseプロジェクトを分けたい!

分けたいなと思ったのですが、Firebaseの構成ファイルを置き換えないといけないんですよね。

手動でやると絶対ミスるので、自動化しました。

まず、Firebaseというフォルダ(UnitySDK入れたら作られる)に画像のように構成ファイルを入れます。

f:id:ykira:20190607124220p:plain

何も付いていないファイルが使用されるもの、-devとついているのが開発用、-prodが本番用です。

要は、開発モードのときは-devがついているファイルで置き換えられ、本番モードのときは-prodで置き換えられるという具合です。

これをエディター拡張で実行時とビルド時に行われるようにしました。

ちょっと長いですがソースは下記です。

これを、作成したEditorフォルダ配下に置きます(今回はEditor/FirebaseSetting.csとかにしました)

using UnityEngine;
using UnityEditor;
using UnityEditor.Build;
using UnityEditor.Build.Reporting;
using System.IO;

/**
 * Firebaseの設定ファイルを置き換える
 */
[InitializeOnLoad]
public class FirebaseSetting : IPreprocessBuildWithReport {
    // Androidの設定ファイル
    private const string FIREBASE_ANDROID_PLIST       = "google-services.json";       // 実ファイル
    private const string FIREBASE_ANDROID_PLIST_PROD = "google-services-prod.json";   // 本番用
    private const string FIREBASE_ANDROID_PLIST_DEV   = "google-services-dev.json";   // 開発用
    // iOSの設定ファイル
    private const string FIREBASE_IOS_PLIST       = "GoogleService-Info.plist";       // 実ファイル
    private const string FIREBASE_IOS_PLIST_PROD = "GoogleService-Info-prod.plist";   // 本番用
    private const string FIREBASE_IOS_PLIST_DEV   = "GoogleService-Info-dev.plist";   // 開発用
    // Firebaseの設定ファイルのパス
    private static readonly string firebasePath = Application.dataPath + "/Firebase/";

    // 実行順 ※低い値が優先される
    public int callbackOrder { get { return 0; } }

    /**
    * Unityエディタ実行時
    */
    static FirebaseSetting() {
        Debug.Log("エディタ実行開始");
        replaceFirebaseSetting();
    }

    /**
    * ビルド実行時
    */
    public void OnPreprocessBuild (BuildReport report) {
        Debug.Log("ビルド開始");
        replaceFirebaseSetting();
    }

    /**
    * 設定ファイルの置き換え
    */
    static void replaceFirebaseSetting() {
       #if UNITY_ANDROID

        // Firebaseの設定ファイルを置き換え
        string firebaseFile = Application.identifier.Contains("dev") ? FIREBASE_ANDROID_PLIST_DEV : FIREBASE_ANDROID_PLIST_PROD;
        File.Copy(firebasePath + firebaseFile, firebasePath + FIREBASE_ANDROID_PLIST, overwrite: true);

        Debug.Log("Android Firebaseの設定ファイル置き換え:" + firebaseFile);
        
       #elif UNITY_IOS

        // Firebaseの設定ファイルを置き換え
        string firebaseFile = Application.identifier.Contains("dev") ? FIREBASE_IOS_PLIST_DEV : FIREBASE_IOS_PLIST_PROD;
        File.Copy(firebasePath + firebaseFile, firebasePath + FIREBASE_IOS_PLIST, overwrite: true);

        Debug.Log("iOS Firebaseの設定ファイル置き換え:" + firebaseFile);
        
       #endif
    }
}

エディタ拡張については下記などを参照してみてください。

unity3d.com

これ使えるようになるとUnityの開発がどんどん楽しくなりますよ(作業は増えますが……)

Firebaseを使って快適にアプリを作っていこう!

Firebaseを使うと、バックエンドのサーバを用意せずに様々なことができるようになります。

余計な作業も発生せず、アプリの内容だけに注力できますね。

今後プッシュ通知などでも使おうと思っていますので、またブログにしたいと思います。

それでは、ここまで読んでいただきありがとうございました!