Unity 5.3+ Сетевая нагрузка следующего уровня

В проекте сетевой игры, основанном на Учебнике по многопользовательской игре Unity, как предполагается, что нужно изменить сцену на новый уровень / карту, сохраняя при этом камеру / игрока GO / здоровье и т. д. в одной всеобъемлющей основной сцене. (например, Gameplay.unity с добавленным к нему Level1.unity или Level2.unity)

Вся связанная помощь кажется устаревшим кодом, решениями для одиночной игры или более специфическими обстоятельствами. Текущая документация Unity 5.5 предлагает ServerChangeScene, что, кажется, обеспечивает только половину решения.

Существуют ли что-то вроде ServerAddScene и ServerGetScene?

Попытки решения заключались в использовании DontDestroyOnLoad для известных игровых объектов в основной сцене и сохранении переменной currentMapNumber, синхронизированной между клиентскими NetworkManager, которая обновляется, когда игрок достигает триггера конца уровня. . Затем это проверяется в методе Update() и либо вызывает

networkManager.ServerChangeScene("Level" + networkManager.GetComponent<NetGame>().mapNumber);

or

SceneManager.LoadScene("Level" + networkManager.GetComponent<NetGame>().mapNumber, LoadSceneMode.Additive);

ни один из них не работает должным образом.


person Rogod    schedule 15.01.2017    source источник
comment
Привет, родной, ты нашел какое-нибудь решение. я также ищу аддитивную загрузку сцен в единстве через сеть   -  person Muhammad Faizan Khan    schedule 26.01.2017
comment
Пока нет - я знаю, что есть много людей с этой проблемой, но, похоже, ни у кого нет ответа, кто еще видел эту ветку. - Мой проект в основном приостановлен, пока у меня, к сожалению, нет хорошего решения. :(   -  person Rogod    schedule 27.01.2017


Ответы (1)


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

[ClientRpc]
    public void RpcLoadLevelAcrossNetwork() {
        SceneManager.LoadSceneAsync(sceneName, LoadSceneMode.Additive);   
    }

ClientRpc загрузит новую сцену для всех подключенных клиентов, а аддитивная загрузка сцены позволит вам сохранить работу камеры/игрока/здоровье и т. д.

person Muhammad Faizan Khan    schedule 28.01.2017
comment
Хотя в некотором роде это работает, загружаются только объекты в сцене, у которых нет NetworkIdentity. Казалось бы, для достижения желаемого эффекта нужно использовать ServerChangeScene с объектами, установленными в DoNotDestroyOnLoad. Однако необходимо убедиться, что только сервер запускает этот метод, когда он обнаруживает запрос на изменение карты через SyncVar (в чем-то вроде сценария диспетчера сцен). Короче говоря, у меня это работает сейчас, но это не так просто, как показано в документе. - person Rogod; 31.01.2017
comment
@Rogod AH.., это проблема, с которой я сталкиваюсь последние пару дней. Вы правильно сказали, объекты networkidentiy не загружаются с моим кодом. Как мне это исправить? stackoverflow.com/questions/41909305 / - person Muhammad Faizan Khan; 01.02.2017
comment
Вместо этого мне пришлось прибегнуть к использованию ServerChangeScene, поскольку я не мог найти способ загрузить объекты с NetworkIdentity. В настоящее время я просто устанавливаю все, что хочу, как DoNotDestroyOnLoad и использую ServerChangeScene. - person Rogod; 03.02.2017
comment
Но serveChangeseve полностью заменит сцену. Я ищу аддитивную загрузку сцены - person Muhammad Faizan Khan; 06.02.2017
comment
Единственный способ добиться этого — установить DoNotDestroyOnLoad и использовать ServerChangeScene. - Использование вышеуказанного метода позволяет аддитивно загружать только несетевые объекты. - person Rogod; 08.02.2017