Академический Документы
Профессиональный Документы
Культура Документы
разделению VR контента
в Unity
Архитектура платформы
В нашей платформе заложено 2 сценария загрузки контента на устройство, а также
запуск этих 2-х видов контента в специализированном приложении (Лаунчере) на VR
устройстве (устройство типа Oculus 2). За счёт этого подхода, появляется
возможность агрегации на VR платформе, как ранее созданного (сторонними
разработчиками) VR контента, так и создание нового VR контента с использованием
Web технологий доставки и воспроизведения.
Виды VR контента:
Лаунчер
С технической точки зрения Лаунчер представляет из себя APK приложение,
опубликованное в Oculus Store, и устанавливаемое на VR устройство.
● авторизоваться на VR платформе,
● получить доступ к уже загруженному и установленному на устройство контенту,
● получить доступ к каталогу контента (Маркетплейсу) платформы,
● получить новый контент:
○ скачать пакет (архив) с серверов платформы,
○ распаковать скачанный пакет (архив),
○ установить (прописать необходимые данные) пакет, чтобы контент
пакета стал виден в Лаунчере, среди доступного на устройстве контента,
○ удалить загруженный и установленный на устройство пакет (архив)
после его установки,
● запускать (проиграть) уже загруженный и установленный на устройство контент,
● удалять установленный на устройство контент,
● запускать (проиграть) WebGL контент (через встроенный в Лаунчер браузер)
Back-End
С технической точки зрения Back-End платформы представляет из себя сервис -
обмениваются по API информацией в виде JSON, HTML и пакетов (архивов) контента.
Многопользовательский VR контент
Для создания многопользовательского VR контента, в проекте необходимо
предусмотреть специальное меню, вызываемое на первом экране, после запуска VR
контента. В этом меню должно быть 2 сценария взаимодействия в
многопользовательском варианте VR контента:
1. Авторизоваться,
2. Зайти в специальный раздела в личном кабинете пользователя,
3. Заранее составить список пользователей которые должны присоединиться,
4. Выбрать многопользовательский VR контент,
5. Запустить его.
1. Авторизоваться,
2. Зайти в специальный раздела в личном кабинете пользователя, в котором ему
будут видны все приглашения в многопользовательские сервера и их статус
(сеанс начат, сеанс завершен),
3. Выбрать активное приглашение и перейти в него.
Загрузка ресурсов в реальном
времени
В некоторых случаях полезно создать ассет, доступный для проекта без его загрузки в качестве
части сцены. Например, там может быть персонаж или другой объект, который может появиться в
любом месте игры, но который будет использоваться лишь изредка (это может быть “секретная”
функция, сообщение об ошибке или предупреждение о рекордном счете). Кроме того, вы даже
можете загрузить ресурс из отдельного файла или через URL, чтобы сократить время начального
скачивания или добавить в проект взаимозаменяемый контент.
Unity поддерживает папки ресурсов в проекте (папки с названием Resources), чтобы разработчик
мог добавить в сборку контент, который не будет загружен до того как понадобится. В Unity Pro,
Unity iOS Advanced и Unity Android Advanced вы также можете создавать ассет бандлы. Это
файлы, полностью отделённые от главной игры, которые содержат ассеты, к которым игра может
получить доступ при необходимости, из файла или по URL.
Asset Bundles
Ассет бандл (Asset Bundle) - это внешняя коллекция ассетов. Вы можете иметь множество ассет
бандлов и следовательно множество внешних коллекций ассетов. Эти файлы существуют вне
проигрывателя, созданного Unity, обычно размещаются на вэб-сервере для динамического доступа.
Папки ресурсов
Папки ресурсов содержат коллекции ассетов, которые включаются в проигрыватель, создаваемый
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() будут уничтожены и будет
освобождена память, которую они занимали.
AssetBundles
AssetBundles - это файлы, которые можно экспортировать из Unity, для упаковки ресурсов (assets) в
1 файл, по вашему выбору. Эти файлы используют собственный формат сжатия, и могут быть
загружены вашим приложением по необходимости. Это позволяет подгружать различный контент,
такой как модели, текстуры, аудио клипы, или даже целые сцены, отдельно от тех, в которых они
будут использоваться. AssetBundles созданы для упрощения скачивания контента в ваше
приложение.
Лог предоставляет сводку по ассетам, разбитым по типам и затем список отдельных ассетов,
отсортированных по размеру. Как правило, текстуры, музыка и видео занимают больше всего места,
в то время как скриптами, уровнями и шейдерами часто можно пренебречь. Учтите, что File Headers
(заголовки файлов) в сводке - это не ассеты как таковые. Заголовки обычно добавляются к “сырым”
файлам ассетов для сохранения настроек и ссылок. Обычно заголовки не значительно влияют на
размер файлов ассетов, но значение может оказаться и большим, если у вас много больших
ассетов в папке Resources.
Лог помогает выявить ассеты, которые вы, возможно, пожелаете удалить или оптимизировать, но
вам стоит учитывать следующее перед тем как начать работу:
Если это не приведёт к уменьшению размера, попробуйте снизить качество текстур. Хитрость тут в
том, что вам не нужно менять исходный контент. Просто выберите текстуру в окне Project и
измените значение свойства Max Size (максимальный размер) в настройках импорта. Можно
приблизить объект, на котором используется выбранная текстура, и подобрать значение Max Size
так, чтобы вы не замечали ухудшения качества текстуры в окне Scene (Scene View).
В следующей таблице показано, как много места занимают разные форматы изображений, в байтах
на пиксель:
iOS
Формула занимаемого на диске места такова: ширина * высота * bpp. Если вы используете
мипмапы, тогда размер на диске будет примерно на треть больше, чем при обычном единичном
изображении.
По умолчанию, Unity сжимает все текстуры при импорте. Для ускорения рабочего процесса в
редакторе, вы можете отключить сжатие в настройках редактора (флажок Compress Assets on
Import), но при этом текстуры всё равно будут сжиматься при сборке, независимо от этой настройки.
Меши и анимации
Меши и импортированный анимационные клипы могут сжиматься, чтобы занимать меньше места в
сборке вашей игры. Сжатие может быть включено в настройках импорта меша.
При сжатии мешей и анимаций используется квантование, поэтому хоть размер файлов и будет
ниже, сжатие может привнести некоторые погрешности. Попробуйте экспериментально установить,
какая степень сжатия приемлема для ваших моделей.
Учтите, что сжатие меша снижает только физических размер файлов, но не объём используемой
памяти при выполнении программы. А вот снижение количества ключевых кадров в анимации
(значение Keyframe reduction у свойства Anim. Compression в настройках импорта) уменьшает и
физический размер файлов, и потребление памяти во время выполнения программы, потому
рекомендуется всегда оставлять эту настройку включенной.
DLL файлы
По умолчанию, Unity включает в сборку только эти DLL файлы:
mscorlib.dll
Boo.Lang.dll
UnityScript.Lang.dll
UnityEngine.dll
При работе над игрой рекомендуется избегать использования зависимостей из System.dll или
System.Xml.dll. По умолчанию, Unity не включает эти библиотеки в к сборку проигрывателя, но если
в своём коде вы используете их классы, библиотеки будут включены в сборку. Эти DLL файлы
добавят к размеру сборки проигрывателя около одного мегабайта. Если в вашей игре требуется
работа с XML, вы можете использовать библиотеки вида Mono.Xml.zip в качестве небольшой по
размерам альтернативы системным библиотекам. Хоть большинство дженерик контейнеров
содержится в mscorlib, но Stack<> и некоторые другие находятся в System.dll, так что постарайтесь
избегать их использования по возможности.
Сериализация JSON
Функция сериализации JSON преобразует объекты в формат JSON и из него. Это может быть
полезно при взаимодействии с веб-службами, или просто для упаковки и распаковки данных в
текстовом формате легко.
Для получения информации о классе JsonUtility, пожалуйста, посетите страницу Unity ScriptRef
JsonUtility.
Простое использование
Функция сериализации JSON построена на понятии «структурированный» JSON, что означает, что
вы описываете, какие переменные будут храниться в данных JSON, создавая класс или структуру.
Например:
[Serializable]
myObject.level = 1;
myObject.timeElapsed = 47.5f;
myObject = JsonUtility.FromJson<MyClass>(json);
Это создаст новый экземпляр и установит значения на нем с использованием данных JSON. Если
данные JSON содержат значения, которые не картированы на поля, то эти значения будут просто
проигнорированы, и если в данных JSON отсутствуют значения для полей, то эти поля будут
оставлены на построенных значениях в возвращенном объекте.MyClassMyClassMyClass
JsonUtility.FromJsonOverwrite(json, myObject);
Любые поля на объекте, для которых JSON не содержит значения, останутся неизменными. Этот
метод позволяет с минимальными затратами, повторно использовать созданные ранее объекты, а
также «патч» объектов, намеренно перезаписывая их с JSON, который содержит только небольшой
подмножество полей.
Обратите внимание, что API JSON Serializer поддерживает и подклассы, а также простые
структуры/классы. Однако при deserializing JSON в подклассы или, вы должны использовать
FromJsonOverwrite; FromJson не поддерживается и будет бросать
исключение.MonoBehaviourScriptableObjectMonoBehaviourScriptableObject
Поддерживаемые типы
API поддерживает любой подкласс, подкласс или простой класс/структуру с атрибутом. Объект,
который вы проходите, подается в стандартный сериализатор Unity для обработки, поэтому
применяются те же правила и ограничения, что и в Инспекторе; только поля сериализируются, а
типы, как не поддерживаются.MonoBehaviourScriptableObject[Serializable]Dictionary<>
Передача других типов непосредственно API, например примитивных типов или массивов, в
настоящее время не поддерживается. На данный момент вам нужно будет обернуть такие типы в
или какой-то.classstruct
Только в редакторе есть параллельный API, который позволяет сериализировать любой тип,
полученный как в JSON, так и из него. Это позволит создать JSON, который содержит те же данные,
что и представление объекта YAML.EditorJsonUtilityUnityEngine.Object
Производительности
Тесты бенчмарка показали, что они значительно быстрее, чем популярные решения .NET JSON
(хотя и с меньшим количеством функций, чем некоторые из них).JsonUtility
Профиль .NET 2.0 API соответствует полной версии .NET 2.0 API. Большинство подпрограмм
библиотеки полностью реализованы, потому использование этой опции позволяет получить
наилучшую совместимость с уже существующим кодом. Однако, в большинстве игр не требуется
полная версия библиотеки и ненужный код занимает ценное пространство в памяти.
Во избежание излишнего потребления памяти, Unity поддерживает профиль подмножества .NET 2.0
API. Он очень похож на профиль Mono “monotouch”, так что многие из ограничений профиля
“monotouch” также распространяются и на профиль .NET 2.0 Subset редактора Unity (здесь можно
получить дополнительную информацию об ограничениях профиля “monotouch”). Многие редко
используемые в играх процедуры исключены из этого профиля для снижения потребления памяти.
Однако, это также значит, что не будет правильно работать код с зависимостями от этих процедур.
Эта опция может быть полезна для оптимизации, но вам следует проверить, работает ли
существующий код после применения этой опции.
Все файлы, помещённые в папку под названием StreamingAssets в Unity проекте будут скопированы
в определённую папку на указанный компьютер. Вы можете извлечь папку используя свойство
Application.streamingAssetsPath. Для справки, расположение этой папки меняется в зависимости от
платформы: