Utilizzo del pacchetto di risorse in Unity

Unity ha molte funzioni utili, una di queste è il supporto per Asset Bundles.

Cosa sono i pacchetti di risorse?

I bundle di risorse sono file che contengono risorse di gioco, da risorse semplici come modelli 3D, trame e clip audio, a risorse più complesse, come scene e Prefabbricati.

Gli script, tuttavia, non possono essere inclusi in Asset Bundles, solo i loro riferimenti, quindi fai attenzione quando li rinomini o li sposti, poiché interromperà la connessione e dovrai ricostruire gli Asset Bundles per farli funzionare di nuovo.

Quando utilizzare i pacchetti di risorse?

Usa Asset Bundles quando il tuo gioco ha molte risorse e includerle nella build influisce sul tempo di download iniziale.

Esportazione di pacchetti di risorse

L'esportazione dei pacchetti di risorse avviene in due fasi: l'assegnazione dei nomi dei pacchetti di risorse e la loro creazione utilizzando lo script dell'Editor.

Assegnazione dei nomi dei pacchetti di risorse

Per assegnare il nome del pacchetto di asset, seleziona l'asset nella vista Progetto (può essere Prefabbricato, Texture o anche una Scena), quindi nella vista Inspector in fondo fai clic sul menu a discesa, quindi fai clic su 'New...' (oppure fai clic sul nome del pacchetto di risorse esistente).

L'assegnazione dello stesso nome di pacchetto a più risorse le impacchetta nello stesso pacchetto di risorse. Si consiglia di impacchettare le scene separatamente dal resto delle risorse.

Inoltre, non è necessario assegnare un nome di pacchetto di risorse a ogni risorsa. In genere è sufficiente assegnare il nome del pacchetto al prefabbricato o all'asset principale, il resto delle dipendenze verrà incluso automaticamente.

Pacchetti di risorse edilizie

Per creare pacchetti di risorse, procedi nel seguente modo:

  • Crea una nuova cartella chiamata Editor (se non ne hai)
  • Crea un nuovo script all'interno della cartella Editor, chiamalo BuildAssetBundles quindi incolla il codice sottostante al suo interno:

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

Dopo averlo salvato noterai che aggiungerà un pulsante di menu (Build -> Build AssetBundles). Facendo clic su di esso creerai i pacchetti di risorse e li posizionerai nella cartella "__Bundles".

Caricamento dei pacchetti di asset

Per caricare l'Asset Bundle, deve prima essere scaricato utilizzando UnityWebRequest e quindi decompresso utilizzando una funzione speciale. In genere, esistono 2 tipi di pacchetti di risorse, quelli che contengono risorse e quelli che contengono scene.

Caricamento di risorse dai pacchetti di risorse

Il codice seguente scarica il pacchetto di asset denominato "fpsplayer", quindi estrae il prefabbricato denominato "FPSPlayer" e ne crea un'istanza nella scena:

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

Caricamento di scene dai pacchetti di risorse

Il caricamento della scena dal pacchetto di risorse avviene in modo leggermente diverso.

Il codice seguente scaricherà l'asset bundle con una scena e lo renderà disponibile per il caricamento:

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