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");
            }
        }
Articole sugerate
Ghid pentru audio în Unity
Cum să pictezi copaci pe teren în Unity
Active obligatorii cu scop general pentru Unity
Generația mondială procedurală în unitate
Cum să importați animații în Unity
Strategii pentru a proteja Unity Games de piraterie
Cum să faci un joc inspirat de FNAF în Unity