Skip to content

Latest commit

 

History

History
190 lines (143 loc) · 16.4 KB

README.md

File metadata and controls

190 lines (143 loc) · 16.4 KB

Модули

Окно PRUnitySDK → Модули выбирает, какие части SDK входят в сборку проекта. Отключённый модуль вырезается из компиляции целиком: его менеджеры, окна, хуки и типы в проект не попадают. Выбор хранится в настройках игры, файлы SDK при переключении не меняются.

Ядро (PRUnitySDK/Core) в окне только перечислено, отключить его нельзя.

Как сделать модуль отключаемым

Модуль — это папка. Всё, что в ней лежит, принадлежит модулю.

1. Манифест

В корне папки модуля создайте манифест: Create → PRUnitySDK → Module Manifest, файл назовите Module.asset.

Поле Что задаёт
Id часть define-символа PRSDK_DISABLE_<Id>. Заполняется по имени папки: Waypoint System → WAYPOINT_SYSTEM. После того как файлы обёрнуты, не меняйте
Display Name имя в окне; пусто — имя папки
Description одна-две строки о том, что делает модуль
Group подгруппа в окне: Модули, Окна, Компоненты, Сущности, Прочее. «Интеграции» — отдельная вкладка окна
Is Required модуль нельзя отключить. Обёртки его файлам не нужны
Dependencies манифесты модулей, без которых этот не компилируется
Slot слот интеграции, например «Площадка». Из модулей с одним слотом включён не больше чем один
Platform платформа сборки интеграции — имя BuildTarget, например WebGL. Вкладка «Интеграции» группирует по ней модули и предупреждает, если включённая не подходит к активной платформе. Пусто — любая
Plugin Folder папка стороннего плагина, без которого модуль не компилируется. Окно покажет, есть ли она в проекте
Plugin Modules File текстовый файл плагина со списком его установленных частей, по одной в строке. Окно покажет список в карточке модуля
Project Settings Files файлы настроек плагина, свои у каждой игры, — пути от папки плагина (у YG2 — Resources/SettingsYG2.asset). При смене проекта SDK на их место встаёт копия нового проекта из <папка PRSDKSettings проекта>/PlatformSettings~/<Id модуля>/, правки сразу уходят в копию активного (PRSDKProjectPlatformSettings). Работает и при спрятанном плагине
Hide Plugin When Disabled прятать папку плагина, пока модуль отключён: «Применить» переименует её в Имя~, и Unity её не увидит
Web GL Template шаблон WebGL, который «Применить» ставит, когда модуль включён, например PROJECT:YandexGames
Web GL Template Source папка с исходником этого шаблона внутри модуля, путь от папки модуля, например WebGLTemplate~ (путь с Assets/ — от проекта): так он переживает перенос модуля. «Применить» и сборка WebGL копируют её в Assets/WebGLTemplates/Имя: Unity берёт шаблоны только оттуда. Правится исходник, копия перезаписывается

Если Id остался пустым, откройте окно модулей: оно заполнит его само.

Папка с манифестом внутри папки другого модуля — вложенный модуль. Его файлы принадлежат ему, и он автоматически зависит от внешнего модуля.

Модуль в нескольких папках

Модуль может занимать несколько папок, в том числе в разных частях SDK. В корне каждой дополнительной папки создайте Create → PRUnitySDK → Module Part (файл ModulePart.asset) и укажите в нём манифест модуля. Скрипты такой папки оборачиваются символом этого же модуля и отключаются вместе с ним. Своего символа и своей строки в окне у части нет.

2. Обёртка файлов

Каждый скрипт модуля должен быть обёрнут в символ модуля:

#if !PRSDK_DISABLE_BOOSTERS
using UnityEngine;

public class BoosterManager { ... }
#endif

Руками это делать не нужно: в окне модулей у такого модуля появится предупреждение «Файлов без обёртки» с кнопкой «Обернуть». Кнопка ставит две строки, кодировку и переводы строк файла сохраняет.

Обёртка нужна всем .cs в папке, включая Editor и вложенные папки. Новый файл в модуле тоже нужно обернуть. Без обёртки он останется в сборке у отключённого модуля и сломает компиляцию. Такие файлы находит «Проверка проекта» (группа «Модули SDK»).

3. Зависимости

Модуль A зависит от B, если код A использует типы или partial-свойства B: PRUnitySDK.Managers.Booster, WheelOfFortuneDatabase и тому подобное. Такие модули перечисляются в Dependencies.

Код вне модулей и ядро не должны ссылаться на отключаемый модуль. Если такая ссылка есть, отключение модуля сломает сборку. Тогда либо разорвите связь (точка расширения через MethodHook, событие, интерфейс в ядре), либо отметьте модуль Is Required.

4. Проверка

Отключите модуль в окне и нажмите «Применить». Если проект собрался, модуль готов. Ошибки компиляции покажут зависимости, которых нет в манифесте: добавьте их или разорвите связь, затем включите модуль обратно.

Интеграции

Интеграция — модуль с группой «Интеграции»: связка SDK со сторонним плагином площадки, аналитики и подобным. Такие модули показаны на вкладке «Интеграции».

Интеграции с одинаковым Slot исключают друг друга. На вкладке они идут переключателем: выбирается один модуль или «Не подключено». Выбор модуля отключает остальные модули слота. Вкладка группирует интеграции по платформе сборки (поле Platform), внутри — по слотам. Слот действует в пределах своей платформы: «Магазин» на Android и «Магазин» на PC друг другу не мешают.

