Как сделать мультиплеер в unity

Обновлено: 04.07.2024

Я пытаюсь создать онлайн-игровой сервер для своей игры Tank 2D (Unity). В моей игре 2-4 игрока будут управлять своими танками и сражаться друг с другом.

Затем я попытался создать свой собственный сервер с Nodejs là socket.io для взаимодействия сервер-клиент. Все очень просто: получает данные от одного и передает их другим. Кажется, все работает нормально, пока не вступит физическая часть: сервер должен доверять клиентам, когда они говорят, что что-то попадает или взрывается, а затем транслирует это другим клиентам. Не говоря уже о обманутых клиентах, с задержкой в ​​сети физическое моделирование клиентов будет отличаться. Например, танк может быть поражен на этом клиенте, но он должен быть прикрыт стеной на другом и остаться в живых, но танк позади него ловит пулю и взрывается из-за задержки. В этих случаях сервер не знает, какой из них слушать.

В заключение мне нужно предложение для моего игрового сервера:

Я иду в правильном направлении, потому что кажется, что некоторые сервисы игрового сервера (такие как Photon, Unity Networks) просто не заботятся о том, как реализовать игровую логику на сервере. И делает ли это их не авторитетным сервером?

Я новичок в этой области, все будет оценено по достоинству!

2 ответа

Я бы посоветовал создать свой собственный сервер для вашей игры, как вы это сделали с NodeJS. Большинство известных мне решений довольно сложны в использовании и не могут делать все, что вы хотите.

Например, игра Hearthstone от Blizzard основана на Unity для клиента и имеет настраиваемую серверную часть.

Вот несколько советов о том, как создать свой игровой сервер.

Кажется, все работает нормально, пока не вступит физическая часть: сервер должен доверять клиентам, когда они говорят, что что-то попадает или взрывается, а затем транслирует это другим клиентам.

При создании сервера вы должны принимать все важные решения на стороне сервера, а не на стороне клиента. Это сервер, который запускает вечеринку, поэтому сервер должен иметь следующую информацию

  • Размер карты
  • Количество игроков
  • Данные о каждом игроке (очки здоровья, позиция, размер, скорость атаки . )
  • Любая другая информация, необходимая для принятия решений

Теперь клиент всегда должен посылать серверу очень слабый сигнал, как показано ниже.

  • Проверьте, разрешено ли действие
  • Если это разрешено, смоделируйте действие. Если нет, поставьте в очередь
  • Отправлять пользователям информацию о том, что происходит (первый игрок ударил, второй игрок умер, игрок оставил четыре хода и т. Д.)

Благодаря этому сервер знает, когда что-то происходит, и решает, что происходит. Вы не полагаетесь на информацию на стороне клиента, вы только получаете желаемые действия игрока.

Однако, как вы сказали, из-за задержки и других сетевых факторов ваш клиент не может быть слишком зависимым от сервера. В современных играх клиент имеет те же данные об игроке, что и сервер, и не всегда полагается на сервер для отображения на экране того, что происходит.

Например, если вы решите двигаться влево, клиент знает вашу скорость движения, поэтому он может отображать движение, не полагаясь на сервер.

Когда происходит синхронизация, сервер отправляет клиенту критическую информацию, а клиент меняет любую отображаемую в данный момент информацию на то, что отправляет сервер.

Обработка задержки - огромная проблема при создании онлайн-игры как на стороне сервера, так и на стороне клиента, и это не тема этого вопроса.

Подводя итог, ваш сервер должен

  • быть домашним
  • Получать действия только от клиентов
  • Смоделируйте игру
  • Отправлять клиентам информацию о происходящем
  • Регулярная синхронизация с клиентами

Надеюсь на эту помощь =)

Что касается вашей игры, я предполагаю, что игрок может использовать только действие MOVE.

Когда клиент хочет ПЕРЕМЕСТИТЬСЯ, он отправляет на сервер пакет, говорящий, что он хочет переместиться. Вы можете использовать любой протокол, который хотите для связи client server, я использую двоичный протокол, но допустим, вы используете Json

Благодаря этому ваш сервер будет знать, что пользователь хочет переместиться влево. Итак, вам просто нужно уменьшить user_posx на значение user_speed , чтобы получить на стороне сервера вашу новую позицию. Если эта позиция находится на краю карты, у вас есть два варианта выбора: пользователь появится на другом краю карты или запретит действие.

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

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

В сети есть множество уроков по созданию онлайн игр, мультиплееров или по созданию сетевых игр в Unity 5, вот и я хочу начать серию уроков и рассказать вам, как создать свой мультиплеер на бесплатном игровом движке Unity5 при помощи инструмента Photon Unity Networking.

В этой части мы ознакомимся с инструментом Photon и подготовим сцену в Unity для дальнейшего создания онлайн игры. Давайте начнем.

Откроем новый проект и перейдем в Asset Store, нажмем Window — Asset store или клавиши ctrl+9. Откроется окно магазина, где в поиске можно вбить Photon и выбрать Photon unity networking free.

photon asset store

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

photon online game

Далее нажимаем Import и мультиплеер импортируется в Unity.

photon import

После импорта Photon потребует ввести AppID.

appid

photon register

Вводим свой e-mail, смотрим в почте письмо и переходи по ссылке в нем для дальнейшей регистрации.

photon email

Вводим свой пароль.

photon pass

photon dash

Видим нужный нам appId, просто копируем его и вставляем в окно Photon в Unity и жмем Skip project.

appid site

appid photon

В самом движке появится несколько папок с ресурсами мультиплеера и загрузится Demo сцена Photon, где можно просмотреть примеры созданных проектов при помощи Photon unity networking.

photon demo

Можете протестировать эти примеры и определится, походит ли данный инструмент для создания вашей игры. На этом первая часть урока закончена, в следующей части мы познакомимся со скриптами Photon и начнем создавать свою онлайн игру. Удачных проектов!

Чисто из интереса хотел почитать как сделать простенький локальный мультиплеер на Unity. Из нормального нашёл только информацию про UNet, но ведь его уже выпилили? Какие есть другие варианты?

1 ответ 1

В официальной документации к Юнити любой версии есть целая категория посвященная мультиплееру и нетворкингу:

Слева сверху выбирается та версия, которая установлена у тебя на комп'ютере. Начни с изучения оф.документации, а там если возникнут КОНКРЕТНЫЕ проблемы - приходи с вопросами сюда.


Всё ещё ищете ответ? Посмотрите другие вопросы с метками unity3d или задайте свой вопрос.

Похожие

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

дизайн сайта / логотип © 2022 Stack Exchange Inc; материалы пользователей предоставляются на условиях лицензии cc by-sa. rev 2022.1.28.41306

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

Разрабатывайте и поддерживайте свою следующую многопользовательскую игру

Build a reliable foundation for your game

Создайте надежную основу для своей игры

    Бэкенд-платформа для многопользовательских игр на основе GameObject
    Бэкенд-платформа для многопользовательских игр на основе сущностей

Multiplayer mobile game session

Объединяйте игроков со всех уголков мира

    Одноранговые коммуникации
    Закрытые и общедоступные лобби
    Готовый хостинг игрового сервера
    Сервисы подбора игроков для многопользовательских игр

Multiplayer communication

Продвигайте здоровое и позитивное социальное взаимодействие

    Средства голосовой и текстовой связи в играх
  • Сообщество и безопасность (выйдет вскоре)
    Анализ безопасности игроков и управление ею

Подробнее

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

Разрабатывайте многопользовательские игры с помощью стабильного и гибкого решения NetCode, способного удовлетворить потребности любого разработчика.

Надежная инфраструктура хостинга

Получите надежную инфраструктуру хостинга игр, не обременяя разработчиков месяцами связанной с бэкэндом работы.

Объединение игроков благодаря голосовой связи и текстовому чату

Сформируйте вовлеченную базу игроков с более высокими показателями удержания за счет надежной внутриигровой коммуникации.

Мгновенные обновления

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

Быстрый подбор игроков

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

Автоматическое масштабирование серверных ресурсов

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

Доступное решение для объединения игроков

Объединяйте игроков без необходимости в специализированном сервере с помощью надежного однорангового решения.

Кроссплатформенный игровой процесс

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

The InnerSloth team were considering a sequel to Among Us when the summer of 2020 hit. As InnerSloth’s game became the most popular multiplayer title on the planet, they had to find a way to make sure their servers stayed standing.

Among Us Multiplayer

Оптимизация онлайн-игр

Respawn Apex Legends

Respawn

Более чем 50 миллионов игроков Apex Legends по всему миру.

Riot Valorant

Великолепное качество голосовой связи в VALORANT и других хитах Riot.

Velan Knockout City

Velan

Крупный запуск первой многопользовательской игры Velan.

  • Хостинг игрового сервера
  • Голосовой и текстовый чаты
  • Кроссплатформенный игровой процесс

Team17 Overcooked

Team17

Создание отличных матчей для Overcooked!, AYCE и Worms Rumble.

  • Хостинг игрового сервера
  • Система подбора мощности
  • Кроссплатформенный игровой процесс

Ресурсы для начала разработки

Futuristic toolbox

8 факторов, которые стоит учитывать при разработке многопользовательских игр

Изучите восемь важных рекомендаций по разработке и поддержке многопользовательских игр.


Встречайте: Boss Room

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

Масштабирование Apex Legends

Масштабирование Apex Legends

