Мои Уведомления
Привет, !
Мой Аккаунт Мои Финансы Мои Подписки Мои Настройки Выход
Руководство API скрипты

Использование сетевого менеджера

Важно: UNet — это устаревшее решение, а также новая многопользовательская и сетьсистема Unity, которая обеспечивает многопользовательскую игру. игры через компьютерную сеть. Подробнее
См. в Словарь
Решение (Netcode для GameObjects) находится в разработке. Дополнительную информацию и дальнейшие действия см. на веб-сайте Unity Netcode for GameObjects.

Диспетчер сети — это компонент для управления сетевыми аспектами многопользовательской игры.

Функции Network Manager включают:

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

Начало работы с Network Manager

Диспетчер сети — это основной управляющий компонент многопользовательской игры. Для начала создайте пустой GameObjectосновной объект в сценах Unity, который может представлять персонажей, реквизит, декорации, камеры, путевые точки. , и более. Функциональность GameObject определяется прикрепленными к нему компонентами. Подробнее
См. Словарь
в исходной сцене и добавьте компонент NetworkManager. Недавно добавленный компонент Network Manager выглядит следующим образом:

Диспетчер сети в окне инспектора
Диспетчер сети в окне инспектора

Окно ИнспекторОкно Unity, в котором отображается информация о текущем выбранном игровом объекте, активе или настройках проекта, что позволяет вам проверять и отредактируйте значения. Дополнительная информация
См. в Словарь
, поскольку Network Manager в редакторе позволяет настраивать и контролировать много вещей, связанных с сетью.

Примечание. В каждой сцене должен быть только один активный сетевой менеджер. Не помещайте компонент Network Manager в сетевой GameObject (тот, у которого есть компонент Network Identity), потому что Unity отключает их при загрузке сцены.

Если вы уже знакомы с разработкой многопользовательских игр, вам может быть полезно узнать, что компонент Network Manager полностью реализован с использованием API высокого уровня (HLAPI), поэтому все, что он делает, также доступно для вас через сценарии. Для опытных пользователей, если вы обнаружите, что вам нужно расширить возможности компонента Network Manager, вы можете использовать сценарии для создания собственного класса из NetworkManager и настроить его поведение, переопределив любые из виртуальных функций, которые он предоставляет. Однако компонент Network Manager объединяет множество полезных функций в одном месте и максимально упрощает создание, запуск и отладку многопользовательских игр.

Управление состоянием игры

Сетевая многопользовательская игра может работать в трех режимах: в качестве клиента, в качестве выделенного сервера или в качестве «хоста», который одновременно является и клиентом, и сервером.

Если вы используете HUD сетевого менеджера, он автоматически сообщает сетевому менеджеру, в каком режиме начинать, в зависимости от того, какие параметры выбирает. Если вы пишете свой собственный UI(пользовательский интерфейс) Позволяет пользователю взаимодействовать с вашим приложением. Подробнее
См. в Словарь
, который позволяет игроку начать игру, вам понадобится для вызова их из вашего собственного кода. Вот эти методы:

Настройки сетевого адреса и порта в компоненте Network Manager
Настройки сетевого адреса и порта в компоненте Network Manager

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

Во время разработки игры может быть полезно указать в этих свойствах фиксированный адрес и порт. Однако в конечном итоге вы можете захотеть, чтобы ваши игроки могли выбирать хост, к которому они хотят подключиться. Когда вы дойдете до этого этапа, компонент Обнаружение сети (см. Локальное обнаружение) можно использовать для широковещательной рассылки и поиска адресов. и порты в локальной сети (LAN), а служба Matchmaker может использоваться игроками для поиска матчей в Интернете для подключения (см. Служба многопользовательской игры).

Управление появлением

Используйте Network Manager для управления созданием (сетевым созданием) сетевых игровых объектов из префабовтипа актива, который позволяет вам хранить GameObject вместе с компонентами и свойствами. Префаб действует как шаблон, из которого вы можете создавать новые экземпляры объектов на сцене. Подробнее
См. в Словарь
.

Раздел Spawn Info компонента Network Manager
Раздел Spawn Info компонента Network Manager

