Network Discovery

Предположим, вы находитесь рядом с другом. Он начинает игру в режиме ведущего, и вы хотите присоединиться к нему. Как ваш телефон определит его местонахождение? Узнать его IP-адрес не совсем интуитивно и не то, что могут сделать дети.

Чтобы решить эту проблему, вы можете использовать Network Discovery. Когда ваша игра запускается, она отправляет сообщение в вашу текущую сеть с вопросом "Доступен ли какой-нибудь сервер?". Любой сервер в пределах той же сети ответит и предоставит информацию о том, как подключиться к нему.

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

Компоненты NetworkDiscovery и NetworkDiscoveryHUD идут в комплекте, или вы можете создать свои собственные скрипты по шаблонам скриптов.

Network Discovery использует широковещательную передачу UDP по локальной сети, позволяющую клиентам находить работающий сервер и подключаться к нему.

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

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

Событие, обнаруженное сервером, должно быть назначено методу обработчика, тоесть таким как OnDiscoveredServer метод у NetworkDiscoveryHUD.

В NetworkDiscoveryHUD, компонент NetworkDiscovery должен быть назначен автоматически.

Быстрый старт

Для использования Network Discovery следуйте этим шагам:

  1. Создайте gameobject с NetworkManager если вы еще этого не сделали

  2. Не добавляйте NetworkManagerHUD. Discovery имеет другой компонент пользовательского интерфейса.

  3. Добавьте компонент NetworkDiscoveryHUD к объекту NetworkManager. Компонент NetworkDiscovery будет автоматически добавлен и назначен в ваш HUD.

  4. Добавьте игрока в поле NetworkManager'а если вы ещё не сделали этого.

  5. Создайте и запустите билд

  6. Кликните на Start Host

  7. Запустите play mode в редакторе и нажмите на Find Servers

  8. Редактор должен найти другой билд и отобразить кнопку

  9. Кликните на новую кнопку чтобы подключиться к хосту.

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

Custom Network Discovery

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

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

  • Клиент может показать, находится ли сервер в PvP или PvE режиме

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

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

  • Клиент может показать язык, который используется на сервере

  • Клиент может показать, защищен ли сервер паролем

Для этого мы предоставили шаблон, который находится в Asset menu, кликните Create > Mirror > Network Discovery.

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

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

public class DiscoveryRequest : NetworkMessage
{
    public string language="en";

    // Добавляйте свойства для любой информации, которую вы хотите отправлять клиентам
    // в своих сообщениях, которые будут потребляться серверами.
}

public class DiscoveryResponse : NetworkMessage
{
    enum GameMode {PvP, PvE};

    // вероятно, вам нужен uri, чтобы клиенты знали, как подключиться к серверу
    public Uri uri;

    public GameMode GameMode;
    public int TotalPlayers;
    public int HostPlayerName;

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

Кастомный класс NetworkDiscovery содержит переопределения для обработки приведенных выше сообщений.

Возможно, вы захотите обратиться к скрипту NetworkDiscovery.cs в папке Components/Discovery, чтобы увидеть, как они должны быть реализованы.

public class NewNetworkDiscovery: NetworkDiscoveryBase 
{
    #region Server

    protected override void ProcessClientRequest(DiscoveryRequest request, IPEndPoint endpoint)
    {
        base.ProcessClientRequest(request, endpoint);
    }

    protected override DiscoveryResponse ProcessRequest(DiscoveryRequest request, IPEndPoint endpoint) 
    {
        // TODO: Создайте свой ответ и верните его 
        return new DiscoveryResponse();
    }

    #endregion

    #region Client

    protected override DiscoveryRequest GetRequest()
    {
        return new DiscoveryRequest();
    }

    protected override void ProcessResponse(DiscoveryResponse response, IPEndPoint endpoint)
    {
        // TODO: сервер ответил, сделайте что-нибудь с ответом, например, вызовите unityevent
    }

    #endregion
}

Примечание: Примите во внимание любую блокировку антивирусом / брандмауэром, а также дополнительные настройки для вашей конкретной платформы (широковещательный адрес iOS, настройки общего доступа к обнаружению сети в Windows и т.д.).

Last updated