Важно: UNet — это устаревшее решение, а также новая многопользовательская и сетьсистема Unity, которая обеспечивает многопользовательскую игру. игры через компьютерную сеть. Подробнее См. в Словарь Решение (Netcode для GameObjects) находится в разработке. Дополнительную информацию и дальнейшие действия см. на веб-сайте Unity Netcode for GameObjects. |
И серверы, и клиенты могут управлять GameObjectфундаментальным объектом в сценах Unity, который может представлять персонажей, реквизит, декорации, камеры, путевые точки и многое другое. Функциональность GameObject определяется прикрепленными к нему компонентами. Подробнее
См. в поведении Словарь. Понятие «полномочия» относится к тому, как и где осуществляется управление игровым объектом.
Авторизация сервера
Состояние полномочий по умолчанию в сетевых играх Unity, использующих HLAPI, заключается в том, что Сервер имеет полномочия над всеми игровыми объектами, которые не представляют игроков. Это означает, например, что сервер будет управлять всеми собираемыми предметами, движущимися платформами, неигровыми персонажами и любыми другими частями вашей игры, с которыми могут взаимодействовать игроки, а игровые объекты игроков имеют полномочия на клиента своего владельца (это означает, что клиент управляет их поведением).
Местные власти
Локальные полномочия (иногда называемые полномочиями клиента) означают, что локальный клиент имеет полномочный контроль над определенным сетевым игровым объектом. Это отличается от состояния по умолчанию, когда сервер имеет авторитетный контроль над сетевыми игровыми объектами.
Помимо isLocalPlayer**
**, вы можете выбрать, чтобы игровые объекты игрока имели «местные права доступа». Это означает, что игровой объект GameObject на клиенте своего владельца несет ответственность за себя (или имеет над ним полномочия). Это особенно полезно для управления движением; это означает, что каждый клиент имеет право управлять своим игровым объектом игрока.
Чтобы включить локальные права игрока на GameObject, установите флажок Локальные права игрока в компоненте Network Identity. Компонент Network Transform использует этот параметр "авторитета" и отправляет информацию о перемещении от клиента другим клиентам, если он установлен.
См. справочную документацию Scripting API по NetworkIdentity Сетевой компонент, который позволяет вам назначать идентификатор вашему игровому объекту, чтобы сеть распознавала его как игровой объект локального игрока или игровой объект только для сервера. Подробнее
См. в Словарь и localPlayerAuthority для получения информации о реализации локальных полномочий игрока с помощью скрипта.
Используйте свойство NetworkIdentity.hasAuthority, чтобы узнать, имеет ли GameObject локальные права доступа (также доступно на NetworkBehaviour
для удобства). Игровые объекты, не являющиеся игроками, имеют права доступа к серверу, а игровые объекты с установленным localPlayerAuthority имеют права доступа к клиенту своего владельца.
Локальные (клиентские) полномочия для игровых объектов, не являющихся игроками
Возможно иметь права клиента на неигровые GameObjects. Есть два способа сделать это. Один из них — создать GameObject с помощью NetworkServer.SpawnWithClientAuthority и передать сетевое соединение клиента, чтобы он стал владельцем. Другой способ — использовать NetworkIdentity.AssignClientAuthority с сетевым подключением клиента, чтобы стать владельцем.
При назначении полномочий клиенту Unity вызывает OnStartAuthority() для каждого NetworkBehaviour
в GameObject и задает для свойства hasAuthority
** значение true. На других клиентах свойство hasAuthority
** остается ложным. Неигровые игровые объекты с полномочиями клиента могут отправлять команды точно так же, как и игроки. Эти команды выполняются на серверном экземпляре GameObject, а не на игроке, связанном с подключением.
Если вы хотите, чтобы GameObjects, не являющиеся игроками, имели полномочия клиента, вы должны включить localPlayerAuthority в их компоненте Network Identity. В приведенном ниже примере создается GameObject и назначаются полномочия клиенту игрока, который его породил.
[Command]
void CmdSpawn()
{
var go = (GameObject)Instantiate(otherPrefab, transform.position + new Vector3(0,1,0), Quaternion.identity);
NetworkServer.SpawnWithClientAuthority(go, connectionToClient);
}
Свойства сетевого контекста
Класс NetworkBehaviour
содержит свойства, позволяющие использовать скриптыфрагмент кода Это позволяет вам создавать свои собственные Компоненты, запускать игровые события, изменять свойства Компонентов с течением времени и реагировать на ввод данных пользователем любым удобным для вас способом. Подробнее
См. Словарь, чтобы в любой момент узнать, каков контекст сетевого игрового объекта. .
isServer — true, если GameObject находится на сервере (или хосте) и был создан.
isClient — true, если GameObject находится на клиенте и был создан сервером.
isLocalPlayer — true, если GameObject является GameObject игрока для этого клиента.
hasAuthority — true, если GameObject принадлежит локальному процессу
Чтобы увидеть эти свойства, выберите GameObject, который хотите проверить, и в Инспектореокне Unity, в котором отображается информация о текущий выбранный игровой объект, актив или настройки проекта, что позволяет вам просматривать и редактировать значения. Дополнительная информация
Посмотреть в окне Словарь, просмотреть окно предварительного просмотра NetworkBehaviour. Вы можете использовать значения этих свойств для выполнения кода в зависимости от контекста, в котором выполняется скрипт.