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

В сетевой системе есть способы выполнять действия в сети. Действия такого типа иногда называют удаленными вызовами процедур. В сетевой системе есть два типа RPC: Команды, которые вызываются клиентом и выполняются на сервере; и вызовы ClientRpc, которые вызываются на сервере и выполняются на клиентах.

На диаграмме ниже показаны направления удаленных действий:

Команды

Команды отправляются от объектов игрока на клиенте объектам игрока на сервере. В целях безопасности Команды можно отправлять только из ВАШЕГО объекта игрокаобъекта High Level API (HPAPI), представляющего игрока на сервере. и имеет возможность запускать команды (которые представляют собой безопасные удаленные вызовы процедур между клиентом и сервером) из клиента проигрывателя. Подробнее
См. в Словарь
, чтобы вы не могли управлять объектами других игроков. Чтобы превратить функцию в команду, добавьте к ней пользовательский атрибут [Command] и добавьте префикс «Cmd». Теперь эта функция будет выполняться на сервере при вызове на клиенте. Любые аргументы будут автоматически переданы на сервер командой.

Функции команд должны иметь префикс «Cmd». Это подсказка при чтении кода, вызывающего команду — эта функция особенная и не вызывается локально, как обычная функция.

class Player : NetworkBehaviour { public GameObject bulletPrefab; [Command] void CmdDoFire(float lifeTime) { GameObject bullet = (GameObject)Instantiate( bulletPrefab, transform.position + transform.right, Quaternion.identity); var bullet2D = bullet.GetComponent(); bullet2D.velocity = transform.right * bulletSpeed; Destroy(bullet, lifeTime); NetworkServer.Spawn(bullet); } void Update() { if (!isLocalPlayer) return; if (Input.GetKeyDown(KeyCode.Space)) { CmdDoFire(3.0f); } } }

Будьте осторожны, отправляя команды от клиента каждый кадр! Это может вызвать большой сетевой трафик.

По умолчанию команды отправляются по нулевому каналу — надежному каналу по умолчанию. Таким образом, по умолчанию все команды надежно отправляются на сервер. Это можно настроить с помощью параметра «Канал» пользовательского атрибута [Команда]. Этот параметр должен быть целым числом, представляющим номер канала.

Канал 1 также настроен по умолчанию как ненадежный канал, поэтому, чтобы использовать его, используйте значение 1 для параметра в атрибуте Command, например:

[Command(channel=1)]

Начиная с версии Unity 5.2 можно отправлять команды из объектов, не являющихся игроками, которые имеют права доступа клиента. Эти объекты должны быть созданы с помощью NetworkServer.SpawnWithClientAuthority или иметь права доступа, установленные с помощью NetworkIdentity.AssignClientAuthority. Команды, отправленные этим объектом, выполняются на экземпляре объекта на сервере, а не на связанном объекте игрока для клиента.

Вызовы ClientRpc

Вызовы ClientRpc отправляются с объектов на сервере объектам на клиентах. Их можно отправлять с любого объекта сервера с помощью NetworkIdentityсетевого компонента, который позволяет вам назначать идентификатор вашему игровому объекту для сети. чтобы распознать его как игровой объект локального игрока или игровой объект только для сервера. Подробнее
См. в Словарь
, который был создан. Поскольку у сервера есть полномочия, нет проблем с безопасностью, когда объекты сервера могут отправлять эти вызовы. Чтобы превратить функцию в вызов ClientRpc, добавьте к ней настраиваемый атрибут [ClientRpc] и добавьте префикс «Rpc». Теперь эта функция будет выполняться на клиентах при вызове на сервере. Любые аргументы будут автоматически переданы клиентам с вызовом ClientRpc..

Функции ClientRpc должны иметь префикс «Rpc». Это подсказка при чтении кода, вызывающего метод — эта функция особенная и не вызывается локально, как обычная функция.

class Player : NetworkBehaviour { [SyncVar] int health; [ClientRpc] void RpcDamage(int amount) { Debug.Log("Took damage:" + amount); } public void TakeDamage(int amount) { if (!isServer) return; health -= amount; RpcDamage(amount); } }

При запуске игры в качестве хоста с LocalClient вызовы ClientRpc будут вызываться для LocalClient, даже если он находится в том же процессе, что и сервер. Таким образом, поведение LocalClients и RemoteClients одинаково для вызовов ClientRpc.

Аргументы для удаленных действий

Аргументы, передаваемые командам и вызовам ClientRpc, сериализуются и отправляются по сети. Этими аргументами могут быть:

  • базовые типы (byte, int, float, string, UInt64 и т. д.)
  • массивы основных типов
  • структуры, содержащие допустимые типы
  • встроенные математические типы Unity (Vector3, Quaternion и т. д.)
  • Идентификатор сети
  • Идентификатор экземпляра сети
  • NetworkHash128
  • GameObjectОсновной объект в сценах Unity, который может представлять персонажей, реквизит, декорации, камеры, путевые точки и многое другое. Функциональность GameObject определяется прикрепленными к нему компонентами. Подробнее
    См. в Словарь
    с прикрепленным компонентом NetworkIdentity

Аргументы для удаленных действий не могут быть подкомпонентами GameObjects, такими как экземпляры сценария или преобразования. Они не могут быть другими типами, которые нельзя сериализовать по сети.

Вы можете отблагодарить автора, за перевод документации на русский язык. ₽ Спасибо
Руководство Unity 2021.3