Unity как сделать мультиплеер

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

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

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

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

Гибкая

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

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

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

Сыграть

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

Исходный код

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

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

«В Unity MultiPlayer мы нашли решение, способное дать нашим игрокам массу возможностей, а нам — умение легко масштабироваться».

Steven Derks

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

William Tan

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

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

Unity Personal

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

Unity Plus

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

Unity Pro

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

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

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

0,49 долл./ГБ

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

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

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

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

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

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

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

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

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

Более 50 сообщений в секунду — это ненормально много для большинства мультиплеерных игр в режиме реального времени.

Более 160 байтов на сообщение — это ненормально много для большинства мультиплеерных игр в режиме реального времени.

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

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

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

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

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

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

Читайте также:  Delphi прервать выполнение процедуры

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

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

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

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

По умолчанию — топология «точка–точка», в которой один из клиентов («хост») играет роль сервера. Встроенные сетевые библиотеки могут гибко поддерживать архитектуру «клиент-сервер». Серверные библиотеки Unity предоставляются всем пользователям с доступом к исходному коду Unity.

Что такое «число одновременных игроков»?

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

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

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

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

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

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

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

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

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

Unity Network значительная вещь в создании игр, с помощью неё можно создать кооператив в своей игре . Unity Network чаще всего используют в создании мультеплеера до 5-6 человек, далее лучше использовать Photon, с которым мы познакомимся позже. Сегодня же я вам расскажу об основах, вы сможете создавать комнату и использовать простейшие функции. Пример построения кода некоторых функций :
1. Network.InitializeServer(5,2500, true);
С помощью этой функции мы создаём сервер, первое значение отвечает за максимальное количество игроков на сервере, второе это порт, треть отвечать за использование NAT.
2. Network.Connect("127.0.01", 2500);
С помощью этой функции мы подключаемся к серверу, первое значение это IP сервера, в данном случае используется стандартный локальный ip, второе значение это порт
3. Network.Disconnect();
С помощью этой функции мы отключаемся от сервера.
Вот три самых основных функции при работе с сервером.
Построение комнаты с использованием блока RPC. Пример построения кода :
1. void Update () <
2. if(GUI.Button(new Rect(1,1,1,1), "Start Room")) <
3. networkView.RPC("LoadLevel", RPCMode.All);
4. >
5. >
6. [RPC]
7. void LoadLevel() <
8. Application.loadLevel(1);

1- Открываем функцию Update ()
2 – Создаём кнопку "Start Room", и если мы на неё нажмём, то выполнится третья строка.
3- Выполняем блок RPC, в нём выполняем функцию LoadLevel, второе значение отвечает за то, что каким игрокам будет отдаваться эта команда, в данном случаи она будет отдаваться все.
4 – Закрываем условие кнопки.
5 – Закрываем функцию Update()
6 – Открываем блок RPC
7 – Объявляем функцию LoadLevel
8 – Выполняем загрузку 1 уровня
Вот стандартные функции и небольшой пример, надеюсь вам поможет

Я, как и многие из вас, большой поклонник многопользовательских игр. В них меня прельщает в основном дух соревнования и возможность приобретать улучшения, накапливая достижения. Да и сама идея выхода в свет все большего количества игр данного типа побуждает к действию.
С недавнего времени я и сам взялся за разработку собственного проекта. И поскольку на Хабрахабре статей на эту тематику не нашел – решил поделиться своим опытом написания многопользовательской игры на движке Unity3D. Также хочу рассказать о компонентах Network и NetworkView, атрибуте RPC и встроенных методах-ивентах. В конце статьи подан пример игры и, разумеется, сам проект для Unity. Итак…

Читайте также:  Почему на некоторых сайтах нельзя скопировать текст
Класс 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:

Знаю, что синхронизация и управление должны находиться раздельно, но для примера я решил объединить их. Как вы заметили, здесь NetworkView создается во время инициализации скрипта. На мой взгляд, это более удобный способ для защиты от возможного «забыл добавить» (разумеется, если не написано RequireComponent( typeof( Rigidbody ))), а также уменьшает в инспекторе количество компонентов на объекте.
К примеру, у меня был случай: когда, на первый взгляд, все было сделано правильно, однако мой скрипт не делал интерполяцию, и все мои действия в синхронизации игнорировал. Так вот ошибкой оказалось то, что Observed был не моим скриптом, а трансформ объекта.

Итак, теперь у нас есть все необходимые скрипты для написания мини-игры.
Создаем пустой объект и назначаем ему скрипты MultiplayerMenu, ServerSide, ClientSide.
Создаем плоскость и немного опускаем.
Создаем префаб игрока (в моем примере это будут шары). Создаем объект «сфера», назначаем ему скрипт PlayerControls и добавляем в префаб. Префаб перетягиваем на ClientSide в поле Player Prefab.
На этом все, компилируем проект (не забывая в настройках игрока включить Run in background) и запускаем несколько раз. В одном из окон жмем сервер, на остальных – клиент, и смотрим на результат.

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

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

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

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

Adblock detector