Asset Bundle-bruk i Unity

Unity har mange nyttige funksjoner, en av dem er støtte for Asset Bundles.

Hva er aktivapakker?

Asset Bundles er filer som inneholder spillressurser, fra enkle eiendeler som 3D-modeller, teksturer og lydklipp, til mer komplekse, som Scenes og Prefabs.

Skript kan imidlertid ikke inkluderes i Asset Bundles, bare referansene deres, så vær forsiktig når du gir dem nytt navn eller flytter dem, da det vil bryte forbindelsen og du må gjenoppbygge Asset Bundles for å få dem til å fungere igjen.

Når skal man bruke aktivapakker?

Bruk Asset Bundles når spillet ditt har mange eiendeler og å inkludere dem i bygget påvirker den første nedlastingstiden.

Eksport av aktivapakker

Eksportering av aktivapakker gjøres i to trinn: å tildele navn på aktivabunter og bygge dem ved hjelp av redigeringsskriptet .

Tilordne navn på aktivabunter

For å tildele Asset Bundle-navnet, velg ressursen i prosjektvisningen (dette kan være prefab, tekstur eller til og med en scene), og klikk deretter på rullegardinmenyen i inspektørvisningen helt nederst, og klikk deretter 'New...' (eller klikk på navnet på den eksisterende ressursgruppen).

Hvis du tildeler samme pakkenavn til flere eiendeler, vil de pakkes sammen i samme pakke. Det anbefales å pakke Scener separat fra resten av eiendelene.

Du trenger heller ikke å tildele et Asset Bundle-navn til hver eiendel. Vanligvis trenger du bare å tildele pakkenavnet til hovedprefabrikken eller aktivaen, resten av avhengighetene vil bli inkludert automatisk.

Bygg aktivapakker

Følg trinnene nedenfor for å bygge aktivapakker:

  • Opprett en ny mappe kalt Editor (hvis du ikke har noen)
  • Opprett et nytt skript i Editor-mappen, navngi det BuildAssetBundles og lim inn koden nedenfor i den:

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

Etter å ha lagret den vil du legge merke til at den vil legge til en menyknapp (Bygg -> Bygg AssetBundles). Hvis du klikker på den, bygges Asset Bundles og plasseres i "__Bundles"-mappen.

Laster inn aktivapakker

For å laste Asset Bundle må den først lastes ned ved hjelp av UnityWebRequest og deretter pakkes ut ved hjelp av en spesiell funksjon. Generelt er det 2 typer aktivapakker, de som inneholder aktiva og de som inneholder scener.

Laster inn eiendeler fra aktivapakkene

Koden nedenfor laster ned Asset Bundle kalt "fpsplayer" og trekker deretter ut Prefab-navnet "FPSPlayer" og instansierer den i scenen:

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

Laster inn scener fra aktivapakkene

Lasting av scene fra Asset Bundle gjøres litt annerledes.

Koden nedenfor vil laste ned Asset Bundle with a Scene og gjøre den tilgjengelig for innlasting:

        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");
            }
        }
Foreslåtte artikler
Guide til lyd i Unity
Hvordan male trær på terreng i enhet
Velg riktig Skybox for miljøet ditt i Unity
Strategier for å beskytte Unity Games fra piratkopiering
Hvordan velge riktig bakgrunnsmusikk for spillet ditt i Unity
Må-ha generelle eiendeler for enhet
Prosedyremessig verdensgenerasjon i enhet