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