Version: 2017.3
Загрузка уровня по сети
Построение своих собственных сетевых серверов Юнити.

Master Server

(For new projects, you should use the new networking system introduced in 5.1. This information is for legacy projects using the old networking system.)

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

Каждый отдельный экземпляр запущенной игры предоставляет параметр “тип игры” Game Type Master Server. Когда игрок подключается и запрашивает у Master Server соответствие типу игры Game Type, сервер отвечает, высылая список подходящих запущенных игр, с текущим количеством подключенных игроков в каждой из них и требуется ли пароль для подключения. Для передачи этих данных используются две функции: MasterServer.RegisterHost() для сервера, и MasterServer.RequestHostList() для клиента игрока.

Когда вызывается RegisterHost, от вас требуется указать три аргумента - gameTypeName (ранее упомянтуый Game Type), gameName и comment - чтобы хост зарегистрировали. RequestHostList использует в качестве аргумента the gameTypeName хостов, к которым вы хотели бы подключиться. Список всех зарегистрированных хостов этого типа будет передан запрашивающему клиенту. Это асинхронная операция и весь список будет получен через PollHostList(), после того как он будет полностью передан.

Функции NAT punchthrough обрабатываются на Master Server, в действительности, отдельным процессом, называемым Facilitator, но Master Server Юнити запускает обе службы параллельно.

Game Type - это идентифицирующее имя, которое должно быть уникальным для каждой игры (хотя Юнити не предлагает никакой централизованной системы регистрации имён и не может гарантировать это). Имеет смысл выбирать характерное имя, которое вряд ли выберет кто-нибудь другой. Если существует несколько различных версий вашей игры, возможно вам следует предупредить пользователя, если его клиент не сочетается с запущенной на сервере версией. Информация о версии может быть передана в поле комментария comment field (в действительности, это двоичные данные и могут быть представлены в любой желаемой форме). Имя игры game name это просто имя индивидуального экземпляра игры, выбирается тем, кто её установил.

The comment field can be used in more advanced ways if the Master Server is suitably modified (see the Advanced section at the bottom of the page for further information on how to do this). For example, you could reserve the first ten bytes of the comment field for a password and then extract the password in the Master Server when it receives the host update. It can then reject the host update if a password check fails.

Регистрация игры (Registering a game)

Перед регистрацией игры, важно включить или выключить функции NAT, в зависимости от того, поддерживается ли NAT хостом; вы можете это сделать при помощи параметра useNat из Network.InitializeServer.

Сервер можно запустить кодом, подобным этому:-

using UnityEngine;
using UnityEngine.Network;
using System.Collections;

public class ExampleScript : MonoBehaviour {
    void OnGUI() {
        if (GUILayout.Button ("Start Server"))
        {
            // Use NAT punchthrough if no public IP present
            Network.InitializeServer(32, 25002, !Network.HavePublicAddress());
            MasterServer.RegisterHost("MyUniqueGameType", "JohnDoes game", "l33t game for all");
        }
    }
}

C# script example

function OnGUI() {
    if (GUILayout.Button ("Start Server"))
    {
        // Use NAT punchthrough if no public IP present
        Network.InitializeServer(32, 25002, !Network.HavePublicAddress());
        MasterServer.RegisterHost("MyUniqueGameType", "JohnDoes game", "l33t game for all");
    }
}

JS script example

Здесь мы просто определяли необходимость в NAT punchthrough проверкой, имеет ли компьютер публичный адрес или нет. Существует более сложная функция Network.TestConnection, которая способна определить, может ли хост делать NAT или нет. Она также делает проверку соединения для публичных IP адресов, чтобы посмотреть не блокирует ли брандмауэр порт игры. Компьютеры, имеющие публичный IP адрес всегда проходят проверку NAT, но если проверка не удастся, хост не сможет подключаться к NAT клиентам. В этом случае, следует проинформировать пользователя, что необходимо разрешить port forwarding, чтобы игра заработала. Домашние подключения обычно имеют NAT адрес, но не могут устанавливать port forwarding (поскольку у них нет персонального публичного IP адреса). В этих случаях, если проверка NAT не получится, пользователю следует сообщить, что создание сервера будет не целесообразным, так как подключиться смогут только клиенты той же локальной сети.

If a host enables NAT functionality without needing it then it will still be accessible. However, clients which cannot do NAT punchthrough might incorrectly think they cannot connect on the basis that the server has NAT enabled.

Подключение к игре

В ходе регистрации или запросов высылается объект HostData object. Он содержит следующую информацию о хосте:-

