(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.)
Исходный код для всех индивидуальных сетевых серверов может быть загружен с Unity website. Эта сборка включает в себя connection tester (тестировщик соединений), facilitator (посредник), master server (управляющий сервер) и proxy server (прокси сервер).
Все сборки исходников содержат сетевую библиотеку RakNet 3.732, которая управляет базовыми сетевыми функциями и поддерживает плагины, которые используют сетевые серверы.
Пакеты содержат три разных типа файлов проекта, готовых для компиляции:
Проекты Xcode и Visual Studio могут быть просто открыты, скомпилированы и собраны. Чтобы собрать проект Makefile просто запустите “make”. Он должен работать со стандартными настройками компиляции на Linux и Mac OS X, если у вас gcc, то должно заработать. Для Linux возможно потребуется установить библиотеку ncurses.
В Master Server используется внутренняя структура база данных (database), чтобы отслеживать информацию о хостах.
Хосты отправляют сообщения с идентификатором сообщений RUM_UPDATE_OR_ADD_ROW, содержащие всю информацию о хосте. Это обрабатывается в функции OnReceive() в файле LightweightDatabaseServer.cpp . Это то место, куда первоначально приходят все сообщения, и поэтому хорошая точка отсчёта, если вы хотите отследить как обрабатываются сообщения. Создаётся таблица со структурой базы данных database для каждого типа игры game type, которые устанавливаются когда вы исполняете функцию MasterServer.RegisterHost. Все типы игр сгруппированы вместе в таблице, если таблицы не существует, она создаётся динамически в функции CreateDefaultTable().
Данные с информацией о хосте модифицируются Master Server. IP адрес и порт регистрируемой игры, в таком виде, как их видит Master Server, добавляются в данные о хосте. Таким образом, мы можем с уверенностью определить правильный внешний IP и порт в случаях, когда хост имеет приватный адрес (NAT адрес). IP и порт внутри данных о хосте передаются игровым сервером как приватные адрес и порт и это сохраняется для дальнейшего использования. Если Master Server замечает, что клиент запрашивает данные о хосте для игрового сервера и этот сервер имеет тот же IP адрес, то он будет использовать приватный адрес сервера вместо внешнего. Это происходит в случае, когда клиент и сервер подключены к одной и той же локальной сети, используют один и тот же маршрутизатор с NAT адресацией. Поскольку у них будет одинаковый внешний адрес и они не смогут подключиться друг к другу через него, им необходимо использовать приватные адреса и в этом случае это сработает.
Клиенты отправляют сообщения с идентификатором сообщения ID_DATABASE_QUERY_REQUEST и какой тип игры game type они ищут. Из структуры базы данных выбирается таблица или список хостов и отправляются клиенту. Если ничего не найдено, отправляется пустлй список хостов.
Все сообщения, отправляемые к Master Server должны содержать информацию о версии, которая проверяется в функции CheckVersion(). В настоящее время каждая версия Юнити будет задавать новую внутреннюю версию Master Server и это будет здесь проверяться. Так что если последовательность действий коммуникации Master Server в какой-то момент поменяется, будет возможным обнаружить более старые версии и по возможности перенаправить на другую версию Master Server (если это вообще нужно) или изменить обработку этого сообщения для учёта различий.
Facilitator (посредник) использует плагин NAT punchthrough из RakNet напрямую, без изменений. По сути, это всего лишь наблюдение за пиром (peer) на порте с загруженным плагином NAT punchthrough. Когда сервер и клиент с NAT адресами оба подключаются к этому пиру, они смогут выполнить NAT punchthrough для подключения друг к другу. Если Network.InitializeServer использует NAT, соединение для вас настроится автоматически.