Membuat UploadHandlers
Audio

Menciptakan DownloadHandlers

Important: UNet adalah solusi yang diuraikan, dan Solusi Multiplayer baru dan NetworkingSistem Unity yang memungkinkan game multiplayer di jaringan komputer. More info
Lihat di Glossary
(Netcode untuk GameObjects) sedang berkembang. Untuk informasi lebih lanjut dan langkah selanjutnya melihat informasi di .

Ada beberapa jenis DownloadHandlers:

  • DownloadHandlerBuffer digunakan untuk penyimpanan data sederhana.
  • DownloadHandlerFile digunakan untuk mengunduh dan menyimpan file ke disk dengan jejak memori rendah.
  • DownloadHandlerTexture digunakan untuk mengunduh gambar.
  • DownloadHandlerAssetBundle digunakan untuk mengambil AssetBundles.
  • DownloadHandlerAudioClip digunakan untuk mengunduh file audio.
  • DownloadHandlerMovieTexture digunakan untuk mengunduh file video. Disarankan bahwa Anda menggunakan VideoPlayer untuk unduhan video dan pemutaran film karena MovieTexture dideprecated.
  • DownloadHandlerScript adalah kelas khusus. sendiri, itu tidak ada. Meme it Namun, kelas ini dapat diwarisi oleh kelas yang ditentukan pengguna. Kelas ini menerima callback dari sistem UnityWebRequest, yang kemudian dapat digunakan untuk melakukan penanganan data yang benar-benar kustom karena tiba dari jaringan.

API mirip dengan antarmuka DownloadHandlerTexture.

UnityWebRequest memiliki properti disposeDownloadHandlerOnDispose, yang default untuk benar. Jika properti ini benar, ketika objek UnityWebRequest disposed, Dispose() juga akan disebut pada handler download terpasang rendering itu tidak berguna. Jika Anda menyimpan referensi untuk mengunduh handler lebih lama dari referensi ke UnityWebRequest, Anda harus mengatur disposeDownloadHandlerOnDispose ke false.

DownloadHandlerBuffer

Unduh Pegang adalah yang paling sederhana, dan menangani sebagian besar kasus penggunaan. Toko ini menerima data dalam penyangga kode asli. Ketika unduhan selesai, Anda dapat mengakses data penyangga baik sebagai array byte atau sebagai string teks.

Example

using UnityEngine;
using UnityEngine.Networking;
using System.Collections;


public class MyBehaviour : MonoBehaviour {
    void Start() {
        StartCoroutine(GetText());
    }

    IEnumerator GetText() {
        UnityWebRequest www = new UnityWebRequest("https://www.my-server.com");
        www.downloadHandler = new DownloadHandlerBuffer();
        yield return www.SendWebRequest();

        if (www.result != UnityWebRequest.Result.Success) {
            Debug.Log(www.error);
        }
        else {
            // Show results as text
            Debug.Log(www.downloadHandler.text);

            // Or retrieve results as binary data
            byte[] results = www.downloadHandler.data;
        }
    }
}

DownloadHandlerFile

Ini adalah handler download khusus untuk file besar. Ini menulis didownload byte langsung ke file, sehingga penggunaan memori rendah terlepas dari ukuran file yang diunduh. Perbedaan dari penelusuran unduhan lain adalah bahwa Anda tidak bisa mendapatkan data dari yang ini, semua data disimpan ke file.

Example

using System.Collections;
using System.IO;
using UnityEngine;
using UnityEngine.Networking;

public class FileDownloader : MonoBehaviour {

    void Start () {
        StartCoroutine(DownloadFile());
    }

    IEnumerator DownloadFile() {
        var uwr = new UnityWebRequest("https://unity3d.com/", UnityWebRequest.kHttpVerbGET);
        string path = Path.Combine(Application.persistentDataPath, "unity3d.html");
        uwr.downloadHandler = new DownloadHandlerFile(path);
        yield return uwr.SendWebRequest();
        if (uwr.result != UnityWebRequest.Result.Success)
            Debug.LogError(uwr.error);
        else
            Debug.Log("File successfully downloaded and saved to " + path);
    }
}

DownloadHandlerTexture

Alih-alih menggunakan DownloadHandlerBuffer untuk mengunduh file gambar dan kemudian membuat tekstur dari byte mentah menggunakan Texture.LoadImage, lebih efisien untuk menggunakan DownloadHandlerTexture.

Toko handler Download ini menerima data dalam UnityEngine.Texture. Pada penyelesaian download, decode JPEG dan PNG menjadi valid UnityEngine.Texture objects. Hanya satu salinan UnityEngine.Texture diciptakan per objek DownloadHandlerTexture. Ini mengurangi kinerja hit dari koleksi sampah. Pegang melakukan penyangga, dekompresi dan pembuatan tekstur dalam kode asli. Selain itu, penciptaan dekompresi dan tekstur dilakukan pada benang pekerja bukan benang utama, yang dapat meningkatkan waktu bingkai saat memuat tekstur besar.