булеан (boolean) useNat Показывает, использует ли хост NAT punchthrough.
Строка (String) gameType Тип игры (game type) хоста.
Строка (String) gameName Имя игры (game name) хоста.
целое число (int) connectedPlayers Количество подключенных в данный момент игроков/клиентов.
целое число (int) playerLimit Максимальное допустимое одновременное количество игроков/клиентов.
Массив строк String[] IP Внутренний IP адрес хоста. Для серверов с публичным адресом публичный и внутренний адреса одинаковы. Это поле определяется как массив, поскольку должны быть проверены все IP адреса, связанные со всеми активными интерфейсами компьютера при внутренних подключениях.
целое число (int) port Порт хостера.
булеан (boolean) passwordProtected Указывает, нужен ли пароль, чтобы иметь возможность подключиться к этому хосту.
Строка (String) comment Любой комментарий, который был назначен при регистрации хоста.
Строка (String) guid Сетевой GUID (Global Unique Identifier — уникальный 128-битный идентификатор) хоста. Необходим для подключения с использованием NAT punchthrough.

Эта информация может использоваться клиентами, чтобы увидеть возможности подключения хостов. Когда включен NAT, вам необходимо использовать GUID хоста для подключения. Всё это автоматически обрабатывается для вас, когда вы получаете HostData при подключении. Шаблон для подключения может выглядеть как-то так:

using UnityEngine;
using UnityEngine.Network;
using System.Collections;

public class ExampleScript : MonoBehaviour {
    void Awake() {
        MasterServer.RequestHostList("MadBubbleSmashGame");
    }
    
    void OnGUI() {
        HostData[] data = MasterServer.PollHostList();
        // Go through all the hosts in the host list
        foreach (var element in data)
        {
            GUILayout.BeginHorizontal();    
            var name = element.gameName + " " + element.connectedPlayers + " / " + element.playerLimit;
            GUILayout.Label(name);  
            GUILayout.Space(5);
            string hostInfo;
            hostInfo = "[";
            foreach (var host in element.ip)
                hostInfo = hostInfo + host + ":" + element.port + " ";
            hostInfo = hostInfo + "]";
            GUILayout.Label(hostInfo);  
            GUILayout.Space(5);
            GUILayout.Label(element.comment);
            GUILayout.Space(5);
            GUILayout.FlexibleSpace();
            if (GUILayout.Button("Connect"))
            {
                // Connect to HostData struct, internally the correct method is used (GUID when using NAT).
                Network.Connect(element);           
            }
            GUILayout.EndHorizontal();  
        }
    }
}

C# script example

function Awake() {
    MasterServer.RequestHostList("MadBubbleSmashGame");
}

function OnGUI() {
    var data : HostData[] = MasterServer.PollHostList();
    // Go through all the hosts in the host list
    for (var element in data)
    {
        GUILayout.BeginHorizontal();    
        var name = element.gameName + " " + element.connectedPlayers + " / " + element.playerLimit;
        GUILayout.Label(name);  
        GUILayout.Space(5);
        var hostInfo;
        hostInfo = "[";
        for (var host in element.ip)
            hostInfo = hostInfo + host + ":" + element.port + " ";
        hostInfo = hostInfo + "]";
        GUILayout.Label(hostInfo);  
        GUILayout.Space(5);
        GUILayout.Label(element.comment);
        GUILayout.Space(5);
        GUILayout.FlexibleSpace();
        if (GUILayout.Button("Connect"))
        {
            // Connect to HostData struct, internally the correct method is used (GUID when using NAT).
            Network.Connect(element);           
        }
        GUILayout.EndHorizontal();  
    }
}

JS script example

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

NAT punchthrough

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

По умолчанию, NAT punchthrough обеспечивается с помощью Master Server, однако не стоит это делать таким способом. На самом деле, для обеспечения NAT punchthrough используется Facilitator (Посредник). Если два компьютера подключены к Fascilator, то это будет выглядеть, как будто они оба могут подключиться друг к другу, пока Fascilitator использует внешний IP и порт. Master Server используется для предоставления информации об этом внешнем IP и порте, которые иначе было бы сложно определить. Вот почему Master Server и Fascilator так тесно связаны. По умолчанию, Master Server и Fascilator имеют одинаковые IP адреса, чтобы сменить любой из них используйте MasterServer.ipAddress, MasterServer.port, Network.natFacilitatorIP и Network.natFacilitatorPort

Продвинутое

У Unity Technologies также имеется действующий Master Server, доступный для целей тестирования и этот сервер будет использоваться по умолчанию. Однако, исходный код находится в свободном доступе, и сервер может использоваться в операционных системах Windows, Linux и Mac OS. В дополнение к простой сборке проекта из исходников, возможны случаи, когда вам требуется изменить способ, которым Master Server обращается с информацией и как он коммуницирует. Например, вы можете оптимизировать обработку данных о хостах или ограничить число клиентов, возвращаемых в список хоста. Подобные изменения потребуют модификаций исходного кода. Информация по этому поводу может быть найдена на Master Server Build page.

Загрузка уровня по сети
Построение своих собственных сетевых серверов Юнити.