Unity 6.3
0 онлайн 3 гостей 3 в системе
Вход

Включение дополнительных файлов в сборку

StreamingAssets является зарезервированная папка который можно использовать, чтобы сделать файлы доступными для сборки проигрывателя напрямую и обойти стандартный процесс сборки проекта. Стандартный процесс сборки сериализирует сцены и ассеты в двоичные файлы внутри генерируемого проигрывателя. StreamingAssets позволяет добавлять файлы, которые уже имеют правильный формат для целевой платформы и которые приложение может загрузить напрямую.

Примеры использования включают:

  • Файлы конфигурации в JSON, XML, SQLite или других форматах.
  • Видеофайлы, например, фильмы на устройствах iOS.
  • Файлы, требуемые плагинами.
  • AssetBundles (описано ниже).

Папка StreamingAssets должна находиться в корне папки Assets в папке Assets/StreamingAssets. Имя зависит от регистра и должно быть точно StreamingAssets. Любые файлы в этой папке копируются без изменений в вывод Player. При развертывании на конечном устройстве файлы копируются в соответствующее место для платформы.

Совет: Чтобы избежать дополнительной нагрузки на Unity, автоматически импортирующую каждый файл из StreamingAssets, вы можете добавить содержимое из других каталогов во время процесса сборки, вызвав AddAdditionalPathToStreamingAssets из обратного вызова, который реализует BuildPlayerProcessor.PrepareForBuild. Это полезно, если, например, ваше содержимое является большим и генерируется.

Доступ к потоковому контенту

Местоположение папки StreamingAssets в развернутом приложении варьируется в зависимости от платформы. Чтобы надежно получить путь к папке StreamingAssets, используйте свойство Application.streamingAssetsPath, поскольку оно всегда указывает на правильное местоположение на текущей платформе узла.

На большинстве платформ Application.streamingAssetsPath является каталогом, доступным через обычную файловую систему APIs.

На Android и веб-платформе невозможно получить доступ к потоковым файлам ассетов непосредственно через файловую систему APIs, поскольку эти платформы возвращают URL. Используйте UnityWebRequest класс, чтобы обратиться к содержимому.

В следующем примере загружается файл из папки StreamingAssets:

using UnityEngine;
using UnityEngine.Networking;
using System.Collections;
using System;

public class LoadStreamingAssets : MonoBehaviour
{
    void Start()
    {
        // Pass the specific filename and the callback method
        StartCoroutine(LoadFile("config.json", OnFileLoaded));
    }

    // This callback receives the raw string data once the coroutine finishes
    void OnFileLoaded(string loadedText)
    {
        if (string.IsNullOrEmpty(loadedText))
        {
            Debug.LogError("File data was empty or failed to load.");
            return;
        }

        // The data is now safely out of the coroutine.
        // You can parse it here (e.g., JsonUtility, XML, custom parsing)
        Debug.Log("File loaded successfully: " + loadedText);
    }

    IEnumerator LoadFile(string fileName, Action<string> callback)
    {
        string fileContent = "";
        string filePath = System.IO.Path.Combine(Application.streamingAssetsPath, fileName);

        if (filePath.StartsWith("jar") || filePath.StartsWith("http"))
        {
            // Special case to access StreamingAsset content on Android and Web
            UnityWebRequest request = UnityWebRequest.Get(filePath);
            yield return request.SendWebRequest();

            if (request.result == UnityWebRequest.Result.Success)
            {
                fileContent = request.downloadHandler.text;
            }
            else
            {
                Debug.LogError($"Failed to load StreamingAsset: {request.error}");
            }
        }
        else
        {
            // Regular file path on most platforms and in Editor
            if (System.IO.File.Exists(filePath))
            {
                fileContent = System.IO.File.ReadAllText(filePath);
            }
            else
            {
                Debug.LogError($"File not found at: {filePath}");
            }
        }

        // Send the loaded content back to the caller
        callback?.Invoke(fileContent);
    }
}

Примечание: Если вы хотите загрузить данные из JSON файл, используйте методы в JsonUtility class.

Ограничения папки StreamingAssets

  • Во время выполнения местоположение StreamingAssets доступно только для чтения, и вы не можете изменять или записывать в него новые файлы. Для записи файлов вы можете использовать Application.persistentDataPath.
  • Не помещайте файлы Unity (например, .unity, .prefabи .asset) в папку StreamingAssets. Эти типы файлов должны быть обработаны Проигрывателем или сборкой AssetBundle, чтобы их можно было загрузить во время выполнения.
  • .dll и файлы скриптов, находящиеся в папке StreamingAssets, не включаются при компиляции скриптов.

AssetBundles и папка StreamingAssets

Папка StreamingAssets полезна, если вы собираетесь распространять AssetBundles непосредственно в установке Проигрывателя, а не загружать их по требованию.

Для этого:

  1. Соберите AssetBundles в выходной каталог внутри Assets/StreamingAssets. Примечание: файлы .manifest, создаваемые вместе с файлами AssetBundle, не требуются во время выполнения и могут быть удалены. Дополнительные сведения см. в разделе Формат файлов AssetBundle.
  2. Создайте проигрыватель. AssetBundles включены в вывод для конкретной платформы.
  3. Напишите код загрузки, который использует Application.streamingAssetsPath для определения пути к AssetBundles. В зависимости от платформы, вы можете загрузить их как локальный путь к файлу, или с UnityWebRequestAssetBundle. Примечание: На Android не нужно кэшировать AssetBundle или выполнять проверки CRC, потому что файл уже присутствует на локальном хранилище.

Пакет Addressables использует этот механизм автоматически для локального содержимого.

В качестве альтернативы, вы можете разместить AssetBundles и Addressables на удаленном сервере и загрузить их по требованию, а не использовать папку StreamingAssets. Это предпочтительнее в ситуациях, когда содержимое является большим или часто обновляется, или когда вы хотите избежать накладных расходов на выпуск новых сборок Player, когда вы хотите изменить или добавить новое содержимое.

Дополнительные ресурсы