Перейти к содержимому

Как сделать игру по сети

  • автор:

Как играть в старые игры по сети? Программы для игры по локалке и интернету

sposobyi-igrat-po-seti

Приветствую всех!

Игра с компьютером, конечно, увлекательна, но гораздо интереснее противостоять не боту, а реальному человеку! Не исключено, что он сделает какую-нибудь ошибку, не стандартный шаг, чем-то удивит. К тому же, многие опытные геймеры играют куда интереснее и лучше ботов. ��

Но если со многими современными сетевыми играми проблем с коннектом особых не возникает (WOW, Танки, GTA и пр.), то вот с играми несколько постарше — у многих пользователей появляются трудности.

Собственно, в этой статье приведу разные варианты и способы, как можно сыграть в игры по локальной сети и интернету с реальными людьми (даже в те игры, в которых это не предусмотрено и нет ничего, кроме режима LAN (т.е. игры только по «локалке») ). Так, что рекомендую занести эту заметку всем любителям игр в закладки! ��

�� Нужная информация!

1) Как узнать свой IP-адрес (локальный и внешний). Это может пригодиться для использования нижеприведенных утилит.

2) Как запустить старую игру на новом компьютере. Прим.: не все игры сразу же работают в современной Windows 10.

Способы, как можно сыграть по сети

Вариант №1: с помощью функций самой игры

Во многих играх так или иначе предусмотрен сетевой режим (другое дело, что не так просто заставить игру «увидеть» другой ПК в локальной сети или интернете).

В самом безобидном случае, достаточно:

  1. чтобы кто-то из игроков (как правило тот, у кого мощнее ПК и стабильнее интернет) создал игру (он будет сервером);
  2. а другие присоединились к нему, введя его IP-адрес (�� инструкция о том, как узнать свой IP).
  3. Важно : если игра не соединяется, возможно вам нужно �� пробросить порты в роутере (пробросить порты нужно серверу, т.е. тому, кто создал игру).

tsivilizatsiya-4-prisoedinenie-k-igre-po-ip-adresu

Цивилизация 4 — присоединение к игре по IP-адресу

Очень распространенный также вариант — это игра по LAN, т.е. по локальной сети (есть во многих играх). Причем, частенько в играх есть только этот единственный вариант, что и приводит к невозможности сетевой игры без спец. решений*.

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

игра по локальной сети (LAN)

игра по локальной сети (LAN)

Чтобы выйти из этого положения, необходимо воспользоваться специальными приложениями:

  • GameRanger;
  • Hamachi;
  • LanGame и пр.

О них пару слов ниже.

Вариант №2: GameRanger

Главное окно программы GameRanger

Главное окно программы GameRanger

На мой скромный взгляд — это одна из лучших программ для игры по сети во множество старых (и не очень) игр. Почему:

  • отличное соединение между игроками из самых разных стран (лаги возможны, но вы заранее видите у кого какой коннект с программой: качество соединения отображается в виде «зеленых» полосок);
  • поддержка сотен самых разнообразных игр (серия FIFA, Герои, Казаки, Age of Empires, Civilization и т.д.);
  • возможность добавлять друзей к себе в «избранное», вести с ними переписку, создавать собственные «комнаты» (чаты);
  • огромное сообщество игроков: тысячи любителей со всего Мира!
  • автоматический запуск игры и коннект со всеми игроками (никуда никакие IP вводить не нужно! Отдельно запускать игру тоже не нужно! Все сделает утилита);
  • низкие требования, незначительное количество рекламы. Программа выполнена в стиле минимализм, что не может не радовать.

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

Вариант №3: LanGame

LanGame - главное окно программы

LanGame — главное окно программы

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

Пользоваться утилитой очень просто: достаточно обоим игрокам установить ее, затем добавить IP-адреса друг друга в утилиту и, собственно, можно запускать игру. Для игры же теперь, вы будете как будто в одной локальной сети.

Примечание : программе для работы не требуется доступ к интернету!

Вариант №4: Hamachi

Hamachi - главное окно программы

Hamachi — главное окно программы

Ну вообще, Hamachi (изначально), не была предназначена именно для сетевых игр. Ее главная задача: объединить пользователей в одну локальную сеть, даже если они из разных уголков планеты. Как вы понимаете, часто это требуется для выполнения различных офисных работ (например).

Но в плане игр, программа великолепная — практически тот же LanGame, только более продвинутый. После скачивания, установки и регистрации (в бесплатной версии есть ограничение на количество подключаемых пользователей к вашей сети) , вы получаете свой IP-адрес.

Передав его своим друзьям, вы можете создавать игры, подключаться к ним, создавать свои комнаты, чаты и т.д. Программа очень многофункциональная!

Вариант №5: Radmin

Radmin — главное окно программы

Radmin — главное окно программы

Radmin — крайне полезная штука для игр по сети (аналог Hamachi, только более продвинутый). Главные ее преимущества:

  • программа никак не ограничивает кол-во подключаемых пользователей!
  • позволяет подключаться даже в тех случаях, когда вы не можете настроить брандмауэр (пробросить порты).

Ну а благодаря достаточно высокой скорости Radmin VPN — играть в большинство игр можно будет с тем же комфортом, как если бы вы это делали по локальной сети!

Что касается процесса : то здесь всё просто. Один из игроков создает сеть в Radmin, другой к ней подключается. Далее игра будет считать, что те пользователи, что есть в сети Radmin — находятся в одной локалке! Ну а после, см. пункт 1.

Вариант №6: Garena Lan games ( Garena Plus )

Garena - главное окно программы

Garena — главное окно программы

Garena – бесплатное ПО для компьютерных игр. Позволяет на основе технологии VPN, играть в такие популярные игры, как League of Legends, FIFA Online 3, Point Blank (и др.).

Программа очень популярна в азиатских странах и некоторых регионах СНГ. Насчитывается около 90 млн. пользователей по всему Миру!

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

Кстати, Garena — является партнером многих известных разработчиков игр (например, Electronic Arts, Riot Games, Grinding Gear Games, S2 Games).

PS

Хотел в статью еще включить Tunngle, но судя по последним новостям, из-за нового европейского правила защиты общих данных, сервис закрывается (не хватает средств для выполнения всех требований, предписанных законом).

С одной стороны, жалко, т.к. все-таки за последние 11 лет пользовались Tungle около 10 млн. пользователей по всему Миру!

За дополнения по теме — заранее отдельно благодарю!

Первая публикация: 03.05.2018

Как играть в Minecraft по сети с друзьями

Как играть в Minecraft по сети с друзьями

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

Предлагаю ознакомиться с разными способами создать сервер Minecraft для игры с друзьями по сети.

Вариант 1: Открытие одиночного мира для игры по LAN

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

Редактирование локального сервера для игры по сети в Minecraft

  1. Зайдите в игру и создайте новый мир для одиночной игры с оптимальными настройками.
  2. Нажмите Esc для появления меню, в котором надо выбрать «Открыть для сети» .
  3. Появится уведомление с присвоенным для сервера портом, который необходимо запомнить.
  4. Теперь выйдите на рабочий стол, запустите командную строку и введите в ней ipconfig для определения своего IPv4-адреса.
  5. Остальные игроки должны использовать прямое подключение, введя ваш IP-адрес и присвоенный порт. Например: 192.168.0.1:25565 .

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

Комьюнити теперь в Телеграм
Подпишитесь и будьте в курсе последних IT-новостей

Вариант 2: Создание выделенного локального сервера Minecraft

Этот вариант тоже подойдет в том случае, когда вы с другом находитесь в пределах одной квартиры и подключены к локальной сети при помощи LAN-кабеля или Wi-Fi. Если вы еще не организовали подобное подключение, обязательно выполните его, а затем на всех компьютерах приступайте к общей настройке операционной системы, необходимой для присоединения к будущему серверу.

  1. Найдите кнопку с подключением к сети на панели задач, щелкните по ней правой кнопкой мыши и в появившемся контекстном меню выберите пункт «Открыть Параметры сети и Интернет» . Переход к настройке параметров адаптера для настройки локального сервера Minecraft
  2. Появится новое окно «Параметры»​ , где в блоке «Дополнительные сетевые параметры»​ нажмите по строке «Настройка параметров адаптера» . Открытие списка адаптеров для настройки локального сервера Minecraft
  3. Снова нажмите правой кнопкой мыши по тому адаптеру, который сейчас подключен к интернету, а затем выберите «​Свойства» . Переход в свойства адаптера для настройки локального сервера Minecraft
  4. Отобразится окно настройки свойств сетевого адаптера, в котором необходимо дважды кликнуть на IP версии 4 , предварительно убедившись в том, что возле этого параметра установлена галочка. Открытие окна настроек IP-адреса для создания локального сервера Minecraft
  5. Отметьте маркерами ручное получение IP-адреса и приступите к внесению изменений. Конфигурирование сетевого адаптера для дальнейшего создания локального сервера Minecraft

В качестве IP задайте 192.168.0.X , где вместо последней цифры вставьте любое число до 64. Маска подсети указывается как 255.255.255.255 . В завершение отправьте компьютер на перезагрузку. На других ПК сделайте то же самое, но последнюю цифру IP-адреса меняйте на неиспользованную ранее, чтобы при подключении не появились конфликтные ситуации.

Следующий этап – создание сервера для игры по локальной сети. В этом случае у пользователя появляется два разных варианта. Первый более оптимальный, поскольку позволяет создать полноценный сервер и далее модернизировать его модами или изменять настройки по желанию. Файлы пустого сервера Майнкрафт понадобится скачать с любого удобного сайта в интернете, задав соответствующий запрос поисковику. После этого войдите в директорию и откройте файл с настройками через любой текстовый редактор (файл server.properties).

Поиск и загрузка сервера для подключения по локальной сети в Minecraft

Далее отредактируйте несколько строк для обеспечения нормального соединения. В первую очередь найдите server-ip=X и после знака равно впишите IP того компьютера, который выступает в качестве основного (тот IP-адрес, что создавался в предыдущем шаге). В строке server-port=N вписывается порт, обычно это 25565 . Осталось запустить сервер через присутствующий в директории файл start.bat .

Мощные игровые серверы для Minecraft от 3 руб./час

От 4 Гб ОЗУ, от 80 Гб на скоростном NVMe и стабильные 200 Мбит/сек

Вариант 3: Организация сетевого подключения через Hamachi

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

Настройка Хамачи для игры по сети в Minecraft с друзьями

Теперь тот пользователь, который хочет создать сервер, в самой программе нажимает «Создать новую сеть» и задает имя/пароль. По этим данным сеть ищут друзья, нажав по кнопке «Подключиться к существующей сети»​ в Хамачи. После того как все пользователи подключатся, вы можете настроить свой сервер, введя полученный IP-адрес при прямом соединении или поменяв его в настройках сервера Minecraft так, как это было показано в инструкции по настройке выделенного локального подключения.

Вариант 4: Использование общедоступных серверов или Realms

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

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

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

Это были все возможные варианты организации совместной игры с друзьями в Minecraft по сети. Приятной игры вам и вашим друзьям!

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

Я, как и многие из вас, большой поклонник многопользовательских игр. В них меня прельщает в основном дух соревнования и возможность приобретать улучшения, накапливая достижения. Да и сама идея выхода в свет все большего количества игр данного типа побуждает к действию.
С недавнего времени я и сам взялся за разработку собственного проекта. И поскольку на Хабрахабре статей на эту тематику не нашел – решил поделиться своим опытом написания многопользовательской игры на движке 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

Согласно данным из Википедии RPC — класс технологий, позволяющих компьютерным программам вызывать функции или процедуры в другом адресном пространстве (как правило, на удалённых компьютерах).
Атрибут используется для назначения метода, вызываемого из сети. Для его функционирования необходимо добавить компонент NetworkView.

Метод OnSerializeNetworkView(BitStream stream, NetworkMessageInfo info)

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

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

void OnSerializeNetworkView(BitStream stream, NetworkMessageInfo info) < Vector3 syncPosition = Vector3.zero; // обязательно должен быть инициализирован перед приемом if (stream.isWriting) < syncPosition = rigidbody.position; // считываем текущую позицию stream.Serialize(ref syncPosition); // синхронизируем с сетью >else < stream.Serialize(ref syncPosition); // получаем позицию из сети rigidbody.position = syncPosition; // записываем позицию в наш объект. >> 

Данный пример не идеален, поскольку при его работе наши объекты будут «дергаться». Чтобы избежать этого, нужно воспользоваться интерполяцией. Подробнее – далее в статье.

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

Суть интерполяции заключается в том, что между чтением положения из сети мы плавно перемещаем наш объект через функцию Lerp во время обновления экрана.
Берем текущую позицию как начало и синхронизированную — как конец, и по мере обновления кадров перемещаем наш объект.

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

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

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

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

