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.
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.
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;
}
}
}
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.
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);
}
}
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.
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;
}
}
}
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.
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;
}
}
}
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.
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
}
}
}
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.
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.
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.
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.
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 ReceiveData
HandlerScript.
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.
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));
}
}