Wykorzystanie pakietu zasobów w Unity

Unity posiada wiele przydatnych funkcji, jedną z nich jest obsługa pakietów zasobów.

Czym są pakiety aktywów?

Pakiety zasobów to pliki zawierające zasoby gry, od prostych zasobów, takich jak modele 3D, tekstury i klipy audio, po bardziej złożone, takie jak sceny i prefabrykaty.

Skryptów nie można jednak dołączać do pakietów zasobów, a jedynie do ich odniesień, dlatego należy zachować ostrożność podczas zmiany ich nazwy lub przenoszenia, ponieważ spowoduje to zerwanie połączenia i konieczne będzie odbudowanie pakietów zasobów, aby ponownie działały.

Kiedy stosować pakiety zasobów?

Korzystaj z pakietów zasobów, jeśli gra zawiera dużo zasobów, a uwzględnienie ich w kompilacji wpływa na początkowy czas pobierania.

Eksportowanie pakietów zasobów

Eksportowanie pakietów zasobów odbywa się w dwóch krokach: przypisanie nazw pakietów zasobów i budowanie ich za pomocą edytora script.

Przypisywanie nazw pakietów zasobów

Aby przypisać nazwę pakietu zasobów, wybierz zasób w widoku projektu (może to być prefabrykat, tekstura lub nawet scena), następnie w widoku inspektora na samym dole kliknij menu rozwijane, a następnie kliknij 'New...' (lub kliknij nazwę istniejącego pakietu zasobów).

Przypisanie tej samej nazwy pakietu do wielu zasobów spowoduje ich spakowanie w tym samym pakiecie zasobów. Zaleca się pakowanie Scen oddzielnie od reszty zasobów.

Ponadto nie musisz przypisywać nazwy pakietu zasobów do każdego zasobu. Zwykle wystarczy przypisać nazwę pakietu do głównego prefabrykatu lub zasobu, pozostałe zależności zostaną uwzględnione automatycznie.

Tworzenie pakietów zasobów

Aby zbudować pakiety zasobów, wykonaj poniższe czynności:

  • Utwórz nowy folder o nazwie Edytor (jeśli go nie masz)
  • Utwórz nowy skrypt w folderze Editor, nadaj mu nazwę BuildAssetBundles, a następnie wklej do niego poniższy kod:

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

Po zapisaniu zauważysz, że dodany zostanie przycisk menu (Buduj -> Buduj pakiety zasobów). Kliknięcie go spowoduje utworzenie pakietów zasobów i umieszczenie ich w folderze "__Bundles".

Ładowanie pakietów zasobów

Aby załadować pakiet zasobów, należy go najpierw pobrać przy użyciu UnityWebRequest, a następnie rozpakować przy użyciu specjalnej funkcji. Ogólnie rzecz biorąc, istnieją 2 rodzaje pakietów zasobów, te, które zawierają zasoby i te, które zawierają sceny.

Ładowanie aktywów z pakietów aktywów

Poniższy kod pobiera pakiet zasobów o nazwie "fpsplayer", następnie wyodrębnia prefabrykat o nazwie "FPSPlayer" i tworzy jego instancję w Scenie:

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

Ładowanie scen z pakietów zasobów

Ładowanie sceny z pakietu zasobów odbywa się nieco inaczej.

Poniższy kod pobierze pakiet zasobów ze sceną i udostępni go do załadowania:

        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");
            }
        }
Sugerowane artykuły
Przewodnik po dźwięku w Unity
Porównanie środowisk programistycznych 2D i 3D w Unity
Jak importować animacje do Unity
Strategie ochrony gier Unity przed piractwem
Niezbędne zasoby ogólnego przeznaczenia dla Unity
Implementowanie koncepcji programowania obiektowego (OOP) w Unity
Samouczek Unity Cinemachine i osi czasu