Всего 10 лет назад в качестве дипломного проекта можно было представить сверстанный с нуля сайт, а лендинг мог считаться уровнем выпускника вуза. Сейчас же комиссию в среднем профессиональном образовании трудно удивить и серверным веб‑приложением со сложной архитектурой и потоковым обменом данных. Преподаватель Казанского техникума связи Вадим Начаров рассказывает в статье, как отбираются варианты проектов, что делать, если бюджет ограничен упаковкой печенек, и как написать диплом, чтобы были довольны и преподаватели, и выпускники.
Уровень выпускников растет вслед за технологиями и ежегодно прыгать выше головы начинает входить в привычку. А мне как руководителю выпускных проектов, нужно делать всё необходимое, чтобы этот прыжок удался легко и желательно без травм. Итак, отгремели новогодние каникулы, стартовал итоговый семестр и ко мне пришли два выпускника с целью определить направления и цели своих работ.
После проведенного брейнсторма, анализа работ предыдущих лет, и с учетом интересом и увлечений ребят, было решено разрабатывать игру. Да не простую, а сетевую! Чтобы вот через эти ваши интернеты соединение было, а не по локалке, в рамках одной машины.
Для того, чтобы реализовать многопользовательский режим, нужен сервер. Для того, чтобы сервер правильно работал, нужен программист хорошего уровня, и, к сожалению, наш бюджет в виде стикеров с аниме персонажами и упаковки печенек никого не привлекал.
Разумеется, студенты начали искать более дешевые варианты решения проблем. Найти ответ помогли различные мессенджеры, работающие на технологии Peer2Peer, а конкретно Client‑Server Host.
Пару слов о технологии, если вдруг вы о ней не знаете.
В отличие от классической клиент-серверной архитектуры, где связующим звеном является большой, мощный, дорогущий компьютер с быстрым интернетом, Р2Р позволила обойтись маленьким мощным компьютером с быстрым интернетом. Сам игрок является хостом, к которому подключаются другие, и на его железо ляжет выполнение основного кода игры.
Из многообразия инструментальных средств, работающих по Р2Р технологии, студенты остановились на библиотеке Netcode for GameObject. Это бесплатная сетевая библиотека с открытым исходным кодом, которая предлагает широкий спектр функций, такие как сетевые переменные, управление сценами, вызов удаленных вызовов процедур. Библиотека подходит для клиент‑серверной и клиент‑сервер хост архитектуры.
Сервер ретрансляции используется для передачи данных между двумя игроками. Клиенты будут отправлять пакеты друг другу, отправляя их на сервер ретрансляции и указывая, кому их перенаправить.
Преимущество по сравнению с подходом перенаправления портов в том, что подключение к серверу ретрансляции всегда будет работать для любого клиента.
Компания Unity предлагает сервис Relay, который выполняет функции сервера ретранслятора. Сейчас сервис не взимает плату за его использование. Реализация запуска, подключения к сервису Relay находятся в скрипте RelayManager.
Сервис Relay включает в себя два основных компонента: Relay Server и Allocation [13]:
Relay Server подключается к низкоуровневому слою Unity Transport и передает данные между клиентами;
Сервис Allocation работает на стороне сервера. Он позволяет игрокам создавать матчи и подключаться к ним с помощью кодов доступа.
В объекте NetPortals находятся три скрипта, которые описывают действия, происходящие при подключении, отключении клиентов (рис. 1):
GameNetPortal является общей точкой входа для игровых сетевых сообщений между клиентом и сервером;
ClientGameNetPortal является реализацией логики GameNetPortal на стороне клиента и добавление логики для клиента;
ServerGameNetPortal является реализацией логики GameNetPortal на стороне сервера и добавление логики для сервера;
![Объект NetPortals Объект NetPortals](https://habrastorage.org/getpro/habr/upload_files/8d1/3e8/b3e/8d13e8b3e57a4f35427246469ce2c9cf.jpg)
Объект PlayerArmature отвечает за поведение и логику игрока на игровом поле. К нему подключены скрипты NetworkObject, NetworkAnimator, ClientNetworkTransform, ThirdPersonController. Скрипт NetworkObject требуется для всех сетевых объектов, чтобы использовать сетевые компоненты у объекта. NetworkAnimator синхронизирует анимацию по сети. ClientNetworkTransform синхронизирует положение, поворот в реальном времени во время игры. Скрипт ThirdPersonController отвечает за всё поведение игрока.
Для оповещения изменений, которые случились с клиентом, и о которых должны узнать остальные клиенты, используется удаленный вызов процедур (RPC) и реплицированное состояние (NetworkVarible).
Концепция RPC распространена не только в видеоиграх, но и в индустрии программного обеспечения в целом. Это способы вызова методов для объектов, находящихся в разных исполняемых файлах.
Клиентские RPC могут быть вызваны как клиентом, так и сервером. Так как хост является одновременно и клиентом, и сервером, то при вызове команды клиентского RPC эта команда будет выполняться так же и у других клиентов. Таким образом, действия одного игрока на одной стороне будут спроецированы у всех игроков.
![](https://habrastorage.org/getpro/habr/upload_files/19c/196/e16/19c196e1607a888292ec16bfde6d9d7c.jpg)
Клиенты могут вызывать серверные RPC на хосте так же, как они могут вызывать серверные RPC на обычных серверах: RPC будет помещен в локальную очередь, а затем отправлен на хост, где он будет выполнен на версии того же NetworkObject на хосте.
![](https://habrastorage.org/getpro/habr/upload_files/a86/c85/bf8/a86c85bf89732f9236cbedc7de240611.jpg)
Когда серверный RPC вызывается хостом, то он помещается в локальную очередь, а затем выполняется на хосте после небольшой задержки.
![](https://habrastorage.org/getpro/habr/upload_files/c9b/610/cb5/c9b610cb5bcc6802414d1f99f1bf5be5.jpg)
RPC отлично подходит для отправки временных событий. При выполнении какого‑либо действия игрока, использующего анимацию, вызывается клиентом серверное RPC, обновляющее анимации игрока для всех клиентов.
Итоги
После кропотливой работы с движком, а также реализации сетевого взаимодействия на основе Р2Р нам удалось запустить игровую сессию на четырех игроков.
Несмотря на то, что процесс соединения осуществлялся на основе специального кода, генерируемого игроком сервером, сама возможность соединения без использования проводов или локалки произвела положительное впечатление на дипломную комиссию.
На последующих скринах представлены:
Окно для входа в открытую игровую сессию по коду.
![](https://habrastorage.org/getpro/habr/upload_files/f0f/240/a72/f0f240a72f32ed98a89704b24f763345.jpg)
Окно клиента‑хоста, который создал сессию.
![](https://habrastorage.org/getpro/habr/upload_files/2b5/bbd/d0d/2b5bbdd0dca690fcf0ed194735e69367.jpg)
Заключение
Проект был принят, студенты получили «отлично» и оставили после себя не только приятное впечатление о профессионализме выпускников СПО, но и вызов. Вызов для меня и для моих будущих дипломников. Что ж, будем заново учиться прыгать выше головы.
Wolf4D
Статья обрывается на том месте, где ожидалось начало самой нужной части. Обидно, тема-то интересная.