Формирование архива с моделями и сценой
Инструкция по созданию сцены для загрузки в башню SenseTower
В текущей документации будет описан процесс создания проекта, который нужно будет передать вместе с сформированными в процессе действий из этой публикации файлами и папками.
Ниже представлены алгоритмы действий при создании удаленной сцены в башне SenseTower в двух вариантах. Первый через клонирование проекта с репозитория SenseTower с заранее прописанными параметрами, второй через самостоятельное создание проекта и выставление необходимых параметров вручную.
Первый вариант
В начале работы необходимо убедиться что у вас установлена версия Unity 2021.3.25 с подключенными модулями Android, Windows и Linux сборки.
Проект с примерами хранится по пути. https://github.com/Sense-Capital/RemoteContentSample
1) Необходимо осуществить Fork проекта и скачать на ПК. В этом проекте заранее выставлены все параметры и настройки, необходимо будет только ввести свои параметры для идентификации папок и файлов
2) Для того, чтобы сцену можно было загрузить как удалённый объект, необходимо указать название проекта в настройках профиля Addressables. Делается это следующим образом.
Для начала перейдем в настройку профиля:
В появившемся окне Addressables Profiles необходимо выбрать профиль GithubPages:
Далее необходимо придумать уникальное название для каталога вашего проекта на удалённом репозитории. Из названия должно быть ясно назначение загружаемой сцены. Оно должно состоять только из букв латинского алфавита, цифр, знаков подчёркивания, тире, и не иметь пробелов. Рекомендуется указывать имя в формате <Название компании>_<Название сцены>. В примере ниже используется название OurBestCompany_RemoteScene1, ваше название должно быть другим и отражать именно специфику вашей сцены!
Это название необходимо указать в поле Remote.BuildPath и в поле Remote.LoadPath вместо присутствующего в данных строках параметра [ProjectName]. Пример:
После этого перейдем в общие настройки Addressables
В открывшихся параметрах объекта Addressable Asset Settings в инспекторе необходимо также прописать указанное ранее название:
На этом настройка проекта завершена, теперь нужно при необходимости наполнить сцену возможностью перемещения и садиться на стулья и добавить файлы сцены в группу, предназначенную для удаленной загрузки в башню SenseTower. Рассмотрим эти шаги подробнее.
3) Наполнение сцены
В скачанном проекте есть пустая специально заготовленная сцена с настройками света и заготовленными настройками для формирования удаленной сцены, она находится по пути Assets/Scene
Эта сцена предназначена для наполнения объектами, формирующими пользовательское пространство. Необходимо все модели размещать в этой сцене.
Необходимо убедиться что в сцене присутствуют только объекты моделей пользовательского пространства. На объектах не должно быть скриптов и компонентов Unity, выполняющих какую-либо дополнительную логику (например, объект камеры или Volume).
Также необходимо проверить коллайдеры. На сцене не должно быть лишних коллайдеров, перекрывающих большой объём пространства, в котором может перемещаться пользователь (пример на скриншоте ниже). В противном случае объекты в такой зоне могут вести себя некорректно.
После того, как на сцену были добавлены объекты-модели пользовательского пространства, сцена должна быть выровнена относительно точки (0, 0, 0).
Необходимо выровнять сцену так, чтобы центральная точка объекта находилась в месте желаемого появления пользователя чуть выше уровня пола, а глобальный вектор forward (синий вектор) указывал бы туда, куда пользователь должен смотреть при появлении. Проще всего это будет сделать, добавив на сцену временный объект (например, сферу) в точке (0, 0, 0).
После всех выравниваний не забудьте удалить временный объект.
Требования предъявляемые к сцене
Быстродействие сцены напрямую зависит от её загруженности.
Рекомендации по настройке сцены приведены здесь: https://sensetower.aspro.cloud/_module/knowledgebase/view/article/11--trebovaniya-predyavlyaemye-k-scene-dlya-dobavleniya-v-sensetower/
а) В помещение необходимо обязательно поставить дверь выхода. Через дверь выхода пользователь сможет осуществлять переход из помещения в общий холл. Холл - точка доступа ко всем помещениям башни, включая и создаваемое помещение, поэтому необходимо дать возможность пользователю туда вернуться.
Для того, чтобы разместить дверь выхода, создаём на сцене новый пустой объект с названием ExitDoor.
Объект размещаем в центре модели двери или в центре предполагаемого места выхода.
Необходимо повернуть объект двери так, чтобы локальный вектор Forward объекта (вектор синего цвета на скриншоте), указывал на фронтальную часть двери (как на скриншоте).
Для этого переключим инструмент вращения на локальный вектор и позиционируем объект.
В текущей реализации коллайдер двери, который будет создан в этой точке, имеет размеры: ширина = 0.8, высота = 2.45, глубина = 0.08. Чтобы активная зона двери начиналась от пола, объект ExitDoor необходимо разместить на высоте 1.225 единиц над уровнем пола (пример размещения показан на скриншоте ниже).
Если нет необходимости перемещаться по пространству, садиться на предметы или взаимодействовать с браузером, то следующие пункты можно пропустить.
б) Создание зон телепортации. В иерархии объектов на сцене создаем пустой родительский объект (окно Hierarchy -> Create Empty) с названием TeleportationArea. Внутри этого объекта в качестве дочерних необходимо разместить невидимые (с отключенным Mesh Renderer) объекты, коллайдеры которых будут зонами телепортации (например, пол или лестница). Обязательным условием для этих объектов является наличие компонента MeshCollider. Дочерние объекты TeleportationArea будут не видны, но по ним будет определяться зона телепортации. Видимые части модели, которые не должны быть зонами телепортации, размещать дочерними TeleportationArea не следует.
Замечания при формировании объектов для телепортации
Телепортация в башне SenseTower происходит на основе меша в переданных объектах. Поэтому необходимо правильно его сформировать, чтобы не возникало ситуаций, когда пользователь может застрять. В случае если модель не позволяет такое сделать (например, когда на модель пола ставится модель стены). Рекомендуется использовать ProBuilder. В нем можно формировать отдельный меш, который будет удобен для телепортаций. В примерах проекта лежит сцена SampleScene. В данной сцене визуально показаны два варианта выделения меша для реализации телепортации.
SampleScene(1 Variant with Probuilder) - объекты для телепортации сформированы при помощи плагина ProBuilder. Зеленым цветом выделен колайдер, на который будет осуществлена возможность телепортации.
SampleScene(2 Variant without Probuilder) - объекты для телепортации сформированы при помощи стандартных Plane.
Зелеными линиями выделен коллайдер для телепортации.
Как видно из двух примеров, объекты сформированные ProBuilderom имеют меньшее количество полигонов, соответственно этот метод оптимизированнее метода с Plane.
При формировании зон телепортации возможно потребуется запретить пользователю телепортироваться через стену, для этого необходимо на объект стены назначить Layer-> Walls. В таком случае мы запретим проходить лучу телепортации через стену. Layer Walls уже есть в проекте.
в) Создание точек телепортации (стульев). В иерархии объектов на сцене создаем родительский объект с названием LandingPlace.
Внутри этого объекта в качестве дочерних необходимо разместить точки, в центр которых будет осуществляться возможность сесть.
Она должна находиться в том месте, где будет пользователь садиться, примерно как на скрине
Необходимо повернуть объекты-точки так, чтобы локальный вектор Forward объекта (вектор синего цвета на скриншоте), указывал в направлении взгляда пользователя на стуле. Для этого переключим инструмент вращения на локальный вектор
г) В помещение имеется возможность поставить браузер. Для этого необходимо создать на сцене два пустых объекта: BrowserAdminPlace, BrowserPlace.
BrowserAdminPlace - объект, при нажатии на который осуществляется открытие браузера. Это должен быть пустой GameObject. Его располагаем на высоте 0.2 над уровнем пола, и смотрим чтобы локальный вектор Forward объекта (вектор синего цвета) был направлен в сторону стены. На скриншоте ниже показан пример, как будет выглядеть кнопка взаимодействия с браузером, сгенерированная в точке BrowserAdminPlace.
BrowserPlace - объект, браузера. располагается в центре предполагаемого места размещения браузера. Объект должен также находиться на расстоянии 0.35 от стены. Локальный вектор Forward объекта должен смотреть в сторону стены. В текущей реализации полотно браузера, которое будет создано в этой точке, имеет размеры: ширина = 4.1, высота = 2.3. Чтобы элементы управления браузером не находились под полом, объект BrowserPlace необходимо разместить на высоте 1.23 над уровнем пола.
На скриншоте ниже показан пример размещения браузера по объекту BrowserPlace и указаны размеры элементов.
Примечание: названия TeleportationArea и LandingPlace и ExitDoor,
BrowserAdminPlace,BrowserPlace должны быть именно такими, чтобы программа корректно определила области телепортации, места посадки, и дверь на выход.
На этом наполнение сцены для работы в башне SenseTower закончена.
Следующим шагом необходимо удостовериться или добавить сцену в группу Addressables, чтобы иметь возможность загружать её с облака в приложение Sense Tower.
Добавление сцены в группу
Изменим название сцены MyRemoteScene на такое же название, которое придумали ранее для каталога (в примере используется название OurBestCompany_RemoteScene1, ваше название будет другим):
Теперь убедимся что наша сцена будет использоваться для удаленной загрузки.
Для этого находим сцену в папках проекта и в панели инспектора удостоверяемся что стоит галочка напротив Addressables:
Переходим в группы
Сцена появится в группе по умолчанию Default Local Group (если галочки напротив Addressables ранее не было) или в группе RemoteAssets:
Кликаем правой кнопкой мыши на сцену и выбираем пункт Simplify Addressable Names. Это необходимо для того, чтобы задать для сцены упрощённое имя, по которому будет осуществляться поиск на облаке:
После этого для удалённого объекта сцены будет установлено упрощённое название, совпадающее с названием сцены:
Важно: Убедитесь, что название Addressable Name сцены совпадает с названием самой сцены. Если это не так, переименуйте Addressables Name сцены, нажав на неё в инспекторе объектов и задав правильное название в панели инспектора.
Перетаскиваем сцену из Default Local Group в Remote Assets(если её там не было). Если она уже там, то данный пункт пропускаем.
На этом настройка завершена. Осталось сформировать пакет для разных платформ.
Формировка пакета
Пакет формируется отдельно под каждую платформу, для этого надо менять настройку Platform в BuildSettings через SwitchPlatform
Пакет формируется через New Build->Default Build Script.
Пакет необходимо сформировать под три платформы Android, Windows, Linux. Для этого мы под каждую платформу меняем Platform и заново нажимаем New Build->Default Build Script.
Под Windows
Под Linux
Под Андроид
После того как создали все необходимые пакеты, у нас должно получится примерно следующее. В папках проекта появится папка ServerData с подпапками для каждой платформы.
Внутри каждой подпапки.
Все пакеты подготовлены.
Теперь для загрузки сцены в систему SenseTower, необходимо запаковать в архив весь проект и передать сотруднику SenseCapital, ответственному за загрузку динамических сцен в SenseTower.
Второй вариант
1)Создаём проект в версии Unity 2021.3.1625 с использованием URP с подключенными модулями Android и Linux сборки
2) Создаём сцену и наполняем её объектами, формирующими пользовательское пространство. Если нет необходимости перемещаться по пространству или садиться на предметы, то шаги 3, 4 можно пропустить и приступить к установке Addressables.
Требования предъявляемые к сцене
Быстродействие сцены напрямую зависит от её загруженности.
При формировании сцены для лучшего быстродействия необходимо учитывать требования предъявляемые устройством Oculus, они подробно описаны здесь - Требования к сцене Unity
Из главных, это количество отрисовок в районе 80-200 и количества треугольников до 500к(чем меньше тем лучше) и текстуры разрешения до 2к.
При соблюдение данных требований в приложении SenseTower будет поддерживаться необходимое количество FPS и соответственно максимальное удовольствие от нахождение в пространстве.
3) В иерархии объектов на сцене создаем родительский объект с названием TeleportationArea. Внутри этого объекта в качестве дочерних необходимо разместить объекты, в пределах которых можно двигаться путём телепортации (например, пол или лестница). Обязательным условием для этих объектов является наличие компонента MeshCollider.
Замечания при формировании объектов для телепортации
Телепортация в башне SenseTower происходит на основе меша в переданных объектах. Поэтому необходимо правильно его сформировать, чтобы не возникало ситуаций, когда пользователь может застрять. В случае если модель не позволяет такое сделать( например когда на модель пола ставится модель стены). Рекомендуется использовать ProBuilder. В нем можно формировать отдельный меш, который будет удобен для телепортаций.
4) В иерархии объектов на сцене создаем родительский объект с названием LandingPlace.
Внутри этого объекта в качестве дочерних необходимо разместить точки, в центр которых будет осуществляться возможность сесть.
Она должна находиться в том месте, где будет пользователь садиться, примерно как на скрине
Необходимо повернуть объекты-точки так, чтобы локальный вектор Forward объекта (вектор синего цвета на скриншоте), указывал в направлении взгляда пользователя на стуле. Для этого переключим инструмент вращения на локальный вектор.
в) В помещение имеется возможность поставить дверь. При нажатии на которую, осуществляется переход в холл. Объект который за это отвечает должен присутствовать на сцене и называться ExitDoor. Объект размещаем в центре модели двери, или в центре предполагаемого места выхода.
Необходимо повернуть объект двери так, чтобы локальный вектор Forward объекта (вектор синего цвета на скриншоте), указывал на фронтальную часть двери, как на скрине.
Для этого переключим инструмент вращения на локальный вектор и позиционируем объект.
Примечание: названия TeleportationArea и LandingPlace и ExitDoor должны быть именно такими, чтобы программа корректно определила области телепортации, места посадки, и дверь на выход.
Примечание: названия TeleportationArea и LandingPlace должны быть именно такими, чтобы программа корректно определила области телепортации.
На этом наполнение сцены для работы в башне SenseTower закончена.
После подготовки сцены и после того как убедились что сцена подходит под наши требования, необходимо приступить к формированию сцены в необходимом формате, для этого используется Addressables.
Установка Addressables
Установка пакета Addressables происходит через PackageManager.
Ищем пакет в списках Unity Registry
Текущая используемая версия 1.19.19. Устанавливаем эту версию.
Установка поддержки VR
Так же помимо Addressables необходимо установить XR Plugin Management
И Oculus XR Plugin
Поскольку при компиляции моделей и сцен механизм компиляции опирается на настройки проекта, нам необходимо указать, что проект будет использоваться для VR устройств Oculus.
Включаем поддержку VR и Oculus в настройках проекта. Это делается через FIle->Build Settings-> Player Settings-> Xr Plug-in Management и включить поддержку Oculus
со следующими настройками
Чтобы начать пользоваться Addressables необходимо создать дефолтные настройки. Для этого переходим в Addressable->Groups.
И нажать кнопку создания настроек
Настройка профиля
После установки необходимо указать куда сохраняются файлы содержащие сцену. Это делается через настройки профиля
Создаем новый профиль через Create-> Profile. Задаем имя новому профилю и выбираем его активным через контекстное меню
Теперь необходимо прописать две переменные. Предварительно указав в Remote в выпадающем списке Custom( тогда откроется возможность изменять нужные переменные)
Remote.BuildPath - путь куда будут складываться наши файлы архивов со сценами и моделями внутри репозитория. По дефолту можно указать. ServerData/[Название проекта]/[BuildTarget] - это означает что файлы архива будут сохраняться в папке ServerData, и внутри этой папки создастся подпапка в зависимости от платформы(Android, StandaloneWindows64), для который формируется пакет.
Например: ServerData/AddressablesContent/[BuildTarget]
Remote.LoadPath - путь, указывающий на место, где будут храниться файлы каталога. Указываем
https://sense-capital.github.io/RemoteContent/ServerData/[Название проекта][BuildTarget]
Например: https://sense-capital.github.io/RemoteContent/ServerData/AddressablesContent/[BuildTarget]
[Название проекта] - прописываем без пробелов
Должно получится как здесь.
После того как заполнили переменные в настройках необходимо указать что системе нужно собирать удаленный каталог это делается через AssetManagement->Addressables->Settings
Добавить в Player Version Override добавочное слово, для идентификации каталога. Оно может быть любое.
На этом настройка профиля завершена. Теперь система будет понимать куда сохранять полученные в результате сборки файлы, и куда надо ссылаться внешнему источнику для скачивания необходимой сцены.
Настройка группы
После того как профиль настроен необходимо настроить группы, где будут сохранены необходимые объекты.
Открываем вкладку настроек группы и создаем новую через New->PackageAssets, можно переименовать на имя, которое подходит
Созданную группу можно переименовать для удобства
необходимо убедиться что в профиле используется профиль, который мы создали.
Теперь в ново созданной группе и в DefaultLocalGroup надо указать что мы будем использовать удаленный путь загрузки,
Выставляем во вкладке Play Mode Script-> Use Existing Build. Это нужно для того, чтобы материалы нашей сцены передавались вместе с каталогом.
Настройка групп завершена. Теперь необходимо добавить сцену в эту группу.
Добавление сцены в группу
Для этого надо указать нашей сцене, что она будет использоваться для загрузки, находим сцену в папках проекта и ставим галочку напротив Addressables
Она появится в дефолтной группе (если мы указали новую группу как дефолтную, то сцена сразу появится в этой группе)
Через правую кнопку мыши нажимаем на Simplify Addressable Names, и у нашей сцены удобочитаемое имя, перетаскиваем её в ново созданную группу(если мы указали новую группу как дефолтную, то сцена сразу появится в этой группе)
На этом настройка завершена, мы настроили профиль, группу и добавили сцену для удаленной загрузки. Осталось сформировать пакет.
Формировка пакета
Пакет формируется отдельно под каждую платформу, для этого надо менять настройку Platform в BuildSettings через SwitchPlatform
Пакет формируется через New Build->Default Build Script.
Пакет необходимо сформировать под три платформы Android, Windows, Linux. Для этого мы под каждую платформу меняем Platform и заново нажимаем New Build->Default Build Script.
Под Windows
Под Linux
Под Андроид
После того как создали все необходимые пакеты, у нас должно получится примерно следующее. В папках проекта появится папка ServerData с подпапками для каждой платформы.
Внутри каждой подпапки.
Все пакеты подготовлены.
Теперь для загрузки сцены в систему SenseTower, необходимо запаковать в архив весь проект и передать сотруднику SenseCapital, ответственному за загрузку динамических сцен в SenseTower.
Так же вместе с архивом сотруднику SenseTower надо сказать ключ сцены, который будет использоваться в башне, его можно найти по пути
И имя ключа присвоенное сцене отмечено на скрине