Unity: порождать объект от клиента ко всем клиентам

У меня есть игрок, который стреляет пулями, но пули появляются для всех клиентов только тогда, когда стреляющий игрок является хостом.

Использование Unity 5.6

То, что у меня есть до сих пор ...

  • У меня уже есть Prefab, зарегистрированный в NetworkManager.
  • Префаб имеет NetworkIdentity с ServerOnly со значением false и LocalPlayerAuthority со значением false.
  • Префаб имеет NetworkTransform с NetworkSendRate = 0 и TransformSyncMode для Sync RigidBody2D.
  • The Player shoots the Bullet with a method [Command] and using NetworkServer.Spawn (bulletInstance)
    • Before the NetworkServer.Spawn is called I assign the velocity to the RigidBody2D of the bulletInstance.
    • Класс Bullet Script - это NetworkBehaviour.
    • У игрока есть NetworkIdentity с LocalPlayerAuthority в true.
    • Класс сценария проигрывателя - это NetworkBehaviour.

введите описание изображения здесь


person Makarov    schedule 25.08.2017    source источник
comment
Вы добавили сетевой идентификатор в bulletPrefab ?? Второй способ - использовать метод с [RpcClient] RpcSpawnABullet (вектор) в [Command] CmdFire.   -  person Cổ Chí Tâm    schedule 25.08.2017
comment
ты это проверяешь? docs.unity3d.com/Manual/UNetCustomSpawning.html   -  person joreldraw    schedule 25.08.2017
comment
как вы вызывали cmdFire   -  person Muhammad Faizan Khan    schedule 05.09.2017


Ответы (1)


В Unet,

1. Только СЕРВЕР может порождать любой объект - конец истории

В Unet серверы порождают объекты и все. Конец истории.

2. ВЫ ДОЛЖНЫ ИМЕТЬ объекты игрока. У каждого клиента ОБЯЗАТЕЛЬНО ДОЛЖЕН быть объект игрока.

Совершенно нормально, что объект игрока на самом деле не танк или двуногий, а просто пустой игровой объект. (Иногда называется абстрактным объектом игрока).

У каждого клиента ДОЛЖЕН быть объект игрока - часто просто пустой игровой объект.

3. Относительно создания объектов, имеющих полномочия клиента - см. Пункт 1.

Создавать объекты с полномочиями клиента очень просто. Просто перейдите на страницу документации Manual / UNetSpawning.html и прокрутите вниз до Code (CSharp):

NetworkServer.SpawnWithClientAuthority(treeGo, conn);

Там это объясняется (на самом деле это все, что нужно).

4. Скажем, какой-то конкретный игрок, X, будет иметь власть над объектом. Конечно, вы не можете создать объект, пока X не присоединится!

В строке кода чуть выше люди часто спрашивают откуда, черт возьми, вы знаете, какое соединение NetworkConnection использовать?

Конечно, это бессмысленно, пока X действительно не присоединится к игре! См. Пункт 2!

Итак, вы могли бы делать такие вещи ...

Пример 1 - ваш материнский корабль только один конкретный клиент. Конечно, сервер, очевидно, должен знать NetworkConnection этого клиента. Вы сохраните его в переменной networkConnectionToMothership. Таким образом, в этом примере у вас есть соединение.

or

Пример 2 - клиент (скажем, клиент JohnSmith) хочет создать объект, над которым JohnSmith будет иметь полномочия. Проще говоря, клиент (JohnSmith) просит сервер создать объект. Запрашивает сервер просто означает отправить Command.

Внутри любой команды (т.е. запущенной на сервере) у вас буквально есть свойство connectionToClient, которое дает вам необходимое соединение!

Так вот в чем дело.

По этому конкретному вопросу в вашем коде вы вызываете NetworkServer.spawn.

Ты должен звонить

NetworkServer.SpawnWithClientAuthority(treeGo, conn);

(Найдите это на этой странице документации: Manual / UNetSpawning.html)

и я объяснил выше в примере (2), как вы узнаете, какой conn использовать.

person Fattie    schedule 10.08.2018