Unity - керівництво завантаження ресурсів в реальному часі
У деяких випадках корисно створити Ассет, доступний для проекту без його завантаження в якості частини сцени. Наприклад, там може бути персонаж або інший об'єкт, який може з'явитися в будь-якому місці гри, але який буде використовуватися лише зрідка (це може бути "секретна" функція, повідомлення про помилку або попередження про рекордний рахунку). Крім того, ви навіть можете завантажити ресурс з окремого файлу або через URL, щоб скоротити час початкового завантаження або додати в проект взаємозамінний контент.
Unity підтримує папки ресурсів в проекті (папки з назвою Resources), щоб розробник міг додати в збірку контент, який не буде завантажений до того як знадобиться. У Unity Pro, Unity iOS Advanced і Unity Android Advanced ви також можете створювати Ассет бандли. Це файли, повністю відокремлені від головної гри, які містять Ассет, до яких гра може отримати доступ при необхідності, з файлу або по URL.
Asset Bundles
Ассет бандл (Asset Bundle) - це зовнішня колекція Ассет. Ви можете мати безліч Ассет бандлів і отже безліч зовнішніх колекцій Ассет. Ці файли існують поза програвача, створеного Unity, зазвичай розміщуються на веб-сервері для динамічного доступу.
Щоб зібрати Ассет бандл, ви викликаєте BuildPipeline.BuildAssetBundle () з Editor скрипта. В аргументах ви вказуєте масив об'єктів для включення в бандл, і деякі інші опції. Цей метод збере файл, який ви потім зможете динамічно завантажувати в реальному часі за допомогою AssetBundle.Load ().
папки ресурсів
Папки ресурсів містять колекції Ассет, які включаються в програвач, створюваний Unity, але не обов'язково пов'язані з будь-яким GameObject'ом в інспектора.
Щоб що-небудь покласти в папку ресурсів, досить просто створити в вікні Project (Project View) нову папку з ім'ям "Resources". У вас може бути кілька папок ресурсів, розміщених в різних підпапках проекту. Коли ви побажаєте завантажити Ассет з будь-якої такої папки, викличте метод Resources.Load ().
Якщо ви збираєте під Streaming Web Player (Web Player з функцією потокової завантаження), ви можете вказати в якій сцені буде все з ваших папок ресурсів. Зробити це можна в налаштуваннях програвача (Player Settings), доступних через меню Edit-> Project Settings-> Player. Черга потокової завантаження рівнів визначається чергою сцен у вікні Build Settings.
Все Ассет з папок ресурсів і їх залежності зберігаються в файлі під назвою resources.assets. Якщо Ассет вже використовується в іншому рівні, він зберігається в файлі .sharedAssets для того рівня. Налаштування Edit -> PlayerSettings First Streamed Level визначає рівень, в якому буде зібрано файл resources.assets для включення в збірку.
Якщо рівень до зазначеного в "First streamed Level" містить Ассет з папок ресурсів, Ассет буде збережений разом з іншими Ассет того рівня. Якщо ж Ассет з папок ресурсів містить рівень після зазначеного в "First streamed Level". рівень буде посилатися на Ассет з файлу "resources.assets".
Тільки Ассет з папки Resources можуть бути завантажені з допомогою Resources.Load. Однак, багато інших Ассет можуть виявитися в файлі "resources.assets", якщо вони є залежностями Ассет з папок ресурсів (наприклад, матеріал в папці Resources може посилатися на текстуру поза цією папки).
вивантаження ресурсів
Ви можете вивантажувати ресурси Ассет бандла викликаючи AssetBundle.Unload (). Якщо ви передасте true в якості аргументу unloadAllLoadedObjects. то і Ассет, що зберігаються в AssetBundle і Ассет, завантажені з AssetBundle за допомогою AssetBundle.Load () будуть знищені і буде звільнена пам'ять, яку вони займали.
Іноді краще завантажити AssetBundle, створити екземпляри цікавлять вас об'єктів і звільнити пам'ять, займану вже непотрібним вам Ассет бандлом, при цьому зберігши завантажені об'єкти. Це корисно для звільнення пам'яті для інших завдань, наприклад, для завантаження іншого AssetBundle. В такому випадку, вам слід передати false в якості аргументу. Після знищення бандла ви більше не зможете завантажувати з нього об'єкти.
Якщо ви бажаєте знищити об'єкти в сцені, завантажені з допомогою Resources.Load () до завантаження іншого рівня, викличте на них Object.Destroy (). Щоб вивантажити Ассет, використовуйте Resources.UnloadUnusedAssets ().
Зміна вихідних Ассет з коду