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");
            }
        }
Articoli suggeriti
Guida all'audio in Unity
Strategie per proteggere Unity Games dalla pirateria
Risorse indispensabili per scopi generici per Unity
Generazione procedurale del mondo in Unity
Come dipingere alberi sul terreno in Unity
Come importare animazioni in Unity
Come realizzare un gioco ispirato a FNAF in Unity