Как сделать сетевую игру в unity
Перейти к содержимому

Как сделать сетевую игру в unity

  • автор:

Элементы сетевого взаимодействия в Unity

Встроенные в Юнити способы работы с сетями поддерживают всё, описанное на предыдущей странице. Создание серверов и подключение клиентов, обмен данными между подключенными клиентами, определение какой игрок управляет какими объектами, доступ через различные конфигурации сети — всё это поддерживается сразу после установки Юнити. На этой странице мы рассмотрим реализацию в Юнити этих сетевых задач.

Создание сервера

Перед тем как вы сможете начать играть в сетевую игру, вам необходимо определить другие компьютеры, с которым вы будете обмениваться данными. Чтобы это сделать, необходимо создать сервер. Это может быть как машина, на которой запущена игра, так и отдельная выделенная машина, не принимающая участия в игре. Чтобы создать сервер, просто вызовите Network.InitializeServer() в скрипте. Если вы хотите подсоединться к уже существующему серверу как клиент, вызывайте Network.Connect().

В общем, вам может быть очень полезно ознакомиться со всем классом Network class.

Связь с использованием компонентов Network View

Network View (просмотр сети) это компонент, который отправляет данные через сеть. Компонент Network View даёт вашим объектам GameObject возможность отправлять данные, используя удаленный вызов процедур RPC или синхронизацию состояний State Synchronization. Способ, которым вы используете Network View будет определять, как будут работать сетевые взаимодействия вашей игры. Network View имеют несколько вариантов, но все они необычайно важны для ваших сетевых игр.

Для большей информации об использовании Network View изучите Network View Guide page и Component Reference page.

Удаленные вызовы процедур (Remote Procedure CAlls, RPC)

Удаленные вызовы процедур (Remote Procedure Calls, RPC) это функции, объявленные в скриптах, прикрепленных к GameObject, который содержит NetworkView. Network View должен указывать на скрипт, содержащий RPC функцию. После этого, RPC функция может быть вызвана из любого скрипта в этом GAmeObject.

Для большей информации об использовании RPC в Юнити, изучите RPC Details page.

Синхронизация состояний (State Synchronization)

Синхронизация состояний это постоянный обмен данными между всеми клиентами игры. Таким способом позиция игрока может быть синхронизирована со всем клиентами, так что будет казаться, что он управляется локально, когда данные в действительности доставляются через сеть. Для синхронизации состояний внутри объекта GameObject вам просто надо добавить компонент NetworkView на этот объет и объяснить ему, за чем наблюдать. Наблюдаемые данные после этого синхронизируются со всеми клиентами в игре.

Для большей информации об использовании синхронизации состояний в Юнити, изучите State Synchronization page.

Network.Instantiate()

Network.Instantiate() позволяет вам создавать экземпляры префабов на всех клиентах естественно и просто. По сути, это вызов функции Instantiate() , но он выполняет создание экземпляров на всех клиентах.

Внутренне Network.Instantiate это простой вызов RPC, который выполняется на всех клиентах (также локально). Он распределяет NetworkViewID и назначает его созданной копии префаба, что гарантирует его правильную синхронизацию среди всех клиентов.

Для большей информации изучите страницу Network Instantiate.

NetworkLevelLoad()

Работа с обменом данными, состоянием клиентов игроков и загрузкой уровней может быть слишком большой. На странице Network Level Load вы найдёте полезный пример для решения этой задачи.

Master Server

Master Server (Управляющий сервер) помогает вам подбирать игры. При запуске сервера, вы подключаетесь к master server, и он предоставляет вам список всех активных серверов.

Master Server это место встречи для серверов и клиентов, где афишируются серверы и совместимые клиенты подключаются к запущенным играм. Это снимает необходимость заботиться об IP адресах для всех сторон. Это даже может помочь пользователям хостить игры без необходимости возиться с их маршрутизаторами, что требовалось бы при обычных обстоятельствах. Это может помочь клиентам пройти через брандмауэр сервера и добраться до частных IP адресов, обычно недоступных из публичного интернета. Это делается с помощью facilitator, который способствует установлению соединения.

Для большей информации изучите Master Server page.

Минимизация сетевого трафика

Важно использовать минимальный объём сетевого трафика, достаточный для корректной работы игры. В вашем распоряжении различные способы передачи данных, различные методы, определяющие что или когда пересылать и прочие ухищрения.

Для получения советов по уменьшению сетевого трафика, изучите Minimizing Bandwith page.

Отладка сетевых игр

Юнити поставляется с несколькими вспомогательными инструментами, которые помогут вам отладить вашу сетевую игру.

  1. Network Manager (Менеджер сетей) может быть использован для документирования всего входящего и исходящего сетевого трафика.
  2. Используя окна инспектора и иерархии вы можете отслеживать создание объектов, проверять сетевые идентификаторы и т.д.
  3. Вы можете запустить Юнити дважды на одной машине и открыть разные проекты в каждой программе. Для Windows это может быть сделано простым запуском другого экземпляра Юнити и открытием проекта из мастера проектов. Для Mac OS X, несколько экземпляров Юнити могут быть открыты из терминала и аргумент -projectPath может быть определен как: /Applications/Unity/Unity.app/Contents/MacOS/Unity -projectPath “/Users/MyUser/MyProjectFolder/” /Applications/Unity/Unity.app/Contents/MacOS/Unity -projectPath “/Users/MyUser/MyOtherProjectFolder/”