using UnityEngine; using System.Collections; [RequireComponent( typeof( NetworkView ) )] // сообщает Unity о том, что нам нужен компонент NetworkView. Данному компоненту NetworkStateSynchronization можно выставить Off. public class ServerSide : MonoBehaviour < private int playerCount = 0; // хранит количество подключенных игроков public int PlayersCount < get < return playerCount; >> // публичный доступ для внешних компонентов относительно количества игроков на сервере void OnServerInitialized() < SendMessage( "SpawnPlayer", "Player Server" ); // создаем локального игрока сервера >void OnPlayerConnected( NetworkPlayer player ) < ++playerCount; // при подключении каждого нового игрока увеличиваем количество подключенных игроков networkView.RPC( "SpawnPlayer", player, "Player " + playerCount.ToString() ); // вызываем у игрока процедуру создания экземпляра префаба >void OnPlayerDisconnected( NetworkPlayer player ) < --playerCount; // уменьшаем количество игроков Network.RemoveRPCs( player ); // очищаем список процедур игрока Network.DestroyPlayerObjects( player ); // уничтожаем все объекты игрока >> 

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

using UnityEngine; using System.Collections; [RequireComponent( typeof( NetworkView ) )] // сообщает Unity о том, что нам нужен компонент NetworkView. Данному компоненту NetworkStateSynchronization можно выставить Off. public class ClientSide : MonoBehaviour < public GameObject playerPrefab; // префаб игрока, который будет создан в процессе игры public Vector2 spawnArea = new Vector2( 8.0f, 8.0f ); // зона спауна private Vector3 RandomPosition < // случайная позиция в зоне спауна get < return transform.position + transform.right * ( Random.Range( 0.0f, spawnArea.x ) - spawnArea.x * 0.5f ) + transform.forward * ( Random.Range( 0.0f, spawnArea.y ) - spawnArea.y * 0.5f ); >> [RPC] // сообщает Unity о том, что данный метод можно вызвать из сети private void SpawnPlayer( string playerName ) < Vector3 position = RandomPosition; // делаем случайную позицию создания персонажа GameObject newPlayer = Network.Instantiate( playerPrefab, position, Quaternion.LookRotation( transform.position - position, Vector3.up ), 0 ) as GameObject; // создаем нового персонажа в сети newPlayer.BroadcastMessage( "SetPlayerName", playerName ); // задаем созданному персонажу имя (оно будет автоматически синхронизировано по сети) >void OnDisconnectedFromServer( NetworkDisconnection info ) < Network.DestroyPlayerObjects( Network.player ); // удаляемся из игры >> 

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

using UnityEngine; using System.Collections; public class MultiplayerMenu : MonoBehaviour < const int NETWORK_PORT = 4585; // сетевой порт const int MAX_CONNECTIONS = 20; // максимальное количество входящих подключений const bool USE_NAT = false; // использовать NAT? private string remoteServer = "127.0.0.1"; // адрес сервера (также можно localhost) void OnGUI() < if ( Network.peerType == NetworkPeerType.Disconnected ) < // если не подключен if ( GUILayout.Button( "Start Server" ) ) < // кнопка «запустить сервер» Network.InitializeSecurity(); // инициализируем защиту Network.InitializeServer( MAX_CONNECTIONS, NETWORK_PORT, USE_NAT ); // запускаем сервер >GUILayout.Space(30f); // отступ remoteServer = GUILayout.TextField( remoteServer ); // поле адреса сервера if ( GUILayout.Button( "Connect to server" ) ) < // кнопка «подключиться» Network.Connect( remoteServer, NETWORK_PORT ); // подключаемся к серверу >> else if ( Network.peerType == NetworkPeerType.Connecting ) < // во время подключения GUILayout.Label( "Trying to connect to server" ); // выводим текст >else < // в остальных случаях ( NetworkPeerType.Server, NetworkPeerType.Client) if ( GUILayout.Button( "Disconnect" ) ) < // кнопка «отключиться» Network.Disconnect(); // отключаем всех клиентов либо отключаемся от сервера >> > void OnFailedToConnect( NetworkConnectionError error ) < Debug.Log( "Failed to connect: " + error.ToString() ); // при ошибке подключения к серверу выводим саму ошибку >void OnDisconnectedFromServer( NetworkDisconnection info ) < if ( Network.isClient ) < Debug.Log( "Disconnected from server: " + info.ToString() ); // при успешном либо неуспешном отключении выводим результат >else < Debug.Log( "Connections closed" ); // сообщение выводится при выключении сервера Network.Disconnect() >> void OnConnectedToServer() < Debug.Log( "Connected to server" ); // сообщение выводится при успешном подключении к серверу >> 

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