Аудитория Respawn выросла с нуля до 50 млн за 24 дня. Узнайте, как студия обеспечила такую производительность серверов.

Развитие сообществ: полное руководство

Развитие сообществ: полное руководство

Узнайте, как создать процветающее сообщество с помощью внутриигровых коммуникаций.

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

Мы используем cookie-файлы, чтобы вам было удобнее работать с нашим веб-сайтом. Подробнее об этом можно узнать на странице, посвященной политике использования cookie-файлов.

Unity Multiplayer — это самый простой способ создавать многопользовательские игры для платформы Unity. Их легко развертывать, и они обладают богатыми возможностями настройки. Серверы Unity позволяют вашим пользователям найти друг друга для игры.


Простое развертывание

Unity Multiplayer использует уже известные вам рабочие процессы, так что вы можете быстро разворачивать и прототипировать сетевые функции.


Гибкая

Низкоуровневые API дают вам доступ к ядру среды Unity Multiplayer, чтобы вы могли оптимизировать вашу игру для сетевого окружения.


Поддерживается Unity

Серверы Unity Matchmaker упрощают задачу соединения ваших пользователей. Серверы-посредники Unity Relay управляют сетевым трафиком чтобы обеспечить качество пользовательских сеансов независимо от того, где находятся игроки.


Сыграть

Tanks. — полнофункциональная игра, созданная при помощи Unity Multiplayer. Узнайте, чего можно достичь с Multiplayer.

Исходный код

Узнайте, как Tanks. решает насущные проблемы, будь то мошенничество или большое время отклика. Код, ассеты, документы — все, что нужно. Бесплатно.

Что говорят наши клиенты


Steven Derks


William Tan

Используйте Unity Multiplayer уже сейчас

Unity Multiplayer включен во все тарифные планы Unity.

Unity Personal

Число одновременных игроков

Unity Plus

Число одновременных игроков

Unity Pro

Число одновременных игроков

Готовы выпустить вашу игру?

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

0,49 долл./ГБ

Оцените ежемесячный платеж

Скорость игры

Карточные игры, настольные игры

Реальный масштаб времени

Гонки, ролевые онлайн-игры и шутеры

Требовательные игры в реальном времени

Число активных игроков в месяц

3,4% игр привлекут более 10 тысяч одновременных игроков.

Число одновременных игроков — это количество людей, играющих в вашу игру в любой данный момент времени. Калькулятор по умолчанию считает, что 100 активных игроков в месяц равны одному одновременному игроку.

Более 10% утилизации — это ненормально много для большинства мультиплеерных игр.

Ожидаемая утилизация — это среднее число людей, играющих в вашу игру, с учетом наплыва игроков в ночное время и в выходные дни.

Ожидаемое число игроков в месяц

Ожидаемая ежемесячная стоимость

Где найти техническую документацию к Unity Multiplayer?

Для каких проектов больше всего подходит Unity Multiplayer?

Для сессионных проектов, для игр реального масштаба времени, таких как шутеры, гонки и ролевые онлайн-игры.

Должен ли я использовать серверы Unity Matchmaker и Relay?

Нет. С Unity Multiplayer API вы можете использовать и интегрировать свои собственные решения.

Какие сетевые топологии поддерживает Unity Multiplayer?

Число людей, играющих в игру в отдельный момент времени.

Где расположена инфраструктура Unity Multiplayer?

Инфраструктура Unity Multiplayer глобально распределена и использует центры обработки данных, находящиеся в Соединенных Штатах, Европе и Юго-Восточной Азии.

Когда моя игра получит статус Ready to Release?

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

С какими платформами работает режим Unity Multiplayer?

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

Когда моя многопользовательская игра сможет получить статус Ready to Release?

Учетная запись Unity Plus или Pro, связанная с действительным платежным инструментов. Пользователи Unity Personal также могут воспользоваться исключением. Подробности ищите на форуме (на английском языке).

Класс Network
Основные методы:

Network.Connect (string host, int remotePort, string password = "") – выполняет подключение к серверу host с портом remotePort и паролем password. Метод возвращает перечисление NetworkConnectionError.

Network.InitializeServer(int connections, int listenPort, bool useNat) – создает сервер с максимально разрешенным количеством подключений connections; порт входящих подключений listenPort, а также useNat: использовать либо нет NAT . Также возвращает перечисление NetworkConnectionError.

Network.InitializeSecurity() – вызывается перед Network.InitializeServer() для защиты от читерства. Подробности в официальной документации. Не вызывать на клиенте!

Network.Instantiate(Object prefab, Vector3 position, Quaternion rotation, int group) – создает экземпляр префаба prefab в сети в позиции position с поворотом rotation и группой group. Возвращает весь созданный объект, с которым после создания можно выполнить дополнительные действия. Подробности – далее в статье.

Основные свойства:

bool Network.isClient и bool Network.isServer – определяют, является ваша игра сервером либо клиентом. Оба свойства являются false, если не был создан сервер или не было подключения к серверу.

string Network.incomingPassword – свойство задает пароль для входящих подключений.

NetworkPlayer Network.player – возвращает экземпляр локального игрока NetworkPlayer.

NetworkPeerType Network.peerType – возвращает текущее состояние подключения: Disconnected (отключен), Server (запущен как сервер), Client (подключен к серверу), Connecting (попытка, в процессе подключения).

NetworkPlayer[] Network.connections – возвращает всех подключенных игроков. На клиенте возвращает только игрока сервера.

Основные ивенты (для унаследованного от MonoBehaviour):

OnConnectedToServer() – вызывается на клиенте при успешном подключении к серверу.

OnDisconnectedFromServer(NetworkDisconnection info) – вызывается на клиенте при отключении от сервера и на сервере при завершении подключений Network.Disconnect(). В info содержится причина отключения: LostConnection (потеря связи) и Disconnected (при успешном отключении).

OnFailedToConnect(NetworkConnectionError error) — вызывается на клиенте при ошибке подключения. error содержит ошибку типа NetworkConnectionError.

OnNetworkInstantiate(NetworkMessageInfo info) — вызывается на клиенте и сервере, если был создан новый экземпляр методом Network.Instantiate(). Содержит info типа NetworkMessageInfo.

OnPlayerConnected(NetworkPlayer player) — вызывается на сервере при успешном подключении клиента и содержит player типа NetworkPlayer.

OnPlayerDisconnected(NetworkPlayer player) — вызывается на сервере при отключении клиента и содержит player типа NetworkPlayer.

OnServerInitialized() — вызывается на сервере, после того как сервер был успешно создан.

OnSerializeNetworkView(BitStream stream, NetworkMessageInfo info) — важный ивент для синхронизации компонента с сетью. Подробности – далее в статье.

Класс NetwokView

Данный класс существует также и как компонент для Unity, и предназначен он для синхронизации компонентов в сети и для вызова RPC .
Обладает такими свойствами синхронизации NetworkStateSynchronization:

  • Off — не выполняет синхронизацию объекта, однако позволяет вызывать удаленные процедуры.
  • ReliableDeltaCompressed — выполняет передачу пакетов поочередно и проверяет, доставлен ли пакет (подобно протоколу TCP).
  • Unreliable — выполняет быструю отправку пакетов, не гарантируя доставки (подобно протоколу UDP).
Основные методы:

networkView.RPC(string name, RPCMode mode, params object[] args) — вызывает удаленную процедуру name, mode определяет получателей, args – аргументы для передачи процедуре.

networkView.RPC(string name, NetworkPlayer target, params object[] args) – то же, что и предыдущий метод, однако выполняет отправку конкретному игроку NetworkPlayer.

Основные свойства:

bool networkView.isMine – свойство, определяющее, является ли объект локальным. Весьма часто используется для проверки владельца объекта.

Component networkView.observed – компонент, который будет синхронизироваться. Если это скрипт, то он должен содержать метод OnSerializeNetworkView(BitStream stream, NetworkMessageInfo info), упомянутый выше.

NetworkPlayer networkView.owner – свойство, возвращающее владельца объекта.

NetworkStateSynchronization networkView.stateSynchronization — тип синхронизации: Off, ReliableDeltaCompressed, Unreliable.

NetworkViewID networkView.viewID — уникальный идентификатор в сети для NetworkView.

Атрибут RPC
Метод OnSerializeNetworkView(BitStream stream, NetworkMessageInfo info)

Данный метод используется для синхронизации компонента в сети. Он вызывается всякий раз при получении либо отправке данных по сети.
Вот типы данных, которые могут быть получены/отправлены методом Serialize: bool, char, short, int, float, Quaternion, Vector3, NetworkPlayer, NetworkViewID.
Для проверки, идет ли прием либо передача, используются свойства isReading или isWriting.

Привожу пример использования:

Интерполяция


Подробнее о методах оптимизации синхронизации по сети смотрите на сайте разработчиков: Valve Developer Community — Source Multiplayer Networking

Пример многопользовательской игры

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

Создаем скрипт ServerSide.cs и пишем туда следующее:

Теперь создаем скрипт клиента ClientSide.cs:

Таким образом, клиентская и серверная логика есть, теперь для нее нужно сделать управление MainMenu.cs:

Управление сетью создано. Далее пишем управление игроком PlayerControls.cs. В данном примере я использую другой способ применения компонента NetworkView:

Ссылка на проект.
*В проекте могут быть логические ошибки, но на суть данной статьи они не влияют.

Всех благодарю за внимание!
Желаю успехов в создании многопользовательских игр!

Читайте также: