Cloud Storage for Unity を使用してファイルをダウンロードする

Cloud Storage を使用すると、デベロッパーは Firebase によって提供、管理される Google Cloud Storage バケットからファイルを迅速かつ容易にダウンロードできます。

参照を作成する

ファイルをダウンロードするには、まずダウンロードするファイルへの Cloud Storage 参照を作成します。

参照は、ストレージ ルートに子パスを付加して作成することも、Cloud Storage のオブジェクトを参照する既存の gs:// または https:// URL から作成することもできます。

// Create a reference with an initial file path and name
Firebase.Storage.StorageReference path_reference =
  storage.GetReference("images/stars.jpg");

// Create a reference from a Google Cloud Storage URI
Firebase.Storage.StorageReference gs_reference =
  storage.GetReferenceFromUrl("gs://bucket/images/stars.jpg");

// Create a reference from an HTTPS URL
// Note that in the URL, characters are URL escaped!
Firebase.Storage.StorageReference https_reference =
  storage.GetReferenceFromUrl("https://firebasestorage.googleapis.com/b/bucket/o/images%20stars.jpg");

ファイルをダウンロードする

Cloud Storage に保存されているファイルは、次の 4 つの方法で取得できます。

  1. URL からダウンロードする
  2. バイト配列にダウンロードする
  3. ストリームでダウンロードする
  4. ローカル ファイルにダウンロードする

ファイルの取得方法は、ゲーム内でのデータの処理方法によって異なります。

URL からダウンロードする

Unity の WWW または UnityWebRequest で URL を使用する場合は、GetDownloadUrlAsync() を呼び出して、ファイルのダウンロード URL を取得することができます。

// Fetch the download URL
reference.GetDownloadUrlAsync().ContinueWith((Task<Uri> task) => {
  if (!task.IsFaulted && !task.IsCanceled) {
    Debug.Log("Download URL: " + task.Result());
    // ... now download the file via WWW or UnityWebRequest.
  }
});

バイト配列にダウンロードする

GetBytesAsync() メソッドを使用すると、メモリ内のバイトバッファにファイルをダウンロードできます。このメソッドは、ファイルの内容全体をメモリに読み込みます。アプリで使用できるメモリよりも大きなファイルをリクエストすると、アプリがクラッシュします。メモリの問題が発生しないように、アプリで処理できる範囲内で最大サイズを設定するか、別のダウンロード方法を使用してください。

// Download in memory with a maximum allowed size of 1MB (1 * 1024 * 1024 bytes)
const long maxAllowedSize = 1 * 1024 * 1024;
reference.GetBytesAsync(maxAllowedSize).ContinueWith((Task<byte[]> task) => {
  if (task.IsFaulted || task.IsCanceled) {
    Debug.Log(task.Exception.ToString());
    // Uh-oh, an error occurred!
  } else {
    byte[] fileContents = task.Result;
    Debug.Log("Finished downloading!");
  }
});

ストリーム経由でダウンロードする

ストリーム経由でファイルをダウンロードすると、データを読み込みながら処理できます。これにより、ダウンロードを柔軟に行うことができます。GetStreamAsync() を呼び出し、最初の引数として独自のストリーム プロセッサを渡します。このデリゲートは、バックグラウンド スレッドで Stream によって呼び出されます。これにより、ディスクへのコンテンツの保存など、レイテンシが長いオペレーションや計算を実行できます。

// Download via a Stream
reference.GetStreamAsync( stream => {
    // Do something with the stream here.
    //
    // This code runs on a background thread which reduces the impact
    // to your framerate.
    //
    // If you want to do something on the main thread, you can do that in the
    // progress eventhandler (second argument) or ContinueWith to execute it
    // at task completion.
}, null, CancellationToken.None);

GetStreamAsync() は、ストリーム プロセッサの後にオプションの引数を取得し、オペレーションをキャンセルしたり、進行状況を通知したりできます。

ローカル ファイルにダウンロードする

GetFileAsync() メソッドは、ファイルをローカル端末に直接ダウンロードします。ユーザーがオフライン中にファイルにアクセスする場合や、別のアプリでファイルを共有する場合は、このメソッドを使用します。

// Create local filesystem URL
string local_url = "file:///local/images/island.jpg";

// Download to the local filesystem
reference.GetFileAsync(local_url).ContinueWith(task => {
    if (!task.IsFaulted && !task.IsCanceled) {
        Debug.Log("File downloaded.");
    }
});

ダウンロードの進捗状況を監視するためにリスナーをダウンロードにアタッチすることができます。リスナーは標準の System.IProgress<T> インターフェースに従います。StorageProgress クラスのインスタンスを使用して、進捗状況ティックを示すためのコールバックとして独自の Action<T> を提供できます。

// Create local filesystem URL
string local_url = "file:///local/images/island.jpg";

// Start downloading a file
Task task = reference.GetFileAsync(local_file,
  new Firebase.Storage.StorageProgress <DownloadState>((DownloadState state) => {
    // called periodically during the download
    Debug.Log(String.Format(
      "Progress: {0} of {1} bytes transferred.",
      state.BytesTransferred,
      state.TotalByteCount
    ));
  }), CancellationToken.None);

task.ContinueWith(resultTask => {
  if (!resultTask.IsFaulted && !resultTask.IsCanceled) {
    Debug.Log("Download finished.");
  }
});

エラーを処理する

ダウンロード時にエラーが発生する理由として、ファイルが存在しない、目的のファイルのアクセス権がユーザーにないなど、たくさんの理由が考えられます。エラーについて詳しくは、このドキュメントのエラーの処理のセクションをご覧ください。

次のステップ

Cloud Storage に保存されているファイルのメタデータを取得して更新することもできます。

フィードバックを送信...

ご不明な点がありましたら、Google のサポートページをご覧ください。