Utilizarea pachetului de active în Unity
Unity are multe caracteristici utile, una dintre ele este suportul pentru pachetele de active.
Ce sunt pachetele de active?
Pachetele de materiale sunt fișiere care conțin elemente de joc, de la elemente simple, cum ar fi modele 3D, texturi și clipuri audio, până la altele mai complexe, cum ar fi Scene și Prefabs.
Cu toate acestea, scripturile nu pot fi incluse în pachetele de active, ci doar referințele lor, așa că aveți grijă când le redenumești sau le mutați, deoarece va rupe conexiunea și va trebui să reconstruiți pachetele de active pentru a le face să funcționeze din nou.
Când să folosiți pachetele de active?
Utilizați pachetele de active atunci când jocul dvs. are o mulțime de active și includerea acestora în versiune afectează timpul inițial de descărcare.
Exportarea pachetelor de active
Exportarea pachetelor de active se face în doi pași: atribuirea numelor pachetelor de active și construirea lor folosind Editorul script.
Atribuirea numelor pachetelor de active
Pentru a atribui numele pachetului de active, selectați activul în vizualizarea Proiect (aceasta poate fi prefabricat, textura sau chiar o scenă), apoi în vizualizarea Inspector din partea de jos, faceți clic pe meniul drop-down, apoi faceți clic pe 'New...' (sau faceți clic pe numele pachetului de active existent).
Atribuirea aceluiași nume de pachet mai multor materiale le va împacheta în același pachet de active. Se recomandă să împachetați Scenele separat de restul activelor.
De asemenea, nu trebuie să atribuiți un nume de pachet de active fiecărui material. De obicei, trebuie doar să atribuiți numele pachetului prefabricatului sau activului principal, restul dependențelor vor fi incluse automat.
Pachete de active de construcție
Pentru a crea pachete de active, urmați pașii de mai jos:
- Creați un folder nou numit Editor (dacă nu aveți niciunul)
- Creați un nou script în folderul Editor, denumiți-l BuildAssetBundles apoi inserați codul de mai jos în interiorul acestuia:
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);
}
}
După ce îl salvați, veți observa că va adăuga un buton de meniu (Build -> Build AssetBundles). Făcând clic pe acesta, se vor construi pachetele de active și le vor plasa în folderul "__Bundles".
Se încarcă pachetele de active
Pentru a încărca pachetul de active, acesta trebuie mai întâi descărcat folosind UnityWebRequest și apoi dezambalat folosind o funcție specială. În general, există 2 tipuri de pachete de active, cele care conțin active și cele care conțin scene.
Încărcarea activelor din pachetele de active
Codul de mai jos descarcă Asset Bundle numit "fpsplayer", apoi extrage prefabricatul numit "FPSPlayer" și îl instanțează în Scenă:
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);
}
}
Încărcarea scenelor din pachetele de active
Încărcarea scenei din pachetul de active se face ușor diferit.
Codul de mai jos va descărca pachetul de active cu o scenă și îl va face disponibil pentru încărcare:
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");
}
}