Akhirnya, DownloadHandlerTexture hanya mengalokasikan memori yang berhasil ketika akhirnya membuat Tekstur itu sendiri, yang menghilangkan overhead pengumpulan sampah yang terkait dengan melakukan konversi byte-to-texture dalam skrip.

Example

Contoh berikut mengunduh file PNG dari internet, mengubahnya menjadi SpriteObjek grafis 2D. Jika Anda digunakan untuk bekerja di 3D, Sprites pada dasarnya hanya tekstur standar tetapi ada teknik khusus untuk menggabungkan dan mengelola tekstur sprite untuk efisiensi dan kenyamanan selama perkembangan. More info
Lihat di Glossary
, dan menetapkannya ke image:

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Networking;
using System.Collections;

[RequireComponent(typeof(Image))]
public class ImageDownloader : MonoBehaviour {
    Image _img;

    void Start () {
        _img = GetComponent<UnityEngine.UI.Image>();
        Download("https://www.mysite.com/myimage.png");
    }

    public void Download(string url) {
        StartCoroutine(LoadFromWeb(url));
    }

    IEnumerator LoadFromWeb(string url)
    {
        UnityWebRequest wr = new UnityWebRequest(url);
        DownloadHandlerTexture texDl = new DownloadHandlerTexture(true);
        wr.downloadHandler = texDl;
        yield return wr.SendWebRequest();
        if (wr.result == UnityWebRequest.Result.Success) {
            Texture2D t = texDl.texture;
            Sprite s = Sprite.Create(t, new Rect(0, 0, t.width, t.height),
                Vector2.zero, 1f);
            _img.sprite = s;
        }
    }
}

DownloadHandlerAssetBundle

Keuntungan untuk ini khusus Download Handler adalah bahwa itu mampu streaming data ke sistem Aset Unity. Setelah sistem AssetBundle telah menerima data yang cukup, AssetBundle tersedia sebagai objek UnityEngine.AssetBundle. Hanya satu salinan objek UnityEngine.AssetBundle diciptakan. Ini sangat mengurangi alokasi memori jangka waktu serta dampak memori pemuatan Aset Anda. Hal ini juga memungkinkan Aset untuk sebagian digunakan sementara tidak sepenuhnya diunduh, sehingga Anda dapat streaming Aset.

Semua download dan dekompresi terjadi pada benang pekerja.

AsetBundles diunduh melalui objek DownloadHandlerAssetBundle, yang memiliki properti assetBundle khusus untuk mengambil AssetBundle.

Karena cara kerja sistem AssetBundle, semua AssetBundle harus memiliki alamat yang terkait dengan mereka. Secara umum, ini adalah URL nominal di mana mereka terletak (melakukan URL sebelum pengalihan). Dalam hampir semua kasus, Anda harus melewati URL yang sama seperti yang Anda lewatkan ke UnityWebRequest. Saat menggunakan High Level APISistem untuk membangun kemampuan multiplayer untuk permainan Unity. Ini dibangun di atas lapisan komunikasi real-time transportasi tingkat bawah, dan menangani banyak tugas umum yang diperlukan untuk permainan multiplayer. More info
Lihat di Glossary
(HLAPI), ini dilakukan untuk Anda.

Example

using UnityEngine;
using UnityEngine.Networking;
using System.Collections;

public class MyBehaviour : MonoBehaviour {
    void Start() {
        StartCoroutine(GetAssetBundle());
    }

    IEnumerator GetAssetBundle() {
        UnityWebRequest www = new UnityWebRequest("https://www.my-server.com");
        DownloadHandlerAssetBundle handler = new DownloadHandlerAssetBundle(www.url, uint.MaxValue);
        www.downloadHandler = handler;
        yield return www.SendWebRequest();

        if (www.result != UnityWebRequest.Result.Success) {
            Debug.Log(www.error);
        }
        else {
            // Extracts AssetBundle
            AssetBundle bundle = handler.assetBundle;
        }
    }
}

DownloadHandlerAudioClip

Pegang unduhan ini dioptimalkan untuk mengunduh file audio. Alih-alih mengunduh byte mentah menggunakan DownloadHandlerBuffer dan kemudian membuat AudioClip dari mereka, Anda dapat menggunakan handler unduh ini untuk melakukannya dengan cara yang lebih nyaman.

Example

using System.Collections;
using UnityEngine;
using UnityEngine.Networking;

public class AudioDownloader : MonoBehaviour {

    void Start () {
        StartCoroutine(GetAudioClip());
    }

    IEnumerator GetAudioClip() {
        using (var uwr = UnityWebRequestMultimedia.GetAudioClip("https://myserver.com/mysound.ogg", AudioType.OGGVORBIS)) {
            yield return uwr.SendWebRequest();
            if (uwr.result != UnityWebRequest.Result.Success) {
                Debug.LogError(uwr.error);
                yield break;
            }

            AudioClip clip = DownloadHandlerAudioClip.GetContent(uwr);
            // use audio clip
        }
    }
}

DownloadHandlerScript

Untuk pengguna yang memerlukan kendali penuh atas pemrosesan data yang diunduh, Unity menyediakan kelas DownloadHandlerScript.

Secara default, contoh kelas ini tidak ada. Namun, jika Anda mendapatkan kelas Anda sendiri dari DownloadHandlerScript, Anda dapat menimpa fungsi tertentu dan menggunakannya untuk menerima callback sebagai data tiba dari jaringan.

Sitemap Unduhan aktual terjadi pada benang pekerja, tetapi semua callback Note: beroperasi pada benang utama. Hindari melakukan operasi berat secara komputasi selama panggilan ini.DownloadHandlerScript callbacks operate on the main thread. Avoid performing computationally heavy operations during these callbacks.

Fungsi untuk override

ReceiveContentLength()

protected void ReceiveContentLength(long contentLength);

Fungsi ini disebut ketika header Konten-Panjang diterima. Perhatikan bahwa callback ini dapat terjadi beberapa kali jika server Anda mengirim satu atau lebih tanggapan langsung selama pemrosesan UnityWebRequest Anda.

OnContentComplete()

protected void OnContentComplete();

Fungsi ini disebut ketika UnityWebRequest telah sepenuhnya mengunduh semua data dari server, dan telah meneruskan semua data yang diterima ke callback ReceiveData.

ReceiveData()

protected bool ReceiveData(byte[] data, long dataLength);

Fungsi ini disebut setelah data telah tiba dari server jarak jauh, dan disebut sekali per bingkai. argumen data mengandung byte mentah yang diterima dari server jarak jauh, dan dataLength menunjukkan panjang data baru dalam array data.

Ketika tidak menggunakan penyangga data pra-lokasi, sistem membuat array byte baru setiap kali panggilan callback ini, dan dataLength selalu sama dengan data.Length. Saat menggunakan penyangga data pra-dilokasi, penyangga data digunakan kembali, dan dataLength harus digunakan untuk menemukan jumlah byte yang diperbarui.

Fungsi ini membutuhkan nilai pengembalian sebesar true atau false. Jika Anda kembali false, sistem segera aborts UnityWebRequest. Jika Anda kembali true, pemrosesan terus normal.

Hindari pengumpulan sampah overhead

Banyak pengguna yang lebih maju Unity terkait dengan mengurangi lonjakan CPU karena pengumpulan sampah. Untuk pengguna ini, sistem UnityWebRequest memungkinkan pra-allokasi array byte kode yang dikelola, yang digunakan untuk memberikan data yang diunduh untuk mengunduh callback ReceiveDataHandlerScript.

Menggunakan fungsi ini benar-benar menghilangkan alokasi memori kode yang dikelola saat menggunakan kelas DownloadHandlerScript-derived untuk menangkap data yang diunduh.

Untuk membuat DownloadHandlerScript beroperasi dengan penyangga yang dikelola sebelumnya, menyediakan array byte ke konstror DownloadHandlerScript.

Sitemap Ukuran array byte membatasi jumlah data yang dikirimkan ke callback ReceiveData setiap bingkai. Jika data Anda tiba perlahan-lahan, lebih banyak bingkai, Anda mungkin telah memberikan terlalu kecil dari array byte.Note: The size of the byte array limits the amount of data delivered to the ReceiveData callback each frame. If your data arrives slowly, over many frames, you may have provided too small of a byte array.

Example

using UnityEngine;
using UnityEngine.Networking;

public class LoggingDownloadHandler : DownloadHandlerScript {

    // Standard scripted download handler - allocates memory on each ReceiveData callback

    public LoggingDownloadHandler(): base() {
    }

    // Pre-allocated scripted download handler
    // reuses the supplied byte array to deliver data.
    // Eliminates memory allocation.

    public LoggingDownloadHandler(byte[] buffer): base(buffer) {
    }

    // Required by DownloadHandler base class. Called when you address the 'bytes' property.

    protected override byte[] GetData() { return null; }

    // Called once per frame when data has been received from the network.

    protected override bool ReceiveData(byte[] data, int dataLength) {
        if(data == null || data.Length < 1) {
            Debug.Log("LoggingDownloadHandler :: ReceiveData - received a null/empty buffer");
            return false;
        }

        Debug.Log(string.Format("LoggingDownloadHandler :: ReceiveData - received {0} bytes", dataLength));
        return true;
    }

    // Called when all data has been received from the server and delivered via ReceiveData.

    protected override void CompleteContent() {
        Debug.Log("LoggingDownloadHandler :: CompleteContent - DOWNLOAD COMPLETE!");
    }

    // Called when a Content-Length header is received from the server.

    protected override void ReceiveContentLengthHeader(ulong contentLength) {
        Debug.Log(string.Format("LoggingDownloadHandler :: ReceiveContentLength - length {0}", contentLength));
    }
}
Membuat UploadHandlers
Audio