Unity / UNET, клиентские объекты не перемещаются на том же расстоянии, что и на сервере, перед уничтожением - PullRequest
0 голосов
/ 30 мая 2019

У меня есть 2D-проект 2019.1.0f2 с использованием высокоуровневого сетевого API.

Физика полностью контролируется сервером.
Нет взаимодействующих с игроком авторитетных игровых объектов.
Персонажи сцены стреляют пулями друг в друга.
Пули представляют собой сборные с сетевыми удостоверениями.
Пули создаются сервером с помощью NetworkServer.Spawn (prefab); .
Пули имеют Сетевое преобразование с Режим синхронизации преобразования: Sync Regidbody 2D .
Пули имеют следующую логику:

  void OnTriggerEnter2D(Collider2D col) {
    if (isServer) {
          NetworkServer.Destroy(gameObject);
     }
  }


На сервере все работает как положено.

Но на клиенте я обнаружил, что объект игры пули уничтожается до того, как пуля достигнет своей цели.Иными словами, если я рисую линию от начальной точки маркера до конечной точки маркера, линия на сервере симуляции будет длиннее.

Пули движутся довольно быстро, поэтому я предполагаю, что клиент получает команду NetworkServer.Destroy до того, как симуляция физики клиента будет достигнута, где имитация сервера была, когда пулябыл уничтожен.

В качестве своего рода теста я заменил NetworkServer.Destroy (gameObject) gameObject.setActive (false); .Это, конечно, не уничтожило маркеры на клиенте, но привело к остановке пули в том месте, где она была уничтожена на сервере .Это поведение, которое я хочу.Только я бы хотел, чтобы объекты действительно были уничтожены.Я могу придумать несколько способов сделать это, используя gameObject.setActive (false); , но они кажутся очень хакерскими.

Мой вопрос: есть ли лучший способ получить пули?на клиенте не будет уничтожено, пока они не пройдут тот же путь, что и на сервере?

Или, может быть, что-то выше звонит ложно, и я делаю что-то глупое?

Спасибо большоемного за любую помощь!

...