Платформа Слот Модули
WebGL Площадка YG2.Integration (Яндекс Игры), GamePush.Integration, Pikabu.Integration (Пикабу Игры), VK.Integration (VK Games: ВКонтакте и Одноклассники)
Android Магазин RuStore.Integration (покупки RuStore Pay)
Android Реклама YandexMobileAds.Integration (РСЯ), GoogleMobileAds.Integration (AdMob)
PC Магазин Steam.Integration (Steamworks.NET)

Код нативных интеграций, кроме настроек, обёрнут ещё и в символ платформы (UNITY_ANDROID, UNITY_STANDALONE_*): в чужую сборку он не попадает, а их приоритет переопределения (4) ниже веб-площадок (5), поэтому в сборке под Android или PC они перекрывают веб-площадку, если её забыли выключить. Настройки таким символом не обёрнуты: иначе при сохранении ассета под другой платформой их поля пропали бы. При активной платформе WebGL Unity нативный код не компилирует — его проверяют csc с символами нужной платформы.

Чтобы добавить ещё одну площадку, окно править не нужно:

  1. Сложите её адаптеры в свою папку, например GamePush.Integration.
  2. Создайте в ней Module.asset: Group — «Интеграции», Slot — «Площадка», Plugin Folder и Plugin Modules File — по плагину площадки. Если плагин попадает в сборку сам (.jslib, .jspre, автозапуск, обработчики сборки), включите Hide Plugin When Disabled и задайте Web GL Template.
  3. Оберните файлы кнопкой «Обернуть».
  4. Адаптеры подключайте атрибутом [OverrideProperty(typeof(IServerTime), приоритет)], как это сделано в YG2.Integration. Общий код о площадке знать не должен.

Без включённой площадки SDK работает на реализациях по умолчанию.

Плагины двух площадок в одном проекте

Символ модуля вырезает только код интеграции. Плагин площадки остаётся в проекте и сам встраивается в страницу: его .jslib и .jspre, автозапуск SDK площадки, обработчики сборки. Поэтому у модулей площадок включён Hide Plugin When Disabled, и «Применить» (PRModulePlugins):

  1. возвращает папку плагина включаемого модуля (GamePush~ → GamePush). Не вышло — символы не пишутся: без плагина модуль не соберётся;
  2. пишет символы;
  3. прячет папку плагина отключённого модуля (PluginYourGames → PluginYourGames~) и ставит шаблон WebGL включённого модуля.

.meta папки на время прятанья лежит внутри неё (.folder.meta), поэтому GUID папки и файлов в ней сохраняются. Переименование не проходит, если файл плагина держит открытым другая программа: окно назовёт папку, и её можно переименовать руками. Папку, которая не на своём месте, окно и «Проверка проекта» показывают предупреждением, «Применить» её исправит.

Если интеграция включена, а папки плагина в проекте нет, проект не соберётся. Окно и «Проверка проекта» об этом предупреждают. В проекте, который ещё ни разу не собрался, окно не откроется: добавьте символ PRSDK_DISABLE_<Id> в Player Settings вручную.

Как включать и выключать

  1. PRUnitySDK → Модули.
  2. Поставьте или снимите галки. Пока не нажата «Применить», ничего не меняется, справа видно «будет отключён» или «будет включён». «Сбросить» возвращает текущее состояние.
  3. «Применить». Окно покажет, что изменится, и после подтверждения запишет символы во все платформы. Проект пересоберётся один раз.

Что окно не даст сделать:

  • отключить модуль, пока включены модули, которые от него зависят. Окно назовёт их: сначала отключите их;
  • отключить модуль с файлами без обёртки. Окно предложит обернуть их;
  • отключить обязательный модуль;
  • применить набор, в котором включены два модуля одного слота.

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

Символы лежат в Player Settings → Other Settings → Scripting Define Symbols и выглядят как PRSDK_DISABLE_BOOSTERS. Если на другой платформе набор отличается, окно предупредит, а «Применить» выровняет все платформы.

Если после «Применить» проект не собрался, окно продолжает работать на прошлой сборке: включите модуль обратно. В крайнем случае удалите символ из Player Settings вручную.

Что происходит с отключённым модулем

  • Компоненты модуля на сценах и префабах становятся Missing Script. Unity хранит их данные, после включения всё вернётся, но такие сцены и префабы лучше не пересохранять.
  • Поля, которые модуль добавляет в PRSDKSettings и PRSDKDatabase через partial, пропадают при сохранении этих ассетов.
  • Данные модуля в сохранениях игроков пропадают при первом сохранении в билде без него.
  • Ассеты модуля остаются в билде, если на них ссылаются или они лежат в Resources. Вырезается только код.

Карта

Тип Роль
PRModuleManifest ассет-описание модуля
PRModulePart ассет дополнительной папки модуля
PRModuleCatalog находит модули и раскладывает по ним скрипты
PRModuleGuard читает, ставит и снимает обёртку файла
PRModuleDefines читает и пишет символы PRSDK_DISABLE_* во все платформы
PRModulesWindow окно модулей
PRModuleValidator проверка «Модули SDK» для окна «Проверка проекта»
PRModulePlugins прячет и возвращает папки плагинов, ставит шаблон WebGL

Всё это код редактора и в билд не попадает.