Важно: UNet — это устаревшее решение, а также новая многопользовательская и сетьсистема Unity, которая обеспечивает многопользовательскую игру. игры через компьютерную сеть. Подробнее См. в Словарь Решение (Netcode для GameObjects) находится в разработке. Дополнительную информацию и дальнейшие действия см. на веб-сайте Unity Netcode for GameObjects. |
Диспетчер сетиКомпонент сети, который управляет сетевым состоянием проекта. Подробнее
См. в Словарь предлагает встроенную простую функцию появления игроков, однако вы можете хотите настроить процесс появления игроков — например, назначить цвет каждому новому созданному игроку.
Для этого вам необходимо переопределить поведение Network Manager по умолчанию с помощью собственного сценария.
Когда Network Manager добавляет игрока, он также создает GameObjectфундаментальный объект в сценах Unity, который может представлять персонажей. , реквизит, декорации, камеры, путевые точки и многое другое. Функциональность GameObject определяется прикрепленными к нему компонентами. Подробнее
См. Словарь в проигрывателе PrefabТип ресурса, который позволяет хранить GameObject с компонентами и свойствами. Префаб действует как шаблон, из которого вы можете создавать новые экземпляры объектов на сцене. Подробнее
См. в Словарь и связывает его с подключением. Для этого Network Manager вызывает NetworkServer.AddPlayerForConnection. Вы можете изменить это поведение, переопределив NetworkManager.OnServerAddPlayer. Реализация по умолчанию OnServerAddPlayer
создает новый экземпляр проигрывателя из префаба проигрывателя и вызывает NetworkServer.AddPlayerForConnection для создания нового экземпляра игрока. Ваша пользовательская реализация OnServerAddPlayer
также должна вызывать NetworkServer.AddPlayerForConnection
, но вы можете выполнять любую другую инициализацию, которая вам требуется в этом методе. слишком.
В приведенном ниже примере настраивается цвет проигрывателя. Во-первых, добавьте цветовой скрипт в префаб плеера:
using UnityEngine;
using UnityEngine.Networking;
class Player : NetworkBehaviour
{
[SyncVar]
public Color color;
}
Затем создайте NetworkManager для обработки нереста.
using UnityEngine;
using UnityEngine.Networking;
public class MyNetworkManager : NetworkManager
{
public override void OnServerAddPlayer(NetworkConnection conn, short playerControllerId)
{
GameObject player = (GameObject)Instantiate(playerPrefab, Vector3.zero, Quaternion.identity);
player.GetComponent().color = Color.red;
NetworkServer.AddPlayerForConnection(conn, player, playerControllerId);
}
}
Функция NetworkServer.AddPlayerForConnection
не обязательно должна вызываться из OnServerAddPlayer
. Если передан правильный объект подключения и playerControllerId
, его можно вызвать после возврата OnServerAddPlayer
. Это позволяет выполнять асинхронные действия между ними, например, загружать данные проигрывателя из удаленного источника данных.
Хотя в большинстве многопользовательских игр обычно требуется один игрок для каждого клиента, HLAPIаббревиатура API высокого уровня
See in Словарь рассматривает игроков и клиентов как отдельные понятия. Это связано с тем, что в В некоторых ситуациях (например, если у вас есть несколько контроллеров, подключенных к консольной системе), вам может понадобиться несколько игровых объектов GameObject для одного подключения. При наличии нескольких игроков в одном соединении следует использовать свойство playerControllerId
, чтобы различать их. Этот идентификатор привязан к соединению, поэтому он сопоставляется с идентификатором контроллера, связанного с проигрывателем на этом клиенте.
Система автоматически создает GameObject игрока, переданный NetworkServer.AddPlayerForConnection
на сервере, поэтому вам не нужно вызывать NetworkServer.Spawn для игрока. Когда игрок готов, активные сетевые игровые объекты (то есть игровые объекты со связанным NetworkIdentityсетевым компонентом который позволяет вам назначать идентификатор вашему игровому объекту, чтобы сеть распознавала его как игровой объект локального игрока или как игровой объект только для сервера. Подробнее
См. в Словарь) в СценаСцена содержит окружение и меню вашей игры. Думайте о каждом уникальном файле сцены как об уникальном уровне. В каждой сцене вы размещаете свое окружение, препятствия и декорации, по сути проектируя и создавая свою игру по частям. Подробнее
См. в Словарь появление на клиенте игрока. Все сетевые игровые объекты в игре создаются на этом клиенте с их последним состоянием, поэтому они синхронизированы с другими участниками игры.
Вам не нужно использовать playerPrefab в NetworkManager
для создания игровых объектов GameObject. Вы можете использовать разные методы создания разных проигрывателей.
Готово
Помимо игроков, клиентские подключения также имеют состояние "готово". Хост отправляет готовым клиентам информацию о порожденных игровых объектах и обновлениях синхронизации состояния; клиентам, которые не готовы, эти обновления не отправляются. Когда клиент первоначально подключается к серверу, он не готов. Находясь в этом неготовом состоянии, клиент может делать вещи, которые не требуют взаимодействия в реальном времени с игровым состоянием на сервере, например, загружать сцены, позволяя игроку выбрать avatarИнтерфейс для перенацеливания анимации с одного рига на другой. Подробнее
См. в Словарь или заполните поля для входа. После того, как клиент завершил всю свою предигровую работу и все его активы загружены, он может вызвать ClientScene.Ready, чтобы перейти в состояние готовности. Простой пример выше демонстрирует реализацию состояний готовности; потому что добавление проигрывателя с NetworkServer.AddPlayerForConnection
также переводит клиент в состояние готовности, если он еще не находится в этом состоянии.
Клиенты могут отправлять и получать сетевые сообщения, не будучи готовыми, что также означает, что они могут делать это без активного игрового объекта игрока. Таким образом, клиент в меню или на экране выбора может подключиться к игре и взаимодействовать с ней, даже если у него нет GameObject игрока. Дополнительные сведения об отправке сообщений без использования команд и вызовов RPC см. в документации по сетевым сообщениям.
Смена игроков
Чтобы заменить GameObject игрока для подключения, используйте NetworkServer.ReplacePlayerForConnection. Это полезно для ограничения команд, которые игроки могут отдавать в определенное время, например, на экране лобби перед игрой. Эта функция принимает те же аргументы, что и AddPlayerForConnection
, но допускает, что для этого соединения уже существует проигрыватель. Старый GameObject игрока не нужно уничтожать. Этот метод использует NetworkLobbyManager. для переключения с NetworkLobbyPlayer GameObject в игровой объект GameObject игрока, когда все игроки в лобби будут готовы.
Вы также можете использовать ReplacePlayerForConnection
для возрождения игрока после уничтожения его GameObject. В некоторых случаях лучше просто отключить GameObject и сбросить его игровые атрибуты при возрождении. В следующем примере кода показано, как на самом деле заменить уничтоженный GameObject новым GameObject:
class GameManager
{
public void PlayerWasKilled(Player player)
{
var conn = player.connectionToClient;
var newPlayer = Instantiate(playerPrefab);
Destroy(player.gameObject);
NetworkServer.ReplacePlayerForConnection(conn, newPlayer, 0);
}
}
Если игровой объект игрока для соединения уничтожен, этот клиент не может выполнять команды. Однако они по-прежнему могут отправлять сетевые сообщения.
Для использования ReplacePlayerForConnection
у вас должен быть NetworkConnection GameObject для клиента игрока, чтобы установить связь между GameObject и клиентом. Обычно это свойство connectionToClient в NetworkBehaviour class, но если старый проигрыватель уже уничтожен, он может быть недоступен.
Чтобы найти соединение, есть несколько доступных списков. При использовании NetworkLobbyManager
игроки лобби доступны в lobbySlots. NetworkServer также содержит списки соединений и localConnections.