Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Всего 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 на стороне сервера и добавление логики для сервера;
Объект PlayerArmature отвечает за поведение и логику игрока на игровом поле. К нему подключены скрипты NetworkObject, NetworkAnimator, ClientNetworkTransform, ThirdPersonController. Скрипт NetworkObject требуется для всех сетевых объектов, чтобы использовать сетевые компоненты у объекта. NetworkAnimator синхронизирует анимацию по сети. ClientNetworkTransform синхронизирует положение, поворот в реальном времени во время игры. Скрипт ThirdPersonController отвечает за всё поведение игрока.
Для оповещения изменений, которые случились с клиентом, и о которых должны узнать остальные клиенты, используется удаленный вызов процедур (RPC) и реплицированное состояние (NetworkVarible).
Концепция RPC распространена не только в видеоиграх, но и в индустрии программного обеспечения в целом. Это способы вызова методов для объектов, находящихся в разных исполняемых файлах.
Клиентские RPC могут быть вызваны как клиентом, так и сервером. Так как хост является одновременно и клиентом, и сервером, то при вызове команды клиентского RPC эта команда будет выполняться так же и у других клиентов. Таким образом, действия одного игрока на одной стороне будут спроецированы у всех игроков.
Клиенты могут вызывать серверные RPC на хосте так же, как они могут вызывать серверные RPC на обычных серверах: RPC будет помещен в локальную очередь, а затем отправлен на хост, где он будет выполнен на версии того же NetworkObject на хосте.
Когда серверный RPC вызывается хостом, то он помещается в локальную очередь, а затем выполняется на хосте после небольшой задержки.
RPC отлично подходит для отправки временных событий. При выполнении какого-либо действия игрока, использующего анимацию, вызывается клиентом серверное RPC, обновляющее анимации игрока для всех клиентов.
Итоги
После кропотливой работы с движком, а также реализации сетевого взаимодействия на основе Р2Р нам удалось запустить игровую сессию на четырех игроков.
Несмотря на то, что процесс соединения осуществлялся на основе специального кода, генерируемого игроком сервером, сама возможность соединения без использования проводов или локалки произвела положительное впечатление на дипломную комиссию.
На последующих скринах представлены:
Окно для входа в открытую игровую сессию по коду
Окно клиента-хоста, который создал сессию.
Заключение
Проект был принят, студенты получили “отлично” и оставили после себя не только приятное впечатление о профессионализме выпускников СПО, но и вызов. Вызов для меня и для моих будущих дипломников. Что ж, будем заново учится прыгать выше головы.