Эта страница ещё не переведена — показана английская версия.
Как устроен SDK
Как SDK написан и как он работает. Почему одна и та же идея в Python и в Unreal C++ выглядит немного по-разному и что стоит между вашим вызовом и сетью.
От общего к частному
SDK — это единый дизайн, который сужается двумя способами, и главное здесь — порядок: ничто не опускается на уровень ниже, пока уровень выше может это выразить.
| Уровень | Что здесь живёт |
|---|---|
| Общие принципы | Одинаковы во всех биндингах. Поведение объявляется атрибутом рядом с тем, что оно описывает. Любое объявление (declaration), которое вы отправляете, появляется в админ-панели. Ваш код обращается только к модулям. |
| Особенности языка | Только то, что парадигма языка не позволяет выразить общим способом. В C# есть атрибуты, в Python — декораторы: объявление одно и то же, просто записано так, как в каждом языке уже принято записывать эту идею. Если в языке такой конструкции нет, объявление передаётся иначе, и этот способ прямо называется там, где он применяется, а не подразумевается. |
| Особенности движка | Только то, что игровой движок перестраивает поверх своего языка. Unreal C++ — не обычный C++: у него своя объектная модель и своя рефлексия на этапе сборки. Поэтому объявление там живёт внутри собственного макроса рефлексии движка, в той позиции, где этот макрос и так принимает спецификаторы. Unity C# — тоже не серверный C#: среда выполнения там старее, а базовая библиотека меньше. |
Если читать таблицу сверху вниз, становится понятно, почему шесть вкладок в каждом примере — не шесть разных API. Это один API, записанный шестью способами, а в различиях, которые вы видите, проступают два нижних уровня.
Как он работает — от вашего кода вниз
Код игры видит модули, и на этом его словарь заканчивается.
- Модули — то, к чему вы обращаетесь. Они образуют граф, а не дерево, а что это даёт, описано на странице Наследование и композиция.
- Четыре примитива — то, из чего собраны модули: события, RPC, данные и подписки, группы. Комната, чат и пул подбора игроков (matchmaking) устроены одинаково: все они — примитив группы, только с разными правилами.
- Хаб находится ниже, и вы никогда его не вызываете. Это внедрение зависимостей, монтирование модулей, пользовательская сессия, восстановление состояния и качество доставки сообщений. Отдельно о нём говорится только на странице Под капотом.
- Транспортные адаптеры (transport adapter) лежат в самом низу, по одному на протокол, и хаб полностью их скрывает. Их будет несколько — WebSocket, наш собственный UDP, HTTP, — и какой из них понесёт вызов, ваш код не выбирает и даже не замечает.
О доставке модуль сообщает только одно — качество доставки: at-least-once или at-most-once. Транспорт под ним может смениться, а ваш код останется прежним.
Что это даёт
- Один SDK, а не клиентский и серверный. Что может вызов, определяют выданные актору права (grant), а не флаг сборки. Подробнее — на странице Кто принимает решения.
- Объявление — исходная точка для всего остального. Загрузите его, и появится типизированный API, админ-панель его покажет, а следом сгенерируется код для каждого биндинга. См. Схема в коде.
- Модули складываются, а не наследуются. Как именно и что здесь значит «наследование» — на странице Наследование и композиция.