У меня есть 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); , но они кажутся очень хакерскими.
Мой вопрос: есть ли лучший способ получить пули?на клиенте не будет уничтожено, пока они не пройдут тот же путь, что и на сервере?
Или, может быть, что-то выше звонит ложно, и я делаю что-то глупое?
Спасибо большоемного за любую помощь!