FAQ

Как отправлять/Синхронизировать данные пользовательских типо?

Mirror может автоматически создавать функцию Сериализации при компилировании вашего кода.

Например, Mirror автоматически создает функцию для MyCustomStruct так что её можно отправить без какой-либо дополнительной работы.

[ClientRpc]
public void RpcDoSomething(MyCustomStruct data)
{
    // делайте что-нибудь здесь
}

struct MyCustomStruct
{
    int someNumber;
    Vector3 somePosition;
}

Для получения более подробной информации

Как мне подключиться к другому экземпляру игры Mirror?

К другому экземпляру игры на одном устройстве

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

Убедитесь что поле Network Address внутри NetworkManager поставлено на "localhost", или если вы используете NetworkManagerHUD в тексте написано "localhost". Убедитесь, что вы не включаете кавычки.

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

К другому экземпляру игру в локальной сети (LAN)

Убедитесь что поле Network Address внутри NetworkManager заполнено LAN IP адрес вашего хост устройства, или если вы используете NetworkManagerHUD смотрите чтобы в тексте был вписан LAN IP адрес вашего хост устройства.

Правильной настройкой является, к примеру, "192.168.8.100", "10.0.0.100", "172.16.42.69" А НЕправильной настройкой будет, к примеру, "localhost" или "203.200.110.100"

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

Чтобы проверить ваш LAN IP адрес на Windows, вы можете открыть PowerShell/Command Prompt и использовать команду ipconfig, затем под вашим текущим адаптером (ethernet/wifi/etc) посмотрите строку IPv4 Address на наличие:

IPv4 Address. . . . . . . . . . . : 192.168.x.x

На Mac OS, вы можете использовать Network Settings в приложении Settings, в то время как на Linux вы можете использовать ifconfig, ip addr или что то с GUI по типу NetworkManager или wicd чтобы посмотреть ваш LAN IP адрес, конечно, в зависимости от того, используете ли вы среду рабочего стола или выполняете команду в командной строке.

К другому экземпляру игры (Internet/WAN)

Установите в поле NetworkAddress значение IP-адреса хоста (гуглите 'какой у меня IP')

Этот раздел не охватывает Ретрансляторы, Выделенные сервера или какие либо ещё фичи.

Чтобы это сработало, вам нужно будет выполнить некоторые из следующих действий, большинство из которых зависят от вашей настройки и маршрутизатора:

  • Переадресация портов:

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

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

    • Либо перенаправьте свой игровой порт (по умолчанию 7777) на локальный IP вашего ПК, 192.168.1.20 к примеру. Убедитесь, что вы указали правильный протокол, входящие UDP-соединения не будут работать, если у вас он настроен только на прием входящих TCP-соединений и наоборот. Если ваш маршрутизатор поддерживает это, вы можете использовать параметр "BOTH", чтобы обойти эту головную боль; ИЛИ

    • Воспользуйтесь быстрым (но менее безопасным) трюком: добавьте этот локальный IP-адрес в DMZ маршрутизаторов в качестве отчаянной меры.

DMZ может быть очень полезным инструментом, но будьте внимательны: с большой силой приходит большая ответственность! Компьютер с указанным вами IP-адресом будет доступен в Интернете без использования брандмауэра маршрутизатора, фильтрующего нежелательный входящий трафик. Это означает, что если вы используете какой-либо частный веб-сервер или приложение, вы можете столкнуться с вторжениями со стороны других пользователей, расположенных в другом месте Интернета. НЕ ИСПОЛЬЗУЙТЕ эту DMZ опцию если вы используете необновленную операционную систему (к примеру, старую версию Microsoft Windows) или вы рискуете подвергнуть риску безопасность вашего компьютера. Убедитесь, что ваша система безопасности включена и ваше антивирусное программное обеспечение полностью обновлено, прежде чем играть с настройками DMZ.

  • ПК брандмауэр:

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

    • Вручную разрешите редактор и любые сборки, которые вы создаете, в настройках брандмауэра.

  • Попробуйте использовать сборку, а не редактор Unity, так как иногда редактор Unity может быть неудобным.

  • Некоторые антивирусы/мобильные устройства могут иметь дополнительные уровни блокировки:

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

  • В редких случаях интернет-провайдеры или компании / школы блокируют порты и подключения, это сложнее настроить самостоятельно.

