Контроль

Network Authority

Authority - это способ принятия решения о том, кому принадлежит объект и кто имеет над ним контроль.

Server Authority

Authority сервера означает, что сервер имеет контроль над объектом. Сервер имеет контроль над объектами по умолчанию. Это означает, что сервер будет управлять предметами коллекционирования, движущимися платформами, NPC и любыми другими сетевыми объектами, которые не принадлежат игроку.

Client Authority

Authority клиента означает, что клиент имеет контроль над объектом.

Когда клиент имеет контроль над объектом, это означает, что он может вызывать Commands и что объект будет автоматически уничтожен при отключении клиента.

Даже если клиент имеет контроль над объектом, сервер по-прежнему управляет SyncVar и другими функциями сериализации. Клиенту необходимо будет использовать Commands чтобы обновить состояние на сервере, чтобы оно могло синхронизироваться с другими клиентами.

Как выдать authority

По умолчанию сервер имеет контроль над всеми объектами. Сервер может предоставлять контроль над объектами, которыми клиент должен управлять, таким как объект player.

Если вы спавните объект игрока с помощью NetworkServer.AddPlayerForConnection тогда ему автоматически будет предоставлен контроль.

Использование NetworkServer.Spawn

Вы можете предоставить контроль клиенту при создании объекта. Это делается путем передачи соединения с сообщением о спавне

GameObject go = Instantiate(prefab);
NetworkServer.Spawn(go, connectionToClient);

Использование identity.AssignClientAuthority

Вы можете предоставить контроль клиенту в любое время, используя AssignClientAuthority. Это можно сделать, вызвав AssignClientAuthority на объекте, которому вы хотите предоставить контроль.

identity.AssignClientAuthority(conn);

Возможно, вы захотите сделать это, когда игрок подберет предмет

// Command на объекте игрока
void CmdPickupItem(NetworkIdentity item)
{
    item.AssignClientAuthority(connectionToClient); 
}

Как удалить контроль

Вы можете использовать identity.RemoveClientAuthority чтобы удалить контроль клиента над объектом.

identity.RemoveClientAuthority();

Контроль не может быть удален с объекта player. Вместо этого вам придется заменить контролирующего клиента с помощью NetworkServer.ReplacePlayerForConnection.

On Authority

Когда объекту предоставляется контроль или он удаляется из него, этому клиенту будет отправлено сообщение с уведомлением об этом. Это приведет к тому, что будут вызваны функции OnStartAuthority или OnStopAuthority.

Check Authority

Client Side

Свойство identity.isOwned может использоваться для проверки того, имеет ли локальный игрок контроль над объектом.

Server Side

Свойство identity.connectionToClient можно проверить, чтобы увидеть, какой клиент имеет контроль над объектом. Если оно равно null, то у сервера есть полномочия.

Last updated