Descargar archivos con Cloud Storage para Unity

Cloud Storage para Firebase le permite descargar archivos rápida y fácilmente desde un depósito de Cloud Storage proporcionado y administrado por Firebase.

Crear una referencia

Para descargar un archivo, primero cree una referencia de Cloud Storage para el archivo que desea descargar.

Puedes crear una referencia agregando rutas secundarias a la raíz de tu depósito de Cloud Storage, o puedes crear una referencia a partir de una URL gs:// o https:// existente que haga referencia a un objeto en Cloud Storage.

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

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

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

Descargar archivos

Una vez que tengas una referencia, podrás descargar archivos desde Cloud Storage de cuatro maneras:

  1. Descargar desde una URL
  2. Descargar a una matriz de bytes
  3. Descargar con una transmisión
  4. Descargar a un archivo local

El método que utilizarás para recuperar tus archivos dependerá de cómo quieras consumir los datos de tu juego.

Descargar desde una URL

Si desea utilizar una URL con WWW o UnityWebRequest de Unity, puede obtener una URL de descarga para un archivo llamando a GetDownloadUrlAsync() .

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

Descargar a una matriz de bytes

Puede descargar el archivo a un búfer de bytes en la memoria utilizando el método GetBytesAsync() . Este método cargará todo el contenido de su archivo en la memoria. Si solicita un archivo más grande que la memoria disponible de su aplicación, su aplicación fallará. Para protegerse contra problemas de memoria, asegúrese de establecer el tamaño máximo en algo que sepa que su aplicación puede manejar o utilice otro método de descarga.

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

Descargar a través de una transmisión

Descargar el archivo con un Stream le permite procesar los datos a medida que se cargan. Esto le brinda la máxima flexibilidad al manejar su descarga. Llame GetStreamAsync() y pase su propio procesador de flujo como primer argumento. Este delegado será llamado en un hilo en segundo plano con un Stream que le permite realizar operaciones o cálculos con latencia intensiva, como almacenar el contenido en el disco.

// 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() toma argumentos opcionales después del procesador de flujo que le permiten cancelar la operación o recibir notificaciones del progreso.

Descargar a un archivo local

El método GetFileAsync() descarga un archivo directamente a un dispositivo local. Úselo si sus usuarios desean tener acceso al archivo sin conexión o compartir el archivo en una aplicación diferente.

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

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

Puede adjuntar oyentes a las descargas para monitorear el progreso de la descarga. El oyente sigue la interfaz estándar System.IProgress<T> . Puede utilizar una instancia de la clase StorageProgress para proporcionar su propia Action<T> como devolución de llamada para los ticks de progreso.

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

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

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

Manejar errores

Hay varias razones por las que pueden ocurrir errores durante la descarga, incluido el archivo que no existe o que el usuario no tiene permiso para acceder al archivo deseado. Puede encontrar más información sobre errores en la sección Manejar errores de los documentos.

Próximos pasos

También puede obtener y actualizar metadatos de archivos almacenados en Cloud Storage.