Використання набору ресурсів в Unity

Unity має багато корисних функцій, однією з яких є підтримка пакетів активів.

Що таке пакети активів?

Пакети активів — це файли, які містять ігрові ресурси, від простих ресурсів, таких як 3D-моделі, текстури та аудіокліпи, до більш складних, таких як сцени та Prefabs.

Однак сценарії не можна включати в набори активів, а лише на їхні посилання, тому будьте обережні, перейменовуючи або переміщуючи їх, оскільки це призведе до розриву з’єднання, і вам потрібно буде перебудувати пакети активів, щоб вони знову працювали.

Коли використовувати пакети активів?

Використовуйте Asset Bundles, якщо у вашій грі є багато активів і їхнє включення в збірку впливає на початковий час завантаження.

Експорт пакетів активів

Експорт наборів активів виконується у два етапи: призначення назв пакетів активів і створення їх за допомогою редактора script.

Призначення назв наборів активів

Щоб призначити назву набору ресурсів, виберіть ресурс у вікні «Проект» (це може бути Prefab, Texture або навіть Scene), потім у вікні «Інспектор» у самому низу клацніть спадне меню, а потім натисніть 'New...' (або клацніть назву наявного набору ресурсів).

Призначення тієї самої назви комплекту кільком ресурсам упакує їх разом в один пакет ресурсів. Рекомендується упаковувати сцени окремо від решти ресурсів.

Крім того, вам не потрібно призначати ім’я Asset Bundle для кожного активу. Зазвичай вам потрібно лише призначити назву комплекту для основного префабу або ресурсу, решта залежностей буде включено автоматично.

Створення пакетів активів

Щоб створити пакети активів, виконайте наведені нижче дії.

  • Створіть нову папку під назвою Editor (якщо у вас її немає)
  • Створіть новий сценарій у папці Editor, назвіть його BuildAssetBundles, а потім вставте в нього наведений нижче код:

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

Після збереження ви помітите, що він додасть кнопку меню (Build -> Build AssetBundles). Натиснувши її, ви створите пакети активів і розмістите їх у папці "__Bundles".

Завантаження пакетів ресурсів

Щоб завантажити пакет Asset Bundle, його спочатку потрібно завантажити за допомогою UnityWebRequest, а потім розпакувати за допомогою спеціальної функції. Загалом існує 2 типи наборів ресурсів: ті, що містять ресурси, і ті, що містять сцени.

Завантаження активів із пакетів активів

Наведений нижче код завантажує пакет Asset Bundle під назвою "fpsplayer", потім витягує Prefab під назвою "FPSPlayer" і створює його екземпляр у сцені:

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

Завантаження сцен із пакетів ресурсів

Завантаження сцени з набору активів виконується дещо інакше.

Наведений нижче код завантажить пакет Asset Bundle зі сценою та зробить його доступним для завантаження:

        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");
            }
        }
Рекомендовані статті
Посібник із аудіо в Unity
Необхідні активи загального призначення для Unity
Порівняння 2D і 3D середовищ розробки в Unity
Процедурне генерування світу в єдності
Як малювати дерева на місцевості в Unity
Як імпортувати анімацію в Unity
Вибір відповідного Skybox для вашого середовища в Unity