Penggunaan Paket Aset dalam Unity

Unity memiliki banyak fitur bermanfaat, salah satunya adalah dukungan Asset Bundles.

Apa itu Kumpulan Aset?

Paket Aset adalah file yang berisi aset game, mulai dari aset sederhana seperti model 3D, tekstur, dan klip audio, hingga aset yang lebih kompleks, seperti Adegan dan Prefab.

Namun skrip tidak dapat disertakan dalam Paket Aset, hanya referensi saja, jadi berhati-hatilah saat mengganti nama atau memindahkannya, karena akan memutus koneksi dan Anda harus membangun kembali Paket Aset agar dapat berfungsi kembali.

Kapan Menggunakan Kumpulan Aset?

Gunakan Paket Aset ketika game Anda memiliki banyak aset dan memasukkannya ke dalam build akan memengaruhi waktu pengunduhan awal.

Mengekspor Kumpulan Aset

Mengekspor Paket Aset dilakukan dalam dua langkah: menetapkan nama Paket Aset dan membuatnya menggunakan Editor skrip.

Menetapkan nama Paket Aset

Untuk menetapkan nama Asset Bundle, pilih aset di tampilan Project (bisa Prefab, Texture, atau bahkan Scene), lalu di tampilan Inspector di bagian paling bawah klik menu dropdown, lalu klik 'New...' (atau klik nama Paket Aset yang ada).

Menetapkan nama paket yang sama ke beberapa aset akan mengemasnya menjadi satu dalam Paket Aset yang sama. Disarankan untuk mengemas Adegan secara terpisah dari aset lainnya.

Selain itu, Anda tidak perlu menetapkan nama Paket Aset untuk setiap aset. Biasanya Anda hanya perlu menetapkan nama bundel ke prefab atau aset utama, dependensi lainnya akan disertakan secara otomatis.

Membangun Kumpulan Aset

Untuk membuat Paket Aset, ikuti langkah-langkah di bawah ini:

  • Buat folder baru bernama Editor (jika Anda belum punya)
  • Buat skrip baru di dalam folder Editor, beri nama BuildAssetBundles lalu tempelkan kode di bawah ini di dalamnya:

BuildAssetBundles.cs

using UnityEngine;
using UnityEditor;

public class BuildAssetBundles
{
    [MenuItem("Build/Build AssetBundles")]
    static void BuildAllAssetBundles()
    {
        string outputFolder = "Assets/__Bundles";

        //Check if __Bundles folder exist
        if (!AssetDatabase.IsValidFolder(outputFolder))
        {
            Debug.Log("Folder '__Bundles' does not exist, creating new folder");

            AssetDatabase.CreateFolder("Assets", "__Bundles");
        }

        BuildPipeline.BuildAssetBundles(outputFolder, BuildAssetBundleOptions.ChunkBasedCompression, EditorUserBuildSettings.activeBuildTarget);
    }
}

Setelah menyimpannya, Anda akan melihat tombol menu akan ditambahkan (Build -> Build AssetBundles). Mengkliknya akan membuat Kumpulan Aset dan menempatkannya di folder "__Bundles".

Memuat Paket Aset

Untuk memuat Paket Aset, pertama-tama perlu diunduh menggunakan UnityWebRequest lalu dibongkar menggunakan fungsi khusus. Secara umum, ada 2 jenis Asset Bundle, yaitu yang berisi aset dan yang berisi Scene.

Memuat Aset Dari Kumpulan Aset

Kode di bawah mengunduh Bundel Aset bernama "fpsplayer" lalu mengekstrak Prefab bernama "FPSPlayer" dan membuat instance-nya di Scene:

        int assetBundleVersion = 1; // Changing this number will force Asset Bundle reload
        string assetBundlePath = "file://" + Application.dataPath + "/__Bundles/" + "fpsplayer"; // Path to Asset Bundle file
        using (UnityEngine.Networking.UnityWebRequest www = UnityEngine.Networking.UnityWebRequestAssetBundle.GetAssetBundle(assetBundlePath, (uint)assetBundleVersion, 0))
        {
            yield return www.SendWebRequest();

            if (www.isNetworkError || www.isHttpError)
            {
                Debug.LogError("AssetBundle Error: " + www.error);
                yield return null;
            }
            else
            {
                // Get downloaded Asset Bundle
                AssetBundle assetBundle = UnityEngine.Networking.DownloadHandlerAssetBundle.GetContent(www);
                // Extract Prefab named "FPSPlayer" from the Asset Bundle
                GameObject playerPrefab = assetBundle.LoadAsset("FPSPlayer") as GameObject;
                // Instantiate Player Prefab
                Instantiate(playerPrefab, Vector3.zero, Quaternion.identity);
                // Unload Asset Bundle from memory (but do not destroy the existing instance(s))
                assetBundle.Unload(false);
            }
        }

Memuat Adegan Dari Kumpulan Aset

Memuat Adegan dari Paket Aset dilakukan sedikit berbeda.

Kode di bawah ini akan mengunduh Bundel Aset dengan Adegan dan membuatnya tersedia untuk dimuat:

        int assetBundleVersion = 1; // Changing this number will force Asset Bundle reload
        string assetBundlePath = "file://" + Application.dataPath + "/__Bundles/" + "testscene"; // Path to Asset Bundle file
        using (UnityEngine.Networking.UnityWebRequest www = UnityEngine.Networking.UnityWebRequestAssetBundle.GetAssetBundle(assetBundlePath, (uint)assetBundleVersion, 0))
        {
            yield return www.SendWebRequest();

            if (www.isNetworkError || www.isHttpError)
            {
                Debug.LogError("AssetBundle Error: " + www.error);
                yield return null;
            }
            else
            {
                // Get downloaded Asset Bundle (This will make the Scene available for load)
                AssetBundle assetBundle = UnityEngine.Networking.DownloadHandlerAssetBundle.GetContent(www);
                // Load the Scene extracted from the Asset Bundle
                UnityEngine.SceneManagement.SceneManager.LoadScene("TestScene");
            }
        }
Artikel yang Disarankan
Panduan Audio dalam Unity
Generasi Dunia Prosedural dalam Persatuan
Cara Melukis Pohon di Medan dengan Unity
Strategi Melindungi Unity Games dari Pembajakan
Cara Memilih Musik Latar Belakang yang Tepat untuk Game Anda di Unity
Aset Tujuan Umum yang Harus Dimiliki untuk Persatuan
Membandingkan Lingkungan Pengembangan 2D dan 3D di Unity