Как я могу создать объект с вложенными компонентами NetworkIdentity в Unity? - PullRequest
0 голосов
/ 18 января 2019

У меня есть игра, которая почти закончена. В игре есть несколько «комнат», которые создаются во время выполнения для создания «уровня». Все эти комнаты содержат сборные конструкции, такие как рычаги, двери и прижимные пластины, которые вместе составляют головоломку, которую необходимо решить, чтобы открыть следующую комнату. Эти рычаги и дверцы (и т. Д.) Имеют компоненты NetworkIdentity, поэтому их состояния можно синхронизировать по сети. Ранее у меня была сложная система для синхронизации аддитивной загрузки сцен по сети, которую uNet не поддерживает изначально, но с добавлением вложенных префабов я решил, что это упростит жизнь. Реализация аддитивной сцены просто имела ряд ошибок, которые нельзя было отследить, что затрудняло игру и делало некоторых клиентов неиграбельными.

Я удалил весь свой аддитивный код загрузки сцен и превратил мои комнаты в комнатные префабы. Эти префабы теперь создаются с помощью NetworkServer.Spawn (). Тем не менее, каждая комната нуждается в NetworkIdentity для того, чтобы порождаться по сети. Это означает, что ни один из дочерних префабов, таких как рычаги и двери, не подключен по сети.

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

Если бы я мог сделать так, чтобы assetId каждого объекта комнаты на сервере был уникальным, я мог бы тогда правильно отобразить объекты на клиенте. Однако даже тогда мне пришлось бы перестраивать все ссылки на остальную часть сцены, которая требуется для объекта, и все ссылки на объект, которые требует сцена. Это свойство, кажется, только для чтения, поэтому я не могу. Я не знаю способ обойти это. Кто-нибудь может помочь?

Я готов поменять сетевую среду с uNet, если кто-нибудь может подтвердить, что эта функция реализована в другом решении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...