using UnityEngine; using System.Collections; [RequireComponent( typeof( Rigidbody ) )] // в данном примере нам понадобится Rigidbody public class PlayerControls : MonoBehaviour < /* для интерполяции */ private float lastSynchronizationTime; // последнее время синхронизации private float syncDelay = 0f; // дельта между текущим временем и последней синхронизацией private float syncTime = 0f; // время синхронизации private Vector3 syncStartPosition = Vector3.zero; //начальная позиция интерполяции private Vector3 syncEndPosition = Vector3.zero; // конечная позиция интерполяции private Quaternion syncStartRotation = Quaternion.identity; // начальный поворот интерполяции private Quaternion syncEndRotation = Quaternion.identity; // конечный поворот интерполяции private NetworkView netView; // компонент NetworkView private string myName = ""; // наше имя (для примера, мы его не используем) public string MyName < get < return myName; >> // публичный доступ к имени public float power = 20f; void Awake () < netView = gameObject.AddComponent( typeof( NetworkView ) ) as NetworkView; // добавляем компонент NetworkView нашему игровому объекту netView.viewID = Network.AllocateViewID(); // присваиваем уникальный идентификатор в сети netView.observed = this; // указываем этот скрипт (компонент) для синхронизации netView.stateSynchronization = NetworkStateSynchronization.Unreliable; // нам подходит способ быстрой передачи с потерями, поскольку наше передвижение интерполируется lastSynchronizationTime = Time.time; // последнее время синхронизации >void FixedUpdate () < if ( netView.isMine ) < // если объект принадлежит нам, то мы им управляем, в противном случае делаем интерполяцию движения float inputX = Input.GetAxis( "Horizontal" ); float inputY = Input.GetAxis( "Vertical" ); if ( inputX != 0.0f ) < rigidbody.AddTorque( Vector3.forward * -inputX * power, ForceMode.Impulse ); >if ( inputY != 0.0f ) < rigidbody.AddTorque( Vector3.right * inputY * power, ForceMode.Impulse ); >> else < syncTime += Time.fixedDeltaTime; rigidbody.position = Vector3.Lerp( syncStartPosition, syncEndPosition, syncTime / syncDelay ); // интерполяция перемещения rigidbody.rotation = Quaternion.Lerp( syncStartRotation, syncEndRotation, syncTime / syncDelay ); // интерполяция поворота >> void OnSerializeNetworkView( BitStream stream, NetworkMessageInfo info ) < Vector3 syncPosition = Vector3.zero; // для синхронизации позиции Vector3 syncVelocity = Vector3.zero; // для синхронизации действующей силы Quaternion syncRotation = Quaternion.identity; // для синхронизации поворота if ( stream.isWriting ) < // если отправляем в сеть, то считываем данные объекта перед отправкой syncPosition = rigidbody.position; stream.Serialize( ref syncPosition ); syncPosition = rigidbody.velocity; stream.Serialize( ref syncVelocity ); syncRotation = rigidbody.rotation; stream.Serialize( ref syncRotation ); >else < // в противном случае считываем из сети stream.Serialize( ref syncPosition ); stream.Serialize( ref syncVelocity ); stream.Serialize( ref syncRotation ); syncTime = 0f; // сбрасываем время синхронизации syncDelay = Time.time - lastSynchronizationTime; // получаем дельту предыдущей синхронизации lastSynchronizationTime = Time.time; // записываем новое время последней синхронизации syncEndPosition = syncPosition + syncVelocity * syncDelay; // конечная точка, в которую движется объект syncStartPosition = rigidbody.position; // начальная точка равна текущей позиции syncEndRotation = syncRotation; // конечный поворот syncStartRotation = rigidbody.rotation; // начальный поворот >> void SetPlayerName( string name ) < myName = name; // задаем имя игрока >> 

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

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

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

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

Как сделать игру по сети

Изменить язык

Полная версия

© Valve Corporation. Все права защищены. Все торговые марки являются собственностью соответствующих владельцев в США и других странах. Политика конфиденциальности | Правовая информация | Соглашение подписчика Steam | #footer_refunds

Установить Steam

© 2023 Valve Corporation. Все права защищены. Все торговые марки являются собственностью соответствующих владельцев в США и других странах.

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

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