В большинстве игр есть префаб, представляющий игрока, поэтому в Network Manager есть слот Префаб игрока. Вы должны назначить этот слот с помощью Prefab вашего плеера. Когда у вас установлен префаб игрока, GameObject игрока автоматически создается из этого префаба для каждого пользователя в игре. Это относится к локальному игроку на размещенном сервере и удаленным игрокам на удаленных клиентах. Вы должны прикрепить компонент Network Identity к префабу Player.

После того, как вы назначили префаб игрока, вы можете запустить игру в качестве хоста и увидеть появление игрового объекта игрока. Остановка игры уничтожает GameObject игрока. Если вы создадите и запустите еще одну копию игры и подключите ее в качестве клиента к localhost, Network Manager заставит появиться другой GameObject игрока. Когда вы останавливаете этот клиент, он уничтожает GameObject этого игрока.

Помимо префаба игрока, вы также должны зарегистрировать другие префабы, которые вы хотите динамически создавать во время игры с помощью Network Manager.

Вы можете добавить префабы в список, показанный в инспекторе с пометкой Зарегистрированные порождаемые префабы. Вы также можете зарегистрировать префабы с помощью кода с помощью метода ClientScene.RegisterPrefab().

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

Настройка экземпляра проигрывателя

Диспетчер сети порождает игровые объекты игрока, используя свою реализацию NetworkManager.OnServerAddPlayer(). Если вы хотите настроить способ создания игровых объектов игрока, вы можете переопределить эту виртуальную функцию. Этот код показывает пример реализации по умолчанию:

public virtual void OnServerAddPlayer(NetworkConnection conn, short playerControllerId) { var player = (GameObject)GameObject.Instantiate(playerPrefab, playerSpawnPos, Quaternion.identity); NetworkServer.AddPlayerForConnection(conn, player, playerControllerId); }

Примечание. Если вы реализуете пользовательскую версию OnServerAddPlayer, метод NetworkServer.AddPlayerForConnection() должен быть вызван для вновь созданного игрового объекта игрока, чтобы он был порожден и связан с клиентским соединением. AddPlayerForConnection порождает GameObject, поэтому вам не нужно использовать NetworkServer.Spawn().

Начальные позиции

Для управления местом появления игроков можно использовать компонент Начальная позиция в сети. Чтобы использовать их, присоедините компонент Network Start Position к игровому объекту в сцене и поместите игровой объект там, где вы хотите, чтобы один из игроков начал. Вы можете добавить столько начальных позиций в свою сцену, сколько захотите. Диспетчер сети определяет все начальные позиции в вашей сцене и при создании каждого экземпляра игрока использует позицию и ориентацию одного из них.

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

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

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

Если режимы случайного или циклического выбора не подходят для вашей игры, вы можете настроить способ выбора стартовых позиций с помощью кода. Вы можете получить доступ к доступным компонентам Network Start Position по списку NetworkManager.startPositions, а также использовать вспомогательный метод GetStartPosition() в Network Manager, который можно использовать в реализации OnServerAddPlayer для поиска начальной позиции.

Управление сценой

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

В Инспекторе NetworkManager есть два слота для сцен: автономная сцена и онлайн-сцена. Перетаскивание ресурсов сцены в эти слоты активирует сетевое управление сценой.

При запуске сервера или узла загружается онлайн-сцена. Затем он становится текущей сетевой сценой. Любым клиентам, которые подключаются к этому серверу, также предлагается загрузить эту сцену. Имя этой сцены хранится в свойстве networkSceneName.

При остановке сети, остановке сервера или хоста или отключении клиента автономная сцена загружается. Это позволяет игре автоматически возвращаться в меню «Сцена» при отключении от многопользовательской игры.

Вы также можете менять сцены во время игры, вызывая NetworkManager.ServerChangeScene(). При этом все подключенные в данный момент клиенты также изменяют сцену и обновляют networkSceneName, чтобы новые клиенты также загружали новую сцену.

Пока активно сетевое управление сценой, любые вызовы функций управления состоянием игры, таких как NetworkManager.StartHost() или NetworkManager.StopClient() может привести к изменению сцены. Это относится к пользовательскому интерфейсу управления временем выполнения. Настроив сцены и вызвав эти методы, вы можете управлять ходом многопользовательской игры.

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

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

Настройка