Если вам нужна дополнительная помощь, лучше всего поискать в Google руководство по настройке вашего маршрутизатора. Надежной альтернативой вышеописанному является использование выделенного сервера / VPS или ретранслятора.

Миграция хоста

Альтернативы миграции хостов и обходные пути.

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

  • Выделенные хостинги редко должны закрываться, если вы занимаетесь играми, которые должны оставаться открытыми, такими как MMO.

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

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

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

  • Отправьте эти данные игроков (IP и порт) во все игры подключенных игроков.

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

  • После отключения от сервера вызовите функцию для подключения к резервному хостеру. К примеру, StartClient( BackupIP - BackupPort )

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

  • Закройте все это пользовательским интерфейсом, сказав, пожалуйста, подождите (необязательно, это должно произойти в мгновение ока).

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

  • (легче) Игра, в которой требуются только данные о положении игрока, такая как "Fall Guys".

  • (трудно) Forge of Empires - игра, в которой размещаются созданные объекты, солдаты, транспортные средства, различные другие ремесла и апгрейды, все со своими собственными уровнями / статистикой.

Master / Список серверов и Simple Matchmaker

База данных зарегистрированных хостингов по всему миру.

Все хосты, выделенные или игровые, добавляются в базу данных списков, игроки получают список и могут выбирать, к кому присоединиться. Использование списка серверов означает, что игрокам не нужно вручную вводить IP-адреса и порты, все это делается за кулисами и работает для типов подключений localhost, LAN и WAN. Вы можете показывать игрокам столько данных, сколько вам нужно, например, имя хоста, тип (смертельный матч), количество игроков (45/50), пинг, сложность противника, карта, регион и т.д.

  • Node ListServer: Бесплатно, но вы сами размещаете файлы на разблокированном ПК, например на VPS. Обладает широким спектром настраиваемых функций, лучший вариант, если вы хотите самостоятельно размещать выделенные игры.

  • Light Reflective Mirror: Это список серверов и ретранслятор, он бесплатный, но вы размещаете файлы и управляете ими самостоятельно. Ретрансляторы предлагают разблокированный маршрут трафика, но за счет дополнительной задержки/повышенного пинга. Этот ретранслятор сначала проверит наличие прямого соединения, а затем вернется к маршрутизируемому трафику, если это не удастся. Как список серверов, так и ретранслируемый трафик необязательны, вы можете использовать одну часть, а не другую. Это лучший вариант для игр, размещаемых игроками, где часто встречаются блокировки портов маршрутизатора.

  • Epic и Steam, они захостят для вас. Проверьте разделы "Дополнения Discord" и "Транспорты" для получения дополнительной информации, а также для других не перечисленных в списке способов подбора партнеров и составления списка серверов.

Simple Matchmaker

  • Вы можете создать матчмейкер из этого списка серверов, просто скройте список для игроков, попросите их автоматически присоединиться к игре с помощью одной кнопки. Вы также можете отфильтровать различные требования, установленные игроком, например, только регион "США" или карту "Лавовый остров"..

Как узнать количество игроков?

Есть несколько способов сделать это, каждый со своими уникальными преимуществами.

NetworkServer.connections.Count

  • Подключения к сокетам, включая пользователей без заспавненных Prefab'ов, не прошедших проверку подлинности или которые, возможно, отключились во время запуска, но подключились временно (пользователи Android сворачивают игру). Только хост / сервер может проверить это.

NetworkManager.singleton.numPlayers

  • Количество активных созданных объектов игрока на сервере (это может проверить только хост / сервер)

Find by GameObject Tag

  • Работает на стороне клиента, не требует сетевого кода и является хорошим способом различать состояния игроков, применяя теги gameobject для определенных ситуаций, например, "не готов / по умолчанию", "Мертв", "Наблюдатель".

public GameObject[] playersArray;

public void FindPlayersByTag()
{
  playersArray = GameObject.FindGameObjectsWithTag("Player");
   Debug.Log("Players found: " + playersArray.Length);
}

Last updated