Användning av tillgångspaket i Unity

Unity har många användbara funktioner, en av dem är stöd för Asset Bundles.

Vad är tillgångspaket?

Asset Bundles är filer som innehåller speltillgångar, från enkla tillgångar som 3D-modeller, texturer och ljudklipp, till mer komplexa sådana, som scener och Prefabs.

Skript kan dock inte inkluderas i Asset Bundles, bara deras referenser, så var försiktig när du byter namn eller flyttar dem, eftersom det kommer att bryta anslutningen och du måste bygga om Asset Bundles för att få dem att fungera igen.

När ska man använda tillgångspaket?

Använd Asset Bundles när ditt spel har många tillgångar och att inkludera dem i bygget påverkar den initiala nedladdningstiden.

Exportera tillgångspaket

Export av tillgångspaket görs i två steg: att tilldela tillgångspaketnamn och bygga dem med hjälp av Editor-skriptet.

Tilldela namn på tillgångspaket

För att tilldela Asset Bundle-namnet, välj tillgången i projektvyn (detta kan vara Prefab, Texture eller till och med en scen), klicka sedan på inspektörsvyn längst ner på rullgardinsmenyn och klicka sedan på 'New...' (eller klicka på det befintliga Asset Bundle-namnet).

Att tilldela samma paketnamn till flera tillgångar kommer att packa dem i samma tillgångspaket. Det rekommenderas att packa scener separat från resten av tillgångarna.

Du behöver inte heller tilldela ett Asset Bundle-namn till varje tillgång. Vanligtvis behöver du bara tilldela paketnamnet till huvudprefab eller tillgång, resten av beroenden kommer att inkluderas automatiskt.

Bygga tillgångspaket

Följ stegen nedan för att bygga tillgångspaket:

  • Skapa en ny mapp som heter Editor (om du inte har någon)
  • Skapa ett nytt skript i Editor-mappen, döp det till BuildAssetBundles och klistra sedan in koden nedan i det:

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

När du har sparat den kommer du att lägga till en menyknapp (Bygg -> Bygg AssetBundles). Om du klickar på den bygger du tillgångspaketen och placerar dem i mappen "__Bundles".

Laddar tillgångspaket

För att ladda tillgångspaketet måste det först laddas ned med UnityWebRequest och sedan packas upp med en speciell funktion. Generellt finns det två typer av tillgångspaket, de som innehåller tillgångar och de som innehåller scener.

Laddar tillgångar från tillgångspaketen

Koden nedan laddar ned Asset Bundle med namnet "fpsplayer" och extraherar sedan prefab med namnet "FPSPlayer" och instansierar 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);
            }
        }

Laddar scener från tillgångspaketen

Att ladda scen från Asset Bundle görs något annorlunda.

Koden nedan laddar ned tillgångspaketet med en scen och gör det tillgängligt för laddning:

        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");
            }
        }
Föreslagna artiklar
Guide till ljud i Unity
Strategier för att skydda Unity Games från piratkopiering
Hur man målar träd på terräng i Unity
Hur man importerar animationer till Unity
Att välja rätt Skybox för din miljö i Unity
Hur man gör ett FNAF-inspirerat spel i Unity
Betydelsen av storytelling i Unity Game Development