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

NetworkBehaviour скриптыЧасть кода, позволяющая создавать собственные компоненты, инициировать игровые события, изменять свойства компонентов с течением времени. и отвечайте на ввод пользователя любым удобным для вас способом. Подробнее
См. в разделе Словарь
работа с GameObjectsОсновной объект в сценах Unity, который может представлять персонажей, реквизит, декорации, камеры, путевые точки и многое другое. Функциональность GameObject определяется прикрепленными к нему компонентами. Подробнее
См. в Словарь
, которые имеют Сетевой идентификатор. Эти сценарии могут выполнять функции API высокого уровня, такие как команды, ClientRPC, SyncEvents и SyncVars.

В системе Unity Network System, авторизованной сервером, сервер должен использовать NetworkServer.Spawn для создания игровых объектов с компонентами Network Identity. При их создании таким образом им назначается NetworkInstanceId и создает их на клиентах, подключенных к серверу.

Примечание. Этот компонент нельзя добавить непосредственно в GameObject. Вместо этого вы должны создать сценарий, который наследуется от NetworkBehaviour (вместо используемого по умолчанию MonoBehaviour), затем вы можете добавить свой сценарий как компонент игрового объекта.

Свойства

Свойства Описание
isLocalPlayer Возвращает true, если этот GameObject представляет игрока на локальном клиенте.
isServer Возвращает true, если этот GameObject запущен на сервере и был создан.
isClient Возвращает true, если этот GameObject находится на клиенте и был создан сервером..
hasAuthority Возвращает true, если этот GameObject является авторитетной версией GameObject, что означает, что он является источником изменений для синхронизации. Для большинства GameObject это возвращает true на сервере. Однако, если значение localPlayerAuthority в компоненте NetworkIdentityA Networking позволяет назначать идентификатор вашему игровому объекту для распознавания сетью это как игровой объект локального игрока или игровой объект только для сервера. Подробнее
См. в Словарь
верно, полномочия принадлежат клиенту этого игрока, и это значение true на этом клиенте, а не на сервере.
netId Уникальный сетевой идентификатор этого GameObject. Сервер назначает это во время выполнения. Он уникален для всех игровых объектов в этом сетевом сеансе.
playerControllerId Идентификатор игрока, связанного с этим скриптом NetworkBehaviour. Это допустимо только в том случае, если объект является локальным игроком.
connectionToServer NetworkConnection, связанный с компонентом Network Identity, прикрепленным к этому GameObject. Это действительно только для объектов игрокаОбъект API высокого уровня (HPAPI), который представляет игрока на сервере и имеет возможность запускать команды (которые представляют собой защищенные вызовы удаленных процедур между клиентом и сервером) из клиента проигрывателя. Подробнее
См. в Словарь
в клиенте.
connectionToClient NetworkConnection, связанный с компонентом Network Identity, прикрепленным к этому GameObject. Это действительно только для GameObjects игрока на сервере.
localPlayerAuthority Это значение задается в компоненте Network Identity и доступно из сценария NetworkBehaviour для удобного доступа в сценариях.

Сценарии NetworkBehaviour имеют следующие функции:

  • Синхронизированные переменные
  • Обратные вызовы сети
  • Функции сервера и клиента
  • Отправка команд
  • Клиентские RPC-вызовы
  • Сетевые события

Синхронизированные переменные

Вы можете синхронизировать переменные-члены сценариев NetworkBehaviour с сервера на клиенты. Сервер является авторитетным в этой системе, поэтому синхронизация происходит только в направлении от сервера к клиенту.

Используйте SyncVar, чтобы пометить переменные-члены как синхронизированные. Синхронизированные переменные могут быть любого базового типа (bool, byte, sbyte, char, decimal, double, float, int, uint, long, ulong, short, ushort, string), но не классов, списков или других коллекций.

public class SpaceShip : NetworkBehaviour { [SyncVar] public int health; [SyncVar] public string playerName; }

Когда на сервере изменяется значение SyncVar, сервер автоматически отправляет новое значение всем готовым клиентам в игре и обновляет соответствующий SyncVar на этих клиентах. Когда игровые объекты создаются, они создаются на клиенте с последним состоянием всех атрибутов SyncVar с сервера.

Примечание. Чтобы сделать запрос от клиента к серверу, необходимо использовать команды, а не синхронизированные переменные. Дополнительную информацию см. в документации по отправке команд.

Обратные вызовы сети

Существуют встроенные функции обратного вызова, которые вызываются в сценариях NetworkBehaviour для различных сетевых событий. Это виртуальные функции базового класса, поэтому вы можете переопределить их в своем коде следующим образом:

public class SpaceShip : NetworkBehaviour { public override void OnStartServer() { // disable client stuff } public override void OnStartClient() { // register client events, enable effects } }

Встроенные обратные вызовы:

  • OnStartServer – вызывается когда GameObject появляется на сервере или когда сервер запускается для GameObjects в сцене
  • OnStartClient – вызывается когда GameObject появляется на клиенте или когда клиент подключается к серверу для GameObjects в сцене
  • OnSerialize — вызывается собирать состояние для отправки с сервера клиентам
  • OnDeSerialize — вызывается применить состояние к GameObjects на клиентах
  • OnNetworkDestroy – вызывается на клиентах, когда сервер уничтожает GameObject
  • OnStartLocalPlayer – вызывается на клиентах для GameObjects игрока на локальном клиенте (только)
  • OnRebuildObservers на сервере при перестроении набора наблюдателей для GameObjects
  • OnSetLocalVisibility — вызывается на клиенте и/или сервере, когда видимость GameObject изменяется для локального клиента
  • OnCheckObserver — вызывается на сервере для проверки состояния видимости для нового клиента

Обратите внимание, что в одноранговой конфигурации, когда один из клиентов действует как хост и клиент, оба OnStartServer и OnStartClient вызываются для одного и того же GameObject. Обе эти функции полезны для действий, специфичных для клиента или сервера, таких как подавление эффектов на сервере или настройка событий на стороне клиента.

Функции сервера и клиента

Вы можете пометить функции-члены в сценариях NetworkBehaviour с помощью настраиваемых атрибутов, чтобы обозначить их как функции только для сервера или только для клиента. Например:

using UnityEngine; using UnityEngine.Networking; public class SimpleSpaceShip : NetworkBehaviour { int health; [Server] public void TakeDamage( int amount) { // will only work on server health -= amount; } [ServerCallback] void Update() { // engine invoked callback - will only run on server } [Client] void ShowExplosion() { // will only run on client } [ClientCallback] void Update() { // engine invoked callback - will only run on client } }

[Server] и [ServerCallback] немедленно возвращаются, если клиент не активен. Аналогично, [Client] и [ClientCallback] возвращаются немедленно, если сервер неактивен.

Атрибуты [Server] и [Client] предназначены для ваших собственных настраиваемых функций обратного вызова. Они не генерируют ошибок времени компиляции, но выдают предупреждающее сообщение журнала, если вызываются в неправильной области.

Атрибуты [ServerCallback] и [ClientCallback] предназначены для встроенных функций обратного вызова, которые автоматически вызываются Unity. Эти атрибуты не вызывают генерацию предупреждения.

Дополнительную информацию об обсуждаемых атрибутах см. в справочной документации по API:

Отправка команд

Для выполнения кода на сервере необходимо использовать команды. Высокоуровневый API — это авторитетная система сервера, поэтому команды — единственный способ для клиента запустить некоторый код на сервере.

Только игровые объекты игрока могут отправлять команды.

Когда клиентский игровой объект GameObject отправляет команду, эта команда выполняется для соответствующего игрового объекта игрока на сервере. Эта маршрутизация происходит автоматически, поэтому клиент не может отправить команду другому игроку.

Чтобы определить команду в своем коде, вы должны написать функцию, которая имеет:

  • Имя, начинающееся с Cmd

  • Атрибут [Command]

Например:

using UnityEngine; using UnityEngine.Networking; public class SpaceShip : NetworkBehaviour { bool alive; float thrusting; int spin; [ClientCallback] void Update() { // This code executes on the client, gathering input int spin = 0; if (Input.GetKey(KeyCode.LeftArrow)) { spin += 1; } if (Input.GetKey(KeyCode.RightArrow)) { spin -= 1; } // This line triggers the code to run on the server CmdThrust(Input.GetAxis("Vertical"), spin); } [Command] public void CmdThrust(float thrusting, int spin) { // This code executes on the server after Update() is // called from below. if (!alive) { this.thrusting = 0; this.spin = 0; return; } this.thrusting = thrusting; this.spin = spin; } }

Команды вызываются простым вызовом функции на клиенте. Вместо командной функции, работающей на клиенте, она автоматически вызывается для соответствующего игрового объекта игрока на сервере.

Команды типобезопасны, имеют встроенную защиту и маршрутизацию к проигрывателю, а также используют эффективный механизм сериализации для аргументов, что ускоряет их вызов.

Клиентские вызовы RPC

Клиентские RPC-вызовы — это способ, с помощью которого игровые объекты сервера могут выполнять действия на клиентских игровых объектах.

Клиентские RPC-вызовы не ограничены игровыми объектами игрока и могут быть вызваны для любого игрового объекта с компонентом Network Identity.

Чтобы определить клиентский вызов RPC в коде, вы должны написать функцию, которая:

  • Имя, начинающееся с Rpc
  • Имеет атрибут [ClientRPC]

Например:

using UnityEngine; using UnityEngine.Networking; public class SpaceShipRpc : NetworkBehaviour { [ServerCallback] void Update() { // This is code run on the server int value = UnityEngine.Random.Range(0,100); if (value < 10) { // This invoke the RpcDoOnClient function on all clients RpcDoOnClient(value); } } [ClientRpc] public void RpcDoOnClient(int foo) { // This code will run on all clients Debug.Log("OnClient " + foo); } }

Сетевые события

Сетевые события аналогичны клиентским RPC-вызовам , но вместо вызова функции игрового объекта они запускают события.

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

Чтобы определить в коде сетевое событие , вы должны написать функцию, которая одновременно:

  • Название начинается с Event

  • Имеет атрибут [SyncEvent]

Вы можете использовать события для создания мощных сетевых игровых систем, которые можно расширить с помощью других сценариев. В этом примере показано, как сценарий эффекта на клиенте может реагировать на события, сгенерированные сценарием боя на сервере.

SyncEvent — это базовый класс, от которого происходят вызовы Commands и ClientRPC . Вы можете использовать атрибут SyncEvent в своих собственных функциях, чтобы создать свой собственный код сетевого игрового процесса, управляемого событиями. Используя SyncEvent, вы можете расширить возможности многопользовательской игры Unity, чтобы они лучше соответствовали вашим собственным шаблонам программирования. Например:

using UnityEngine; using UnityEngine.Networking; // Server script public class MyCombat : NetworkBehaviour { public delegate void TakeDamageDelegate(int amount); public delegate void DieDelegate(); public delegate void RespawnDelegate(); float deathTimer; bool alive; int health; [SyncEvent(channel=1)] public event TakeDamageDelegate EventTakeDamage; [SyncEvent] public event DieDelegate EventDie; [SyncEvent] public event RespawnDelegate EventRespawn; [ServerCallback] void Update() { // Check if it is time to Respawn if (!alive) { if (Time.time > deathTimer) { Respawn(); } return; } } [Server] void Respawn() { alive = true; // send respawn event to all clients from the Server EventRespawn(); } [Server] void EventTakeDamage(int amount) { if (!alive) return; if (health > amount) { health -= amount; } else { health = 0; alive = false; // send die event to all clients EventDie(); deathTimer = Time.time + 5.0f; } } }
Вы можете отблагодарить автора, за перевод документации на русский язык. ₽ Спасибо
Руководство Unity 2021.3