Unity UNET Как изменить онлайн-сцену синхронно с клиентами - PullRequest
0 голосов
/ 17 декабря 2018

Я использую старую реализацию Unity 2017.3 UNET в моей игре.Игроки подключаются к серверу и размещаются в сцене лобби, пока лидер группы не выберет другой уровень для перехода.Реализация является лишь слегка измененной версией стандартного NetworkLobbyManager.

Проблема началась, когда я начал интенсивно тестировать сетевой код, запустив скомпилированную сборку для клиента и затем используя редактор в качестве сервера.Очень часто сервер, работающий в редакторе, будет работать намного медленнее, чем скомпилированная клиентская сборка.Поэтому, когда я использую NetworkManager.ServerChangeScene, клиент загрузит сцену перед сервером, что приведет к отключению всех сетевых идентификаторов на сцене клиента (поскольку они еще не были созданы на сервере.)

Этогораздо реже произойдет, если на сервере выполняется скомпилированная сборка, потому что сервер почти всегда загружает сцену перед любыми клиентами.Но это поднимает большую проблему с самим Unity.Что нет гарантии, что сервер будет доступен при смене сцен.

Есть ли другой способ смены сцен в сетевой игре?Есть ли способ гарантировать, что сервер выходит на сцену раньше, чем какие-либо клиенты?Или я застрял в надежде, что сеть остается стабильной между сменами сцен?

1 Ответ

0 голосов
/ 17 декабря 2018

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

Я просматривалисходный код UNET и понял, что сервер должен учитывать ситуации, когда он загружает сцену после клиентов, хотя этот код выглядит для меня немного бесполезно.Эта теория была подкреплена документацией . Я обнаружил, что в ней также говорится, что NetworkIdentities в сцене при запуске обрабатываются так, как если бы они динамически создавались при запуске сервера.

Зная эти вещи сейчас, яЯ начинаю думать, что я просто тупой и испортил некоторые вещи с моей стороны.Отключаемый объект - это менеджер, который включает и отключает другие объекты NetworkIdentity.Я почти уверен, что основная проблема заключается в том, что он отключает сетевую идентификацию на клиенте, которая все еще включена на сервере, что приводит к тому, что все становится бесполезным.

В будущем япросто постараюсь держаться подальше от включения и выключения игровых объектов по сети и придерживаться установки соответствующих функций под собственным флагом, чтобы я мог «мягко отключить» объект, не вызывая ошибок в любых входящих RPC или данных SyncVar.

...