logo

FirebaseStorageからUnityへファイルを読み込み、Resourcesに保存する

投稿日2023-02-03

更新日2024-05-17

Picture of the logo
目次(タップして移動)

Firebaseプロジェクトの設定

初めての方はFIREBASEと検索してアカウント作成して下さい。アカウントが出来たらFirebase consoleにログインすると下記のような画面になりますので、まずは適当な新規プロジェクトを作りましょう。

プロジェクト作成

プロジェクトを作成したら次はアプリ選択をします。今回は一番右のUnityを選択します。Unityを介して使用する場合は左のiOSやAndroidは選択しないでください。

アプリ選択

次にOS選択です。FIREBASEではiOSとAndroidで別のアプリとして登録されます。今回はAndroid用として登録します。Unityエディターからパッケージネームをコピーしましょう。 OS選択

画面左のメニューからStorageを選ぶと下記のようなファイルアップロード画面が表示されますので、何かテスト用のファイルをアップロードしてみましょう。

※色々試しましたが、ドラッグ&ドロップは出来ないようです。不便ですがリストから1つづつ選んで選択しましょう。

アップロード

ファイルをアップロードしたらアクセス権のルール作成です。セキュリティ対策のため初期設定では外部アクセス出来ないので、試しに今回は読み込みのみ許可という設定にしてみます。

※下記設定はお試しの簡易的なものです。本番運用する場合はドキュメントを読んで細かく設定することをお勧めします。

ルール作成

ここまで出来ればFIREBASE側の設定はひとまず終了です。

Unity側の設定

設定Jsonファイルを配置

Unityの設定に必要なjsonファイルをダウンロードします。

json

ダウンロードしたファイルはUnityエディターのAssets配下の任意のディレクトリに配置します。ファイル名を変更しないでください。

SDKの入手

Firebase SDKから入手して任意のディレクトリに解凍します。

sdk

解凍するとこんな感じです。使う機能のSDKだけ個別にインストール出来ますので、今回はFirebaseStorageだけインストールします。

オブジェクトの配置

unityエディターでScene上にc#コードをアタッチする空オブジェクトと、今回はテストとしてLogo.pngという画像ファイルをダウンロードするので、表示確認用にUguiのImageオブジェクトを配置して名前をLogoとでも変更しておきます。

C#スクリプトの作成

下記に簡単なサンプルコードを紹介します。こちらを空オブジェクトにアタッチして実行すれば、Logoという名のImage UIにダウンロードした画像ファイルが表示されます。

更にResourcesディレクトリに保存され、エディター上で確認できます。Resourcesディレクトリが空のままの場合は[Ctrl]+[R]キーで更新してみて下さい。

using System.Collections;
using UnityEngine;
using UnityEngine.UI;
using Firebase.Storage;
using System.Threading.Tasks;
using System.IO;
public class FireStorageManager : MonoBehaviour
{
    private const int BuffSize = 1024;  //バッファサイズ(任意のサイズ)
    public const string fileURL = "gs://xxx example xxx.appspot.com/";  //
    public Image imageToSet;
    void Start()
    {
        string fileName = "Logo.png";
        string path = "";
        imageToSet = GameObject.Find("Logo").GetComponent<Image>();
        StartCoroutine(DownloadImage(path, fileName));
    }

    private IEnumerator DownloadImage(string path, string fileName)
    {
        Task<byte[]> task = FirebaseStorage.DefaultInstance.GetReferenceFromUrl($"{fileURL}{fileName}").GetBytesAsync(BuffSize * BuffSize);

        while (!task.IsCompleted)
        {
            yield return null;
        }
        if (task.IsFaulted || task.Result == null)
        {
            Debug.LogError("Error downloading image.");
        }
        else
        {
            Texture2D texture = new Texture2D(1, 1);
            texture.LoadImage(task.Result);

            // Save the texture to the Resources directory.
            byte[] bytes = texture.EncodeToPNG();
            File.WriteAllBytes($"{Application.dataPath}/Resources/{path}{fileName}", bytes);
            imageToSet.sprite = Sprite.Create(texture, new Rect(0, 0, texture.width, texture.height), Vector2.zero);
        }
    }
}

※ファイル名やオブジェクト名は自分の好みで適当に変更して下さい。バッファサイズは無理のない範囲で適当に変更して下さい。

実行結果

今回の例では何もないImageオブジェクトにロゴの画像がダウンロードされて表示されます。Resourcesディレクトリにはダウンロードしたファイルが保存されています。 result

最後に

Firebaseに限った話ではありませんが、これらのサービスは一見無料ですが、あくまでも無料枠があるだけです。テスト検証なら問題ありませんが、本番環境で運用する場合は、いくらかかるのかをよく考え、採算割れしないように注意しましょう。






このサイトをシェアする