dasukoの技術ブログ

現役エンジニアのブログです。

【Unity】Firebase Storageを実装してみた

はじめに

今回はFirebaseのStorageをUnityで実装したみたいと思います。

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

Cloud Storage for Unity を使ってみる  |  Firebase

Firebaseコンソール上のStorageの画面はこんな感じです。

f:id:dasuko:20200704181850p:plain

ファイルのアップロード

Storageにファイルをあアップロードしてみます。

アップロードするファイルは画面のスクリーンショットをとって、ローカルに保存してからアップロードします。

以下の処理を認証後に追加してみます。

     // screenshotをとる
    const string fileName = "Assets/screenshot.png";
    ScreenCapture.CaptureScreenshot(fileName);

    yield return new WaitForEndOfFrame();

    var storage = Firebase.Storage.FirebaseStorage.DefaultInstance;

    var reference = storage.GetReferenceFromUrl("URL_TO_GS");

    var screenShotRef = reference.Child("images/screenshot.png");

    screenShotRef.PutFileAsync(fileName)
        .ContinueWith(task =>
        {
            if (task.IsFaulted || task.IsCanceled)
            {
                Debug.Log(task.Exception.ToString());
            }
            else
            {
                screenShotRef.GetDownloadUrlAsync().ContinueWith(downloadTask =>
                {
                    Debug.Log("url:" + downloadTask.Result);
                });
            }
        });
}

これを実行すると…

無事コンソールにダウンロード用のurlが出力されました!

そして、Firebaseのコンソールを確認すると、

f:id:dasuko:20200704182059p:plain

ファイルがアップロードされていることを確認できました!

ファイルのダウンロード

先ほどアップロードしたファイルをGetFileAsyncでダウンロードしてみます。

 var storage = Firebase.Storage.FirebaseStorage.DefaultInstance;

        var reference = storage.GetReferenceFromUrl(URL_TO_GS);

        var screenShotRef = reference.Child("images/screenshot.png");

        screenShotRef.GetFileAsync("Assets/screenshot.png",
            new Firebase.Storage.StorageProgress<Firebase.Storage.DownloadState>(state =>
            {
                Debug.Log(string.Format(
                  "DownloadState: {0} of {1} bytes transferred.",
                  state.BytesTransferred,
                  state.TotalByteCount
                ));
            }), System.Threading.CancellationToken.None
        ).ContinueWith(task =>
        {
            if (task.IsFaulted || task.IsCanceled)
            {
                Debug.Log(task.Exception.ToString());
            }
            else
            {
                Debug.Log("Download finished.");
            }
        });

これを実行すると、Assets配下にscreenshot.pngというファイルが追加されている(ダウンロードされている)ことが確認できました。

以下のログを見ても、正常にダウンロードできていることが確認できます。 f:id:dasuko:20200704184955p:plain

GetFileAsyncの引数のStorageProgressでは、ダウンロードの進行状況を取得できるので、

プログレスバーなどを出す時に便利です。

何%ダウンロードが完了しているか取得する場合はstate.BytesTransferred / state.TotalByteCount * 100

で取得することができます。

まとめ

FirebaseのStorageを実装してみました。

Storageを使えるだけでも実装の幅が広がりそうですね。

アプリ内でスクリーンショットを撮ったり、ユーザが選択した画像ファイルを使用する場合(プロフィール画像とか?)、

ファイルをローカルに保存していては、他のユーザと共有したり、運営側がそのファイルがどんなファイルなのかを見たりすることはできません。

そんな時はStorageに保存してみましょう。

UnityならAssetBundleを置いておいてもいいかも。

 

この記事が参考になったという方や、不明点がある方、

ここ、間違っているよ!という方!気軽にコメントしてください!

 

 

Unityを本気で極めたい人は本を買ってもいいかも!

※本気じゃない人は買わないでください。

参考

Cloud Storage for Unity を使ってみる  |  Firebase