Использование пакета ресурсов в Unity

Unity имеет множество полезных функций, одна из них — поддержка Asset Bundles.

Что такое пакеты активов?

Пакеты ресурсов — это файлы, содержащие игровые ресурсы: от простых ресурсов, таких как 3D-модели, текстуры и аудиоклипы, до более сложных, таких как сцены и Префабы.

Однако скрипты не могут быть включены в пакеты активов, а только их ссылки, поэтому будьте осторожны при их переименовании или перемещении, так как это нарушит соединение, и вам придется пересобирать пакеты активов, чтобы они снова заработали.

Когда использовать пакеты активов?

Используйте пакеты ресурсов, если в вашей игре много ресурсов и их включение в сборку влияет на начальное время загрузки.

Экспорт пакетов ресурсов

Экспорт пакетов ресурсов выполняется в два этапа: присвоение имен пакетам ресурсов и их создание с помощью редактора script.

Присвоение имен пакетам активов

Чтобы назначить имя пакета ресурсов, выберите ресурс в представлении «Проект» (это может быть «Префаб», «Текстура» или даже «Сцена»), затем в представлении «Инспектор» в самом низу щелкните раскрывающееся меню, затем нажмите '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, а затем распаковать с помощью специальной функции. Как правило, существует два типа пакетов ресурсов: те, которые содержат ресурсы, и те, которые содержат сцены.

Загрузка ресурсов из пакетов активов

Код ниже загружает Asset Bundle с именем "fpsplayer", затем извлекает префаб с именем "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
Как создать игру в стиле FNAF в Unity
Сравнение сред разработки 2D и 3D в Unity
Как рисовать деревья на местности в Unity
Стратегии защиты игр Unity от пиратства
Как выбрать подходящую фоновую музыку для вашей игры в Unity
Необходимые ресурсы общего назначения для Unity