Ketergantungan AsetBundle
Kompresi asetBundle

Menggunakan AssetBundles Natively

Ada empat API yang berbeda yang dapat Anda gunakan untuk memuat AssetBundles. Perilaku mereka bervariasi berdasarkan platform bundel dimuat dan metode compressionMetode menyimpan data yang mengurangi jumlah ruang penyimpanan yang dibutuhkan. Kompresi Tekstur, Kompresi Animasi, Kompresi Audio, Membangun Kompresi.
Lihat di Glossary
yang digunakan ketika AssetBundles dibangun (tidak terkompresi, LZMA, LZ4).

Empat API yang harus kami kerjakan dengan:

  • ’s (Unity 5.3 atau newer)

AssetBundle.LoadFromMemoryAsync

AssetBundle.LoadFromMemoryAsync

Fungsi ini mengambil array dari byte yang mengandung data AssetBundle. Opsional Anda juga dapat melewati nilai CRC jika Anda menginginkan. Jika bundel dikompresi LZMA akan menekan AssetBundle sementara itu memuat. Bundel terkompresi LZ4 dimuat dalam keadaan terkompresi mereka.

Berikut ini adalah salah satu contoh cara menggunakan metode ini:

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

public class Example : MonoBehaviour
{
    IEnumerator LoadFromMemoryAsync(string path)
    {
        AssetBundleCreateRequest createRequest = AssetBundle.LoadFromMemoryAsync(File.ReadAllBytes(path));
        yield return createRequest;
        AssetBundle bundle = createRequest.assetBundle;
        var prefab = bundle.LoadAsset<GameObject>("MyObject");
        Instantiate(prefab);
    }
}

Namun, ini bukan satu-satunya strategi yang membuat menggunakan LoadFromMemoryAsync mungkin. File.ReadAllBytes(path) bisa diganti dengan prosedur yang diinginkan untuk mendapatkan array byte.

AssetBundle.LoadFromFile

AssetBundle.LoadFromFile

API ini sangat efisien ketika memuat bundel yang tidak terkompresi dari penyimpanan lokal. Login Dari File akan memuat bundel langsung dari disk jika bundel tidak terkompresi atau chunk (LZ4) dikompresi. Memuat bundel terkompresi penuh (LZMA) dengan metode ini akan terlebih dahulu menekan bundel sebelum memuatnya ke dalam memori.

Satu contoh cara menggunakan LoadFromFile:

using System.IO;
using UnityEngine;

public class LoadFromFileExample : MonoBehaviour
{
    void Start()
    {
        var myLoadedAssetBundle = AssetBundle.LoadFromFile(Path.Combine(Application.streamingAssetsPath, "myassetBundle"));

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

Catatan: Pada perangkat Android dengan Unity 5.3 atau lebih tua, API ini akan gagal ketika mencoba memuat AssetBundles dari jalur Aset Streaming. Ini karena isi jalur itu akan berada di dalam file .jar terkompresi. Unity 5.4 dan yang lebih baru dapat menggunakan panggilan API ini dengan Aset Streaming cukup bagus.

WordPress.org

WordPress.org

UnityWebRequestAssetBundle memiliki panggilan API khusus untuk berurusan dengan AssetBundles. Untuk memulai, Anda harus membuat permintaan web Anda menggunakan UnityWebRequestAssetBundle.GetAssetBundle. Setelah mengembalikan permintaan, melewati objek permintaan menjadi DownloadHandlerAssetBundle.GetContent(UnityWebRequestAssetBundle). Panggilan GetContent ini akan mengembalikan objek AssetBundle Anda.

Anda juga dapat menggunakan properti assetBundle pada kelas DownloadHandlerAssetBundle setelah mengunduh bundel untuk memuat AssetBundle dengan efisiensi AssetBundle.LoadFromFile.

Berikut ini contoh cara memuat AssetBundle yang mengandung dua GameObjectsObjek mendasar dalam adegan Unity, yang dapat mewakili karakter, props, pemandangan, kamera, waypoints, dan banyak lagi. Fungsi GameObject didefinisikan oleh Komponen yang melekat padanya. More info
Lihat di Glossary
dan Instantiate. Untuk memulai proses ini, kita hanya perlu memanggil StartCoroutine(InstantiateObject());

IEnumerator InstantiateObject()
{
    string uri = "file:///" + Application.dataPath + "/AssetBundles/" + assetBundleName; 
    UnityEngine.Networking.UnityWebRequestAssetBundle request 
        = UnityEngine.Networking.UnityWebRequestAssetBundle.GetAssetBundle(uri, 0);
    yield return request.SendWebRequest();
    AssetBundle bundle = DownloadHandlerAssetBundle.GetContent(request);
    GameObject cube = bundle.LoadAsset<GameObject>("Cube");
    GameObject sprite = bundle.LoadAsset<GameObject>("Sprite");
    Instantiate(cube);
    Instantiate(sprite);
}

Memuat Aset dari AssetBundles

Sekarang Anda telah berhasil mengunduh Anda AsetBundle, saatnya untuk akhirnya dimuat dalam beberapa Aset.

snippet kode generik:

T objectFromBundle = bundleObject.LoadAsset<T>(assetName);

T adalah jenis Aset yang Anda coba untuk memuat.

Ada beberapa pilihan ketika memutuskan cara memuat Aset. Kami memiliki LoadAsset, LoadAllAssets, dan rekan Async mereka LoadAssetAsync dan LoadAllAssetsAsync masing-masing.

Ini adalah cara memuat aset dari AsetBundles secara serentak:

Untuk memuat GameObject tunggal:

GameObject gameObject = loadedAssetBundle.LoadAsset<GameObject>(assetName);

Untuk memuat semua aset:

Unity.Object[] objectArray = loadedAssetBundle.LoadAllAssets();

Sekarang, di mana metode yang ditunjukkan sebelumnya mengembalikan jenis objek yang Anda bongkar atau array objek, metode asinkron mengembalikan AssetBundleRequest. Anda harus menunggu operasi ini untuk menyelesaikan sebelum mengakses aset. Untuk memuat aset:

AssetBundleRequest request = loadedAssetBundleObject.LoadAssetAsync<GameObject>(assetName);
yield return request;
var loadedAsset = request.asset;

Dan

AssetBundleRequest request = loadedAssetBundle.LoadAllAssetsAsync();
yield return request;
var loadedAssets = request.allAssets;

Setelah Anda dimuat Aset Anda bagus untuk pergi! Anda dapat menggunakan objek yang dimuat seperti yang Anda inginkan.

Memuat AsetBundle Manifests

Memuat manifestasi AssetBundle dapat sangat berguna. Terutama ketika berurusan dengan ketergantungan Aset.

Untuk mendapatkan objek AssetBundleManifest yang dapat digunakan, Anda harus memuat bahwa AsetBundle tambahan (yang bernama hal yang sama dengan folder itu di) dan memuat objek AsetBundleManifest dari itu.

Memuat manifestasi itu sendiri dilakukan persis sama dengan Aset lain dari AsetBundle:

AssetBundle assetBundle = AssetBundle.LoadFromFile(manifestFilePath);
AssetBundleManifest manifest = assetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");

Sekarang Anda memiliki akses ke panggilan API AssetBundleManifest melalui objek manifest dari contoh di atas. Dari sini Anda dapat menggunakan manifestasi untuk mendapatkan informasi tentang AssetBundles yang Anda bangun. Informasi ini termasuk data ketergantungan, data hash, dan data varian untuk AssetBundles.

Ingat di bagian sebelumnya ketika kita membahas dependensi AsetBundle dan bagaimana, jika bundel memiliki ketergantungan pada bundel lain, bundel tersebut harus dimuat sebelum memuat Aset dari bundel asli? Objek manifestasi membuat secara dinamis menemukan ketergantungan pemuatan. Katakanlah kita ingin memuat semua ketergantungan untuk AsetBundle bernama “assetBundle”.

AssetBundle assetBundle = AssetBundle.LoadFromFile(manifestFilePath);
AssetBundleManifest manifest = assetBundle.LoadAsset<AssetBundleManifest>("AssetBundleManifest");
string[] dependencies = manifest.GetAllDependencies("assetBundle"); //Pass the name of the bundle you want the dependencies for.
foreach(string dependency in dependencies)
{
    AssetBundle.LoadFromFile(Path.Combine(assetBundlePath, dependency));
}

Sekarang Anda memuat AssetBundles, dependensi Aset, dan Aset, saatnya untuk berbicara tentang mengelola semua Aset yang dimuat ini.

Mengelola Aset Dimuat

Sitemap Paket ini menyediakan sistem siap pakai untuk mengelola pemuatan Aset Bundes, dependencies, dan Aset. Unity merekomendasikan menggunakan Alamat daripada mengelola AssetBundles sendiri.Note: The package provides a ready-made system to manage loading Asset Bundes, dependencies, and Assets. Unity recommends using Addressables rather than managing AssetBundles yourself.

Lihat juga: Unity Pelajari tutorial tentang

Unity tidak membongkar secara otomatis Objek saat dihapus dari sceneAdegan berisi lingkungan dan menu permainan Anda. Pikirkan setiap file Adegan unik sebagai tingkat yang unik. Di setiap Adegan, Anda menempatkan lingkungan, hambatan, dan dekorasi, pada dasarnya merancang dan membangun permainan Anda dalam potongan-potongan. More info
Lihat di Glossary
aktif. Pembersihan aset dipicu pada waktu tertentu, dan juga dapat dipicu secara manual.

Penting untuk mengetahui kapan memuat dan membongkar AssetBundle. Improperly membongkar AsetBundle dapat menyebabkan benda duplikat dalam memori atau keadaan yang tidak diinginkan lainnya, seperti tekstur yang hilang.

Hal-hal terbesar untuk memahami tentang manajemen asetBundle adalah ketika memanggil AssetBundle.Unload(bool) - atau AssetBundle.UnloadAsync(bool) - dan jika Anda harus lulus benar atau palsu ke panggilan fungsi. Unload adalah fungsi non-statis yang akan membongkar AssetBundle Anda. API ini membongkar informasi header dari AssetBundle yang disebut. Argumen menunjukkan apakah untuk juga membongkar semua Objek yang sesaat dari AssetBundle ini.

AssetBundle.Unload(true) membongkar semua GameObjects (dan ketergantungan mereka) yang dimuat dari AssetBundle. Ini tidak termasuk GameObjects yang disalin (seperti GameObjects Instan), karena mereka tidak lagi milik AssetBundle. Ketika ini terjadi, Tekstur yang dimuat dari AsetBundle (dan masih miliknya) hilang dari GameObjects di Adegan, dan Unity memperlakukan mereka sebagai Tekstur yang hilang.

Mari kita asumsikan Bahan M dimuat dari AssetBundle AB seperti yang ditunjukkan di bawah ini dan digunakan dalam PrefabJenis 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
P.

Jika AB.Unload(true) disebut. Setiap kasus M di adegan aktif juga akan dibongkar dan hancur.

Jika Anda bukan memanggil AB. Unload(false) itu akan memecah rantai instance M dan AB saat ini.

Jika AB dimuat lagi kemudian dan AB.LoadAsset() disebut, Unity tidak akan kembali-link salinan M yang ada ke Bahan yang baru dimuat.

Jika Anda membuat instance lain dari Prefab P, itu tidak akan menggunakan salinan yang ada dari M. Alih-alih dua salinan M dimuat.

Umumnya, menggunakan AssetBundle.Unload(false) tidak menyebabkan situasi yang ideal. Sebagian besar proyek harus menggunakan AssetBundle.Unload(true) dan mengadopsi metode untuk memastikan bahwa Objek tidak digandakan. Dua metode umum adalah:

  • Memiliki poin terdefinisi dengan baik selama masa pakai aplikasi di mana transien AsetBundles dibongkar, seperti antara tingkat atau selama layar pemuatan.

  • Mempertahankan nomor referensi untuk individu Objek dan bongkar AssetBundles hanya ketika semua objek konstituen mereka tidak digunakan. Ini memungkinkan aplikasi untuk membongkar & memuat ulang objek individu tanpa menggandakan memori.

Jika aplikasi harus menggunakan AssetBundle.Unload(false), maka objek individu hanya dapat dibongkar dalam dua cara:

  • Menghilangkan semua referensi ke objek yang tidak diinginkan, baik di tempat kejadian dan kode. Setelah ini dilakukan, hubungi Sumber Daya.UnloadUnusedAssets.

  • Beban adegan non-additively. Ini akan menghancurkan semua objek dalam adegan saat ini dan invoke Sumber Daya.UnloadUnusedAssets secara otomatis.

Ketergantungan AsetBundle
Kompresi asetBundle