Pobieranie plików za pomocą Cloud Storage dla Unity

Cloud Storage dla Firebase umożliwia szybkie i łatwe pobieranie plików z zasobnika Cloud Storage udostępnianego i zarządzanego przez Firebase.

Tworzenie referencji

Aby pobrać plik, najpierw utwórz odniesienie do Cloud Storage do pliku, który chcesz pobrać.

Możesz utworzyć odwołanie, dodając ścieżki podrzędne do katalogu głównego zasobnika Cloud Storage. Możesz też utworzyć odwołanie z istniejącego adresu URL gs:// lub https:// odwołującego się do obiektu w 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");

Pobieranie pliku

Po utworzeniu pliku referencyjnego możesz pobrać pliki z Cloud Storage na 4 sposoby:

  1. Pobierz z adresu URL
  2. Pobierz do tablicy bajtów
  3. Pobieranie ze strumieniem
  4. Pobieranie do pliku lokalnego

Metoda, której użyjesz do pobrania plików, będzie zależała od tego, jak chcesz wykorzystywać dane w grze.

Pobierz z adresu URL

Jeśli chcesz użyć adresu URL z WWW lub UnityWebRequest Unity, możesz uzyskać adres URL pobierania pliku, wywołując 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.
    }
});

Pobierz do tablicy bajtów

Plik możesz pobrać w buforze bajtów w pamięci za pomocą metody GetBytesAsync(). Ta metoda spowoduje wczytanie do pamięci całej zawartości pliku. Jeśli zażądasz pliku, którego rozmiar przekracza dostępną pamięć aplikacji, aplikacja ulegnie awarii. Aby uniknąć problemów z pamięcią, ustaw maksymalny rozmiar na taką, o której wiesz, że Twoja aplikacja obsługuje, lub użyj innej metody pobierania.

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

Pobieranie ze strumienia

Pobranie pliku za pomocą strumienia umożliwia przetworzenie danych w momencie ich załadowania. Zapewnia to maksymalną elastyczność podczas pobierania plików. Wywołaj GetStreamAsync() i jako pierwszy argument przekaż własny procesor strumienia. Ten delegat zostanie wywołany w wątku w tle za pomocą strumienia, co umożliwia wykonywanie operacji lub obliczeń wymagających dużych opóźnień, takich jak przechowywanie treści na dysku.

// 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);

Po procesorze strumienia GetStreamAsync() przyjmuje opcjonalne argumenty, które pozwalają anulować operację lub otrzymać powiadomienie o postępie.

Pobieranie do pliku lokalnego

Metoda GetFileAsync() pobiera plik bezpośrednio na urządzenie lokalne. Używaj, jeśli użytkownicy chcą mieć dostęp do pliku offline lub udostępnić go w innej aplikacji.

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

Aby monitorować postęp pobierania, możesz dołączyć do pobranych detektorów. Detektor używa standardowego interfejsu System.IProgress<T>. Możesz użyć instancji klasy StorageProgress, aby podać własny obiekt Action<T> jako wywołanie zwrotne dla wskaźników postępu.

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

Obsługa błędów

Błędy mogą wynikać z różnych powodów, np. gdy plik nie istnieje lub użytkownik nie ma uprawnień dostępu do niego. Więcej informacji o błędach znajdziesz w sekcji Obsługa błędów w tej dokumentacji.

Następne kroki

Możesz też pobierać i aktualizować metadane plików przechowywanych w Cloud Storage.