Assetbundelgebruik in eenheid

Unity heeft veel handige functies, een daarvan is ondersteuning voor Asset Bundles.

Wat zijn activabundels?

Assetbundels zijn bestanden die game-items bevatten, van eenvoudige items zoals 3D-modellen, texturen en audioclips, tot complexere items, zoals scènes en prefabs.

Scripts kunnen echter niet in Asset Bundles worden opgenomen, alleen hun referenties. Wees dus voorzichtig als u ze hernoemt of verplaatst, omdat hierdoor de verbinding wordt verbroken en u de Asset Bundles opnieuw moet opbouwen om ze weer te laten werken.

Wanneer moet u activabundels gebruiken?

Gebruik activabundels als uw game veel activa bevat en het opnemen ervan in de build van invloed is op de initiële downloadtijd.

Activabundels exporteren

Het exporteren van activabundels gebeurt in twee stappen: het toewijzen van namen aan activabundels en het bouwen ervan met behulp van het Editor script.

Namen van activabundels toewijzen

Om de naam van de assetbundel toe te wijzen, selecteert u het asset in de projectweergave (dit kan prefab, textuur of zelfs een scène zijn). Klik vervolgens in de infovenster helemaal onderaan op het vervolgkeuzemenu en klik vervolgens op 'New...' (of klik op de bestaande naam van de activabundel).

Als u dezelfde bundelnaam aan meerdere activa toewijst, worden ze samen in dezelfde activabundel verpakt. Het is raadzaam om scènes apart van de rest van de spullen in te pakken.

Bovendien hoeft u niet aan elk item een ​​Asset Bundle-naam toe te wijzen. Normaal gesproken hoeft u alleen de bundelnaam aan het hoofdprefab of asset toe te wijzen; de rest van de afhankelijkheden wordt automatisch opgenomen.

Activabundels bouwen

Volg de onderstaande stappen om activabundels samen te stellen:

  • Maak een nieuwe map met de naam Editor (als u die nog niet heeft)
  • Maak een nieuw script in de Editor-map, noem het BuildAssetBundles en plak de onderstaande code erin:

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);
    }
}

Nadat je het hebt opgeslagen, zul je merken dat er een menuknop wordt toegevoegd (Build -> Build AssetBundles). Als u erop klikt, worden de activabundels samengesteld en in de map "__Bundles" geplaatst.

Activabundels laden

Om de Asset Bundle te laden, moet deze eerst worden gedownload met UnityWebRequest en vervolgens worden uitgepakt met behulp van een speciale functie. Over het algemeen zijn er twee soorten activabundels: pakketten die activa bevatten en pakketten die scènes bevatten.

Activa uit de activabundels laden

De onderstaande code downloadt de activabundel met de naam "fpsplayer", extraheert vervolgens het prefab met de naam "FPSPlayer" en instantieert deze in de scène:

        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);
            }
        }

Scènes uit de activabundels laden

Het laden van scènes uit de activabundel gaat iets anders.

Met de onderstaande code wordt de activabundel met een scène gedownload en beschikbaar gemaakt voor laden:

        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");
            }
        }
Voorgestelde artikelen
Gids voor audio in eenheid
Kies in eenheid de juiste Skybox voor uw omgeving
Hoe bomen op terrein in eenheid te schilderen
Onmisbare middelen voor algemene doeleinden voor eenheid
Procedurele wereldgeneratie in eenheid
Het implementeren van Object-Oriented Programming (OOP)-concepten in eenheid
Een interactief menusysteem in eenheid bouwen