Убедитесь, что проигрыватель работает в фоновом режиме во время отладки сети потому что, если, например, два экземпляра запущены одновременно, один из них не будет активным. Это разорвет цикл сетевого взаимодействия и может вызвать непредсказуемые последствия. Вы можете включить этот параметр в Edit->Project Settings->Player в редакторе или при помощи Application.runInBackground

Выбираем правильную библиотеку для мультиплеера

Разработчики Unity оценили самые популярные на сегодняшний день фреймворки сетевого кода для многопользовательских игр и поделились результатами.

Не существует идеального универсального решения для всех видов игр. Например, FPS, запущенная на выделенном игровом сервере с защитой от читов, такая как Apex Legends, будет иметь совершенно другие требования к сетевому коду, чем MOBA, работающая как P2P с детерминированным откатом для предотвращения читерства, например Heroes Strike.

Поскольку не существует единого решения, разработчикам необходимо оценить варианты и решить, какое решение — или комбинация решений — лучше всего соответствует требования игры.

Unity и сетевой код

Unity предлагает два разных решения: UNet для GameObjects, который в настоящее время находится в режиме поддержки, и DOTS-netcode для ECS и находится в предварительной версии.

В родмепе на 2021 компания подтвердила планы по разработке решения для сетки. И пока работают над этим решением, они предлагают разработчикам оценить различные альтернативы.

Выбираем лучшее

Оценивали по следующим критериям:

  • Стабильность/поддержка. Оценивалось по трём осям — вероятность ошибок или сбоев, время отклика для исправления проблем или помощи в отладке проблемы и вероятность критических изменений в API.
  • Простота использования. По отзывам пользователей о том, насколько легко начать работу и выполнять общие задачи. Сюда входят примеры использования, документация, руководства и простые API-интерфейсы для создания прототипов.
  • Производительность. Смотрели на сборки мусора/выделения памяти, минимальные накладные расходы на пинг, производительность вычислений и, в идеале, возможность многопоточности.
  • Масштабируемость. Как и в случае с производительностью, оценили способность решения поддерживать большее количество подключённых клиентов без значительного ущерба для производительности.
  • Функциональность. Сосредоточились на функциях среднего уровня, таких как репликация объектов и переменных, RPC, управление сценой и т. д. Также искали возможности более высокого уровня, такие как прогнозирование и компенсация задержек.
  • Стоимость. Учитывалась как стоимость библиотек/решений, так и возможные скрытые затраты.

Ниже краткая выжимка. Полный отчёт можно посмотреть тут.

Final Foe. О разработке сетевого мультиплеера на Unity

Сегодня я расскажу о том, как добавил сетевой мультиплеер в свою игру Final Foe. Без опыта сетевого программирования и без финансовых затрат.

В предыдущей статье я уже писал о проекте Final Foe и об удивительных возможностях для современных разработчиков игр. Поэтому сегодня я сосредоточусь непосредственно на мультиплеере. Надеюсь, вам будет интересно!

Часть 1. Многопользовательская игра — что это?

Лично мне, играть с друзьями — гораздо интереснее, чем в одиночку. Поэтому я изначально хотел, чтобы в моей игре Final Foe был мультиплеер.

По сути, существует 3 самых распространённых варианта многопользовательской игры:

Локальный мультиплеер
Вариант, при котором двое или более людей одновременно играют на одном и том же устройстве. Не путать с игрой по локальной сети (LAN). Для локального мультиплеера не нужно передавать данные по сети. Разработка почти не отличается от разработки однопользовательской игры. Кстати, в Steam специально для таких игр есть отличная функция Remote Play Together, позволяющая одному игроку подключиться к другому, видеть его экран и управлять удалённо. Эдакий TeamViewer для игр.

Хост-Клиент
Он же Host-Client или Listen Server. Один из игроков одновременно является и сервером и клиентом, т.е. хостом. Остальные игроки — только клиентами. Хост включает сервер на собственном компьютере и подключается сам к себе. Клиенты подключаются к хосту. Все сетевые данные между клиентами передаются через хоста. У хоста всегда нулевой пинг, у удалённых клиентов пинг выше.

Выделенный сервер
Он же Dedicated Server. Существует отдельный независимый сервер, к которому подключаются игроки. Все сетевые данные между игроками передаются через него. Ключевая игровая логика также обрабатывается на этом сервере, поэтому возможностей для читерства гораздо меньше. Все игроки находятся в равных условиях. Такому серверу требуется отдельный хостинг и постоянная поддержка.

Каждый из этих вариантов имеет свои преимущества и недостатки, поэтому выбор всегда зависит от того, что у вас за игра.

В Final Foe моей целью было сделать кооперативный мультиплеер до 4-х игроков. При этом каждый игрок должен был иметь возможность передвигаться без привязки к зоне видимости другого игрока. Это означало, что локальный мультиплеер мне не подходил.

Выделенный сервер, при всех своих преимуществах, потребовал бы от меня постоянно оплачивать хостинг и постоянно администрировать, а возможно и масштабировать этот сервер. Это означало, что после выпуска игры мне бы пришлось регулярно тратить деньги и время на поддержание работоспособности мультиплеера в моей игре. А учитывая, что я планировал продавать свою игру по принципу единовременной продажи (Buy-To-Play) — однажды мог бы настать такой момент, когда игру уже никто не покупает, а поддерживать выделенные сервера для ранее купленных копий игры я должен. И в этот момент математика доходов и расходов начала бы работать не в мою пользу.

А вот вариант «Хост-Клиент» давал мне ряд преимуществ. Во-первых, Final Foe — это PVE-ориентированная игра. Игроки в ней должны сражаться на одной стороне, отбиваясь от монстров. Это значит, что небольшая разница в сетевой задержке между хостом и подключёнными игроками не так критична, как в PVP-ориентированных играх. Во-вторых, для варианта «Хост-Клиент» не требуется постоянно поддерживать отдельный сервер. Если несколько друзей хотят сыграть в Final Foe, то один из них просто запускает игру как хост, а остальные подключаются к нему. И всё, они играют.

Таким образом, я решил использовать вариант «Хост-Клиент». Поэтому далее речь пойдёт о нём. Если же вы хотите узнать о типах многопользовательской игры более подробно, рекомендую посмотреть это видео.

Final Foe — Multiplayer Gameplay

Часть 2. Доступные сетевые решения.

Чтобы не писать логику клиент-серверного взаимодействия самостоятельно — вы можете воспользоваться готовым сетевым решением.

Я расскажу вам о паре сетевых решений для Unity. Однако вы наверняка знаете, что существует немало других игровых движков: Unreal Engine, Godot, российский движок Unigine и остальные. Вполне возможно, что вам подойдёт какой-то другой движок, с какими-то другими сетевыми решениями. Например, в движке Unreal Engine — сетевое решение доступно сразу, «из коробки». В какой-то момент я даже хотел перевести проект Final Foe на Unreal Engine из-за этого. Сравнение Unity и Unreal Engine — это тема для отдельной статьи. И эта тема не так проста и однозначна, как может показаться. Лично для меня, и Unity и Unreal Engine — это очень мощные и функциональные инструменты. Со своими преимуществами и недостатками по отношению друг к другу.

Говоря обобщённо, «сетевое решение» (сетевая библиотека) — это дополнительный ассет с библиотекой кода, в которой весь функционал для передачи данных по сети уже написан. Вам остаётся лишь использовать его в своей игровой логике, следуя документации и обучающим материалам. Скачиваем, добавляем в проект. И после этого вы сразу можете делать то, что вам нужно: синхронизировать передвижение персонажей между клиентами, синхронизировать анимации, визуальные эффекты, звуки, переменные, методы и многое другое. Буквально с помощью нескольких строчек кода. А иногда, просто добавив определённый компонент на игровой объект. Нет необходимости вручную формировать и отправлять пакеты с данными. Это уже написано за вас. Конечно, понадобится изучить документацию и понять, что к чему. Но это всё равно гораздо проще, чем писать абсолютно всю сетевую логику для вашей игры с нуля.

Создание многопользовательской игры на Unity3D.

Чек-лист успешной адаптации или как пройти испытательный срок в компании?

10 ключевых ошибок во время собеседования

Подготовка к собеседованию в IT

Активный поиск первой работы в IT – советы и частые ошибки

IТ в период войны: как найти первую работу

Использование и оптимизация UI системы при создании игр в Unity.

Из данного видео Вы узнаете о таком понятии — “сетевая игра”, localhost, ping и сокеты. Демонстрация примера простого сетевого взаимодействия, обзора сетевых движков UNet и Photon. Объяснение процесса работы игры с условием выделенного сервера, проектирования сетевой игры. Создания чата и RPC.

Покупай подписку с доступом ко всем курсам и сервисам

Библиотека современных IT знаний в удобном формате

Выбирай свой вариант подписки в зависимости от задач, стоящих перед тобой. Но если нужно пройти полное обучение с нуля до уровня специалиста, то лучше выбирать Базовый или Премиум. А для того чтобы изучить 2-3 новые технологии, или повторить знания, готовясь к собеседованию, подойдет Пакет Стартовый.

  • Все видеокурсы на 3 месяца
  • Тестирование по 10 курсам
  • Проверка 5 домашних заданий
  • Консультация с тренером 30 мин
  • Все видеокурсы на 6 месяцев
  • Тестирование по 16 курсам
  • Проверка 10 домашних заданий
  • Консультация с тренером 60 мин
  • Все видеокурсы на 1 год
  • Тестирование по 24 курсам
  • Проверка 20 домашних заданий
  • Консультация с тренером 120 мин

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *