Authority - это способ принятия решения о том, кому принадлежит объект и кто имеет над ним контроль.
Authority сервера означает, что сервер имеет контроль над объектом. Сервер имеет контроль над объектами по умолчанию. Это означает, что сервер будет управлять предметами коллекционирования, движущимися платформами, NPC и любыми другими сетевыми объектами, которые не принадлежат игроку.
Authority клиента означает, что клиент имеет контроль над объектом.
Когда клиент имеет контроль над объектом, это означает, что он может вызывать Commands и что объект будет автоматически уничтожен при отключении клиента.
Даже если клиент имеет контроль над объектом, сервер по-прежнему управляет SyncVar и другими функциями сериализации. Клиенту необходимо будет использовать Commands чтобы обновить состояние на сервере, чтобы оно могло синхронизироваться с другими клиентами.
По умолчанию сервер имеет контроль над всеми объектами. Сервер может предоставлять контроль над объектами, которыми клиент должен управлять, таким как объект player.
Если вы спавните объект игрока с помощью NetworkServer.AddPlayerForConnection
тогда ему автоматически будет предоставлен контроль.
Вы можете предоставить контроль клиенту при создании объекта. Это делается путем передачи соединения с сообщением о спавне
GameObject go = Instantiate(prefab);
NetworkServer.Spawn(go, connectionToClient);
Вы можете предоставить контроль клиенту в любое время, используя AssignClientAuthority
. Это можно сделать, вызвав AssignClientAuthority
на объекте, которому вы хотите предоставить контроль.
identity.AssignClientAuthority(conn);
Возможно, вы захотите сделать это, когда игрок подберет предмет
// Command на объекте игрока
void CmdPickupItem(NetworkIdentity item)
{
item.AssignClientAuthority(connectionToClient);
}
Вы можете использовать identity.RemoveClientAuthority
чтобы удалить контроль клиента над объектом.
identity.RemoveClientAuthority();
Контроль не может быть удален с объекта player. Вместо этого вам придется заменить контролирующего клиента с помощью NetworkServer.ReplacePlayerForConnection
.
Когда объекту предоставляется контроль или он удаляется из него, этому клиенту будет отправлено сообщение с уведомлением об этом. Это приведет к тому, что будут вызваны функции OnStartAuthority
или OnStopAuthority
.
Свойство identity.isOwned
может использоваться для проверки того, имеет ли локальный игрок контроль над объектом.
Свойство identity.connectionToClient
можно проверить, чтобы увидеть, какой клиент имеет контроль над объектом. Если оно равно null, то у сервера есть полномочия.