SyncDirection

Недавно мы добавили новую функцию SyncDirection, поэтому вот краткий обзор.

Почему SyncDirection

Обычно данные синхронизируются с сервера на клиент в OnSerialize.

Однако некоторые компоненты, такие как NetworkTransform, должны иметь возможность синхронизации с клиента на сервер в случае изменения полномочий клиента.

Ранее нам приходилось использовать [Command] для синхронизации клиентских авторитетных данных NetworkTransform с сервером, поскольку OnSerialize передавался только от сервера к клиенту. У этого есть несколько недостатков:

  • Требуется много дополнительного кода для выполнения как OnSerialize, так и ручных удаленных вызовов

  • Это дополнительная пропускная способность: каждая команда включает в себя хэш функции и т.д.

  • Интервалы должны быть реализованы вручную, так как SyncInterval предназначен только для OnSerialize.

Как вы можете видеть, было бы здорово, если бы для OnSerialize также существовала возможность перехода с клиента на сервер.

Обратите внимание, что ClientToServer - это некоторое упрощение. Технически он передается от клиента-владельца на сервер, где затем транслируется всем другим клиентам-наблюдателям, которые не являются владельцами.

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

Короче говоря, мы внедрили SyncDirection для компонентов клиентских полномочий.

Подводя итог:

  • ServerToClient стоит по умолчанию. OnSerialize (и все SyncVars, SyncLists) отправляются с сервера к клиенту каждый syncInterval. OnDeserialize вызывается на клиенте.

  • ClientToServer это клиент-авторитарные компоненты. OnSerialize вызывается на клиенте владельце каждый syncInterval. Затем данные отправляются на сервер, где вызывается OnDeserialize. После этого сервер осуществляет рассылку этих данных всем остальным клиентам, кроме владельца. OnDeserialize вызывается на всех остальных клиентах.

Обратите внимание, что данные ClientToServer все еще могут быть проверены в OnDeserialize на сервере. Вот почему технически это не "полномочия клиента", отсюда и название SyncDirection. Например, в то время как клиент-владелец может синхронизировать данные NetworkTransform с сервером, вы все равно можете проверять каждое движение в OnDeserialize сервера перед его применением и трансляцией.

Last updated