Baixar arquivos com o Cloud Storage para Unity

O Cloud Storage para Firebase permite fazer download de arquivos de forma rápida e fácil de um bucket do Cloud Storage fornecido e gerenciado pelo Firebase.

Crie uma referência

Para fazer download de um arquivo, primeiro crie uma referência do Cloud Storage para o arquivo que você deseja baixar.

Você pode criar uma referência anexando caminhos secundários à raiz do bucket do Cloud Storage ou pode criar uma referência a partir de um URL gs:// ou https:// existente que faz referência a um objeto no 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");

Baixar arquivos

Depois de ter uma referência, você poderá baixar arquivos do Cloud Storage de quatro maneiras:

  1. Baixar de um URL
  2. Baixar para uma matriz de bytes
  3. Baixe com um stream
  4. Baixar para um arquivo local

O método que você usará para recuperar seus arquivos dependerá de como você deseja consumir os dados no jogo.

Baixar de um URL

Se você quiser usar um URL com WWW ou UnityWebRequest do Unity, poderá obter um URL de download para um arquivo chamando 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.
    }
});

Baixar para uma matriz de bytes

Você pode baixar o arquivo para um buffer de bytes na memória usando o método GetBytesAsync() . Este método carregará todo o conteúdo do seu arquivo na memória. Se você solicitar um arquivo maior que a memória disponível do seu aplicativo, ele irá travar. Para se proteger contra problemas de memória, defina o tamanho máximo para algo que você sabe que seu aplicativo pode suportar ou use outro método de download.

// 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!");
    }
});

Baixe por meio de um stream

Baixar o arquivo com um Stream permite processar os dados à medida que são carregados. Isso lhe dá flexibilidade máxima ao lidar com seu download. Chame GetStreamAsync() e passe seu próprio processador de stream como primeiro argumento. Este delegado será chamado em um thread de segundo plano com um Stream que permite executar operações ou cálculos com uso intensivo de latência, como armazenar o conteúdo em 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() recebe argumentos opcionais após o processador de fluxo que permite cancelar a operação ou ser notificado sobre o progresso.

Baixar para um arquivo local

O método GetFileAsync() baixa um arquivo diretamente para um dispositivo local. Use isto se seus usuários quiserem ter acesso ao arquivo off-line ou compartilhar o arquivo em um aplicativo 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.");
    }
});

Você pode anexar ouvintes aos downloads para monitorar o andamento do download. O ouvinte segue a interface System.IProgress<T> padrão. Você pode usar uma instância da classe StorageProgress para fornecer seu próprio Action<T> como retorno de chamada para ticks de progresso.

// 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.");
    }
});

Lidar com erros

Existem vários motivos pelos quais podem ocorrer erros no download, incluindo o arquivo não existir ou o usuário não ter permissão para acessar o arquivo desejado. Mais informações sobre erros podem ser encontradas na seção Tratar erros da documentação.

Próximos passos

Você também pode receber e atualizar metadados de arquivos armazenados no Cloud Storage.