2015-07-28 4 views
2

Итак, я понимаю, что [команда] не работает на объектах, отличных от игроков, однако ... почему? как я должен синхронизировать данные объектов, не являющихся игроками, например, местоположения NPC. Возможность вызова команды на объектах, не являющихся игроками, сэкономит много повторных вычислений на каждом клиенте.Unity UNET - вызов [Command] вне объекта игрока

Кто-нибудь придумал обходное решение для этого дизайнерского решения?

Также кажется, что SyncVars не синхронизируются, если не на объектах игроков.

Сейчас моя лучшая стратегия для хранения whoooole многих данных об объектах игроков и должен продолжать делать ссылки на него из внешних классов

EDIT: OOps моя ошибка, как указали SyncVars работает на не-игровые объекты, только при наличии обновлений на сервере

+1

FYI, начиная с 5.2, который вышел в этом месяце. вы можете теперь вызывать команду вне объектов игрока. YIIPEE !!!! – James

+0

где этот код? Я использую 5.4, но не выполняет командную функцию не на сервере. –

ответ

3

Да, [Команда] предназначен для отправки RPC на сервер.

Однако SyncVars будет синхронизировать состояние от сервера к клиенту на любом объекте с NetworkBehaviour (не только объекта игрока).

подход авторитетный сервер должен иметь сервер порождать свои места NPC с NetworkServer.Spawn(), а затем обновить NPC Syncvars, и они будут автоматически обновлять на всех клиентах.

Если вам действительно нужно отправить [Command] от клиента, с новыми версиями Unity вы можете предоставить сцену объект местного органа игрок с помощью AssignClientAuthority():

Если у вас есть PRO лицензия и можете получить доступ бета Unity 5.2 строит, то они добавили это в 5.2b1

сети: добавлена ​​поддержка клиентской стороны органа для неигровых объектов. Новая функция NetworkServer.SpawnWithClientAuthority(GameObject obj, NetworkConnection conn) позволяет присваивать полномочия назначению клиенту его подключению при создании объекта. Это, как правило, используются в обработчике команды для клиента с просьбой, чтобы породить объект, то соединение клиента будет принято в Например:.

[Command] 
void CmdSpawn() { 
    var go = (GameObject)Instantiate(otherPrefab, 
    transform.position + new Vector3(0,1,0), Quaternion.identity); 
    NetworkServer.SpawnWithClientAuthority(go, base.connectionToClient); 
} 

Для установки полномочий на объекты после того, как они созданы, есть новые функции AssignClientAuthority(NetworkConnection conn) и RemoveClientAuthority(NetworkConnection conn) на NetworkIdentity класс. Обратите внимание, что только один клиент может быть полномочным объектом для объекта . На клиенте, у которого есть полномочия, вызывается функция OnStartAuthority(), а свойство hasAuthority будет true. Набор объектов, принадлежащих клиенту, доступен в новом объекте NetworkConnection.clientOwnedObjects, который представляет собой набор NetworkInstanceIds.Этот набор может использоваться на сервере, когда получено сообщение , чтобы гарантировать, что клиент, который отправил сообщение, фактически владеет этим объектом. Когда клиент отключается, функция DestroyPlayersForConnection теперь уничтожает все объекты, принадлежащие этому соединению , а не только объект игрока. Объекты, у которых есть свой авторитет , установленный клиентом, должны иметь LocalPlayerAuthority, установленный в их NetworkIdentity. Раньше только объекты игрока могли иметь локальный , что означало, что NetworkTransform (и другие компоненты ) могут использоваться только для управления единственным игроком объектом для подключения к клиенту. С этими изменениями возможно, что на клиентском компьютере, локально контролируемом, есть несколько объектов на уровне .