Aset Bangunan
Menggunakan AssetBundles Natively

Ketergantungan AsetBundle

AsetBundles dapat menjadi tergantung pada AsetBundles lain jika salah satu atau lebih dari UnityEngine.Objects mengandung referensi ke UnityEngine.Object yang terletak di bundel lain. Ketergantungan tidak terjadi jika UnityEngine.Object mengandung referensi ke UnityEngine.Object yang tidak terkandung dalam setiap asetBundle. Dalam hal ini, salinan objek yang akan tergantung pada disalin ke dalam bundel ketika Anda membangun Aset. Jika beberapa objek dalam beberapa bundel mengandung referensi ke objek yang sama yang tidak ditugaskan ke bundel, setiap bundel yang memiliki ketergantungan pada objek itu akan membuat salinan objek dan paketnya sendiri ke Aset yang dibangun.

Haruskah AsetBundle mengandung ketergantungan, penting bahwa bundel yang mengandung ketergantungan tersebut dimuat sebelum objek yang Anda mencoba untuk mengulangi beban. Unity tidak akan mencoba ketergantungan beban secara otomatis.

Pertimbangkan contoh berikut, Bahan di Bundle 1 merujuk Tekstur dalam Bundle 2:

Dalam contoh ini, sebelum memuat Material dari Bundle 1, Anda harus memuat Bundle 2 ke dalam memori. Ini tidak masalah yang memesan Anda memuat Bundle 1 dan Bundle 2, takeaway penting adalah bahwa Bundle 2 dimuat sebelum memuat Material dari Bundle 1. Di bagian berikutnya, kami akan membahas bagaimana Anda dapat menggunakan objek AssetBundleManifest yang kami sentuh di bagian sebelumnya untuk menentukan, dan memuat, tergantung pada runtime.

Informasi duplikat di AssetBundles

Secara default, Unity tidak mengoptimalkan informasi duplicated di AssetBundles. Ini berarti beberapa AssetBundles dalam Proyek Anda mungkin mengandung informasi yang sama, seperti Bahan yang digunakan oleh beberapa PrefabsJenis aset yang memungkinkan Anda untuk menyimpan GameObject lengkap dengan komponen dan properti. Prefab bertindak sebagai template dari mana Anda dapat membuat instance objek baru di tempat kejadian. More info
Lihat di Glossary
. Aset yang digunakan dalam beberapa AssetBundles dikenal sebagai Aset umum. Ini dapat mempengaruhi sumber daya memori dan waktu pemuatan.

Halaman ini menjelaskan bagaimana Unity mengelola informasi duplicated di AssetBundles, dan bagaimana Anda dapat menerapkan optimasi.

Editor setup

Secara default, Unity tidak melakukan optimasi untuk mengurangi atau meminimalkan memori yang diperlukan untuk menyimpan informasi duplikat. Selama membangun penciptaan, Unity membangun duplikat dari setiap aset yang dirujuk secara implicit di dalam Aset. Untuk mencegah duplikasi ini, menetapkan Aset umum (seperti Bahan) ke Aset mereka sendiri.

Misalnya: Anda dapat memiliki aplikasi dengan dua Prefab, keduanya ditugaskan untuk Aset mereka sendiri. Baik Prefab berbagi Bahan yang sama, yang tidak ditugaskan untuk Aset. Bahan ini merujuk Tekstur, yang tidak ditugaskan untuk AsetBundle.

Jika Anda mengikuti AssetBundle Workflow dan gunakan kelas contoh CreateAssetBundles untuk membangun AsetBundles, setiap Aset yang dihasilkan mengandung Bahan (termasuk Shader dan Tekstur yang direferensikan). Dalam contoh gambar di bawah ini, file Prefab memiliki ukuran 383 KB dan 377 KB masing-masing.

Jika proyek mengandung sejumlah besar Prefab, perilaku ini mempengaruhi ukuran installer akhir, dan jejak memori runtime ketika kedua Aset dimuat. Duplikasi data di AssetBundles juga berdampak batching, karena Unity menganggap setiap salinan Materi yang sama sebagai Bahan yang unik.

Untuk menghindari duplikasi data, menetapkan Bahan dan Aset yang direferensikan untuk Aset modulesmaterials sendiri. Anda juga dapat menandai Materi hanya, karena ketergantungan Tekstur juga disertakan dalam AsetBundle secara otomatis selama proses build.

Sekarang jika Anda membangun kembali Aset, output yang dihasilkan termasuk Aset modulesmaterials yang terpisah (359 KB), yang mengandung Bahan dan Tekstur terkait. Ini secara signifikan mengurangi ukuran AssetBundles lain untuk Prefab (dari sekitar 380 KB dalam iterasi sebelumnya hingga sekitar 20 KB).

Gambar di bawah ini menggambarkan ini.

Runtime loading

Ketika Anda mengekstrak Aset umum ke Aset tunggal, berhati-hati tentang ketergantungan. Secara khusus, jika Anda hanya menggunakan modul Prefab untuk meluruskan modul, Bahan tidak memuat.

A Prefab without a loaded Material
Prefab tanpa bahan yang dimuat

Untuk memecahkan masalah ini, memuat Materi AssetBundle dalam memori sebelum Anda memuat AssetBundle yang termasuk modul. Dalam contoh berikut, ini terjadi pada variabel materialsAB.

using System.IO;
using UnityEngine;

public class InstantiateAssetBundles : MonoBehaviour
{
    void Start()
    {
        var materialsAB = AssetBundle.LoadFromFile(Path.Combine(Application.dataPath, Path.Combine("AssetBundles", "modulesmaterials")));
        var moduleAB = AssetBundle.LoadFromFile(Path.Combine(Application.dataPath, Path.Combine("AssetBundles", "example-prefab")));

        if (moduleAB == null)
        {
            Debug.Log("Failed to load AssetBundle!");
            return;
        }
        var prefab = moduleAB.LoadAsset<GameObject>("example-prefab");
        Instantiate(prefab);
    }
}

A Prefab with a correctly loaded Material
Prefab dengan Bahan yang benar dimuat

Sitemap Ketika Anda menggunakan Aset Terkompresi LZ4 dan tidak terkompresi, Note: hanya memuat katalog konten dalam memori, tetapi tidak konten itu sendiri. Untuk memeriksa apakah ini terjadi, gunakan paket untuk.AssetBundle.LoadFromFile only loads the catalog of its content in memory, but not the content itself. To check if this is happening, use the package to .

Aset Bangunan
Menggunakan AssetBundles Natively