В классе NetworkManager есть виртуальные функции, которые можно настроить, создав собственный производный класс, наследуемый от NetworkManager. При реализации этих функций обязательно позаботьтесь о функциональности, предоставляемой реализациями по умолчанию. Например, в OnServerAddPlayer() должна быть вызвана функция NetworkServer.AddPlayer, чтобы активировать GameObject игрока для подключения.< /p>

Это все обратные вызовы, которые могут выполняться для хоста/сервера и клиентов. В некоторых случаях важно вызвать функцию базового класса, чтобы сохранить поведение по умолчанию. Чтобы увидеть саму реализацию, вы можете просмотреть ее в сетевом репозитории bitbucket.

using UnityEngine; using UnityEngine.Networking; using UnityEngine.Networking.Match; public class CustomManager : NetworkManager { // Server callbacks public override void OnServerConnect(NetworkConnection conn) { Debug.Log("A client connected to the server: " + conn); } public override void OnServerDisconnect(NetworkConnection conn) { NetworkServer.DestroyPlayersForConnection(conn); if (conn.lastError != NetworkError.Ok) { if (LogFilter.logError) { Debug.LogError("ServerDisconnected due to error: " + conn.lastError); } } Debug.Log("A client disconnected from the server: " + conn); } public override void OnServerReady(NetworkConnection conn) { NetworkServer.SetClientReady(conn); Debug.Log("Client is set to the ready state (ready to receive state updates): " + conn); } public override void OnServerAddPlayer(NetworkConnection conn, short playerControllerId) { var player = (GameObject)GameObject.Instantiate(playerPrefab, Vector3.zero, Quaternion.identity); NetworkServer.AddPlayerForConnection(conn, player, playerControllerId); Debug.Log("Client has requested to get his player added to the game"); } public override void OnServerRemovePlayer(NetworkConnection conn, PlayerController player) { if (player.gameObject != null) NetworkServer.Destroy(player.gameObject); } public override void OnServerError(NetworkConnection conn, int errorCode) { Debug.Log("Server network error occurred: " + (NetworkError)errorCode); } public override void OnStartHost() { Debug.Log("Host has started"); } public override void OnStartServer() { Debug.Log("Server has started"); } public override void OnStopServer() { Debug.Log("Server has stopped"); } public override void OnStopHost() { Debug.Log("Host has stopped"); } // Client callbacks public override void OnClientConnect(NetworkConnection conn) { base.OnClientConnect(conn); Debug.Log("Connected successfully to server, now to set up other stuff for the client..."); } public override void OnClientDisconnect(NetworkConnection conn) { StopClient(); if (conn.lastError != NetworkError.Ok) { if (LogFilter.logError) { Debug.LogError("ClientDisconnected due to error: " + conn.lastError); } } Debug.Log("Client disconnected from server: " + conn); } public override void OnClientError(NetworkConnection conn, int errorCode) { Debug.Log("Client network error occurred: " + (NetworkError)errorCode); } public override void OnClientNotReady(NetworkConnection conn) { Debug.Log("Server has set client to be not-ready (stop getting state updates)"); } public override void OnStartClient(NetworkClient client) { Debug.Log("Client has started"); } public override void OnStopClient() { Debug.Log("Client has stopped"); } public override void OnClientSceneChanged(NetworkConnection conn) { base.OnClientSceneChanged(conn); Debug.Log("Server triggered scene change and we've done the same, do any extra work here for the client..."); } }

Инспектор для NetworkManager предоставляет возможность изменять некоторые параметры соединения и время ожидания. Некоторые параметры здесь не представлены, но их можно изменить с помощью кода.

using UnityEngine; using UnityEngine.Networking; public class CustomManager : NetworkManager { // Set custom connection parameters early, so they are not too late to be enforced void Start() { customConfig = true; connectionConfig.MaxCombinedReliableMessageCount = 40; connectionConfig.MaxCombinedReliableMessageSize = 800; connectionConfig.MaxSentMessageQueueSize = 2048; connectionConfig.IsAcksLong = true; globalConfig.ThreadAwakeTimeout = 1; } }
Вы можете отблагодарить автора, за перевод документации на русский язык. ₽ Спасибо
Руководство Unity 2021.3