Bagian ini menjelaskan beberapa masalah yang umumnya muncul dalam proyek menggunakan AssetBundles.
Login Sistem AsetBundle 5 akan menemukan semua ketergantungan Objek ketika Objek dibangun menjadi AsetBundle. Hal ini dilakukan menggunakan Database Aset. Informasi ketergantungan ini digunakan untuk menentukan set Objects yang akan dimasukkan dalam AssetBundle.
Objek yang ditugaskan secara eksplisit ke AssetBundle hanya akan dibangun ke dalam asetBundle. Objek adalah “dipersingkat secara eksplisit” ketika AssetImporter Object memiliki properti asetBundleName yang ditetapkan ke string non-kosong.
Sitemap Objek yang tidak ditugaskan secara eksplisit dalam AsetBundle akan dimasukkan dalam semua AsetBundleles yang mengandung 1 atau lebih Objek yang merujuk pada objek yang unta.
Jika dua Objek yang berbeda ditugaskan untuk dua Aset yang berbeda, tetapi keduanya memiliki referensi ke objek ketergantungan umum, maka objek ketergantungan akan disalin ke dalam Aset. Ketergantungan duplicated juga akan dicontohkan, berarti bahwa dua salinan Objek ketergantungan akan dianggap berbeda Objek dengan pengidentifikasi yang berbeda. Ini akan meningkatkan ukuran total dari AssetBundles aplikasi. Ini juga akan menyebabkan dua salinan objek yang berbeda untuk dimuat ke memori jika aplikasi memuat kedua orang tuanya.
Ada beberapa cara untuk mengatasi masalah ini:
Pastikan Objek yang dibangun ke dalam Aset yang berbeda tidak membagikan ketergantungan. Setiap objek yang melakukan ketergantungan saham dapat ditempatkan ke Aset yang sama tanpa menimbulkan ketergantungan mereka.
Segmen AsetBundles sehingga tidak ada dua Aset yang berbagi ketergantungan akan dimuat pada saat yang sama.
Memastikan bahwa semua aset ketergantungan dibangun ke aset mereka sendiri. Ini sepenuhnya menghilangkan risiko aset duplikat, tetapi juga memperkenalkan kompleksitas. Aplikasi harus melacak dependensi antara AssetBundles, dan memastikan bahwa AssetBundles yang tepat dimuat sebelum memanggil AssetBundle. API Reference
Dalam Kesatuan 5, ketergantungan objek dilacak melalui API Aset, terletak di ruang nama UnityEditor. Seperti namanya, API ini hanya tersedia di Editor Unity dan tidak berlaku. Login Penundaan dapat digunakan untuk menemukan semua ketergantungan langsung dari Objek atau Aset tertentu. Perhatikan bahwa ketergantungan ini mungkin memiliki ketergantungan mereka sendiri. Selain itu, API AssetImporter dapat digunakan untuk meminta AssetBundle dimana objek tertentu ditetapkan.
Dengan menggabungkan API Aset dan AsetImporter, dimungkinkan untuk menulis skrip Editor yang memastikan bahwa semua API AssetBundle atau indirect dependenciesKetergantungan indirect, atau transitif terjadi ketika proyek Anda meminta paket yang sendiri “tergantung pada” paket lain. Misalnya, jika proyek Anda tergantung pada paket alembic@1.0.7
yang pada gilirannya tergantung pada paket timeline@1.0.0
, maka proyek Anda memiliki ketergantungan langsung pada Alembic dan ketergantungan tidak langsung pada Timeline. More info
Lihat di Glossary ditugaskan untuk AsetBundles, atau tidak ada dua dependensi saham AsetBundles yang belum ditugaskan ke AsetBundle. Karena biaya memori aset duplicating, disarankan bahwa semua proyek memiliki skrip tersebut.
Bagian berikut menggambarkan kuis dari kode perhitungan ketergantungan aset Unity 5 ketika digunakan bersamaan dengan 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 yang dihasilkan secara otomatis dilase.
Setiap sprite atlasTekstur yang terdiri dari beberapa tekstur yang lebih kecil. Juga disebut sebagai atlas tekstur, sprite gambar, sprite sheet atau tekstur dikemas. More info
Lihat di Glossary yang dihasilkan secara otomatis akan ditugaskan ke AssetBundle yang mengandung Objek Sprite dari mana sprite atlas dihasilkan. Jika objek sprite ditugaskan untuk beberapa asetBundles, maka atlas sprite tidak akan ditugaskan ke asetBundle dan akan digali. Jika Objek Sprite tidak ditugaskan untuk AsetBundle, maka atlas sprite juga tidak akan ditugaskan untuk AsetBundle.
Untuk memastikan bahwa sprite dilase tidak dikutip, periksa bahwa semua kecambah ditandai ke sprite yang sama dilas ditugaskan ke Aset yang sama.
Unity 5.2.2p3 dan lebih tua
Secara otomatis sprite dilase tidak akan pernah ditugaskan ke AsetBundle. Karena ini, mereka akan dimasukkan dalam setiap AsetBundles yang mengandung kecambah mereka dan juga setiap AsetBundles merujuk pada kecambah mereka.
Karena masalah ini, sangat dianjurkan bahwa semua proyek Unity 5 menggunakan peningkatan sprite packerFasilitas yang mengemas grafis dari beberapa tekstur sprite secara ketat bersama dalam satu tekstur yang dikenal sebagai atlas. Unity menyediakan utilitas Sprite Packer untuk mengotomatiskan proses pembuatan dilase dari tekstur sprite individu. More info
Lihat di Glossary Unity ke Unity 5.2.2p4, 5.3 atau versi Unity yang lebih baru.
Untuk proyek-proyek yang tidak dapat ditingkatkan, ada dua latihan untuk masalah ini:
Mudah: Hindari menggunakan paket sprite bawaan Unity. Sprite dilase yang dihasilkan oleh alat eksternal akan menjadi Aset normal, dan dapat ditugaskan dengan benar ke AsetBundle.
Keras: menetapkan semua objek yang menggunakan secara otomatis mengalas ke AsetBundle yang sama sebagai kecambah.
Ini akan memastikan bahwa sprite yang dihasilkan tidak terlihat sebagai ketergantungan tidak langsung dari Aset lain dan tidak akan digandakan.
Solusi ini melestarikan alur kerja menggunakan paket sprite Unity, tetapi ini menurunkan kemampuan pengembang untuk memisahkan Aset menjadi Aset yang berbeda, dan memaksa unduhan kembali seluruh sprite dilas ketika setiap perubahan data pada setiap komponen yang merujuk pada atlas, bahkan jika atlas itu sendiri tidak berubah.
Karena fragmentasi perangkat berat dalam ekosistem Android, seringkali diperlukan untuk mengompreskan tekstur menjadi beberapa format yang berbeda. Sementara semua perangkat Android mendukung ETC1, ETC1 tidak mendukung tekstur dengan saluran alfa. Jika aplikasi tidak memerlukan dukungan OpenGL ES 2, cara paling bersih untuk memecahkan masalah adalah menggunakan ETC2, yang didukung oleh semua perangkat Android OpenGL ES 3.
Sebagian besar aplikasi perlu dikirim pada perangkat yang lebih tua di mana dukungan ETC2 tidak tersedia. Salah satu cara untuk memecahkan masalah ini adalah dengan Varian AsetBundle Unity 5. (Silahkan lihat panduan optimasi Android Unity untuk rincian pada opsi lain.)
Untuk menggunakan Varian AsetBundle, semua tekstur yang tidak dapat dikompresi secara bersih menggunakan ETC1 harus diisolasi menjadi asetBundles bertekstur. Selanjutnya, menciptakan varian yang cukup dari AssetBundles ini untuk mendukung irisan non-ETC2-capable dari ekosistem Android, menggunakan format compressionMetode menyimpan data yang mengurangi jumlah ruang penyimpanan yang dibutuhkan. Kompresi Tekstur, Kompresi Animasi, Kompresi Audio, Membangun Kompresi.
Lihat di Glossary tekstur khusus vendor seperti DXT5, PVRTC dan ATITC. Untuk setiap Variant AsetBundle, ubah pengaturan tekstur yang disertakan ke format kompresi yang sesuai dengan Variant.
Pada runtime, dukungan untuk format texture compressionPerangkat keras grafis 3D memerlukan Tekstur untuk dikompresi dalam format khusus yang dioptimalkan untuk pengambilan sampel Tekstur cepat. More info
Lihat di Glossary yang berbeda dapat terdeteksi menggunakan API. Informasi ini harus digunakan untuk memilih dan memuat Variant AssetBundle yang mengandung tekstur yang dikompresi dalam format yang didukung.
Informasi lebih lanjut tentang format kompresi tekstur Android dapat ditemukan here.
Masalah yang dijelaskan di bagian berikut diperbaiki pada Unity3.2p2. Versi Unity saat ini tidak dipengaruhi oleh masalah ini.
Dalam versi sebelum Unity 5.3.2p2, Unity akan memegang pegangan file terbuka untuk AsetBundle seluruh waktu bahwa AssetBundle dimuat. Ini bukan masalah pada sebagian besar platform. Namun, iOS membatasi jumlah file menangani proses secara bersamaan dapat membuka 255. Jika memuat AsetBundle menyebabkan batas ini melebihi, panggilan pemuatan akan gagal dengan kesalahan "Too Many Open File Handles".
Ini adalah masalah umum untuk proyek yang mencoba membagi konten mereka di ratusan atau ribuan Aset.
Untuk proyek tidak dapat meningkatkan versi Unity, solusi sementara adalah: