Войти
ПрограммированиеФорумСеть

Unity. Работа с сетью.

#0
11:34, 3 сен. 2018

Всем доброго времени суток!

Использую последнюю версию Unity 2018.2.6.f1. Ничего не разрабатываю, просто учусь. И интересует меня сетевая составляющая. Посмотрев на YouTube'е курс уроков по работе с сетью в Unity, решил создать тестовый пример. Ну и с периодическим чтением официальной документации, всё таки получилось сделать тестовый сетевой проект и опробовать его в деле. Для всего этого использовал компонент NetworkManager. В общем-то если всё делать в рамках одной сцены, то вопросов у меня (по крайней мере пока) нет.


Хотя один момент интересен. У компонента NetworkTransform есть разные режимы синхронизации. Если использовать режим Sync Transform, то есть синхронизация по компоненту Transform, то нам предоставляется поле Interpolate Movement. Однако это никак не сглаживает перемещение объекта - всё дёргается. Зачем тогда это свойство? Пришлось использовать компонент Rigidbody и метод синхронизации Sync Rigidbody 3D, хотя физика мне не нужна была.


Но мне интересна другая ситуация, давайте возьмём игру Might & Magic Heroes VII. Попытаюсь сопоставить техническую часть этой игры с Unity в рамках сети. Когда игроки подключились и загружена игровая карта, то это одна сцена. В Might & Magic Heroes VII всё устроено таким образом, что когда хоть какой-то игрок начинает сражение, то вне зависимости от того являются другие игроки ему союзниками или врагами, они все переходят в эту битву для просмотра (для них скрывают количество юнитов в отряде). И это хорошо сопоставимо с Unity, достаточно вызвать у компонента NetworkManager метод ServerChangeScene() и все подключённые клиенты перейдут в нужную сцену. Но что если я не хочу чтобы все видели этот бой?! В игре есть параллельные ходы. Почему бы не давать игрокам возможность одновременно и сражаться?! И вполне было бы не плохо, если игроки в союзе могут спокойно войти и посмотреть как сражается их союзник, в любой момент завершить просмотр и заниматься своими делами (да хоть свой бой провести). И всё это возможным я вижу через реализацию всего этого как одной сцены. Но если в игре 8 игроков и каждый начал бой (да и не все они в союзе), зачем у каждого клиента на сцене будет происходить то, что ему не нужно?! И как можно было бы добиться такого "идеала" средствами Unity? Получится ли отдельных клиентов в отдельные сцены пихать? Знаю что в Unity можно создавать сцены на лету, можно одновременно устанавливать несколько сцен. В официальной документации сказано что при необходимости можно на каждую сцену вешать отдельный NetworkManager (но не особо понимаю как это может помочь, это же, видимо, кучу портов ещё резервировать нужно).


Интересно ещё, что Might & Magic Heroes VII написана на Unreal Engine (наверное 4-ой версии). А я так подозревая что там сетевая структура может быть похожа на сетевую структуру в Unity. Да и не суть важно. Интересно почему я не смог с другом ни одну игру закончить по сети. Всегда одно и тоже: РАССИНХРОНИЗАЦИЯ. Я играл в Fortnite, я играл в Unreal Tournament, у меня не было никогда таких проблем. Разработчики Might & Magic Heroes VII писали свою реализацию сети, или что? И вообще, откуда рассинхронизация, что мешает спокойно всё обрабатывать (пошаговая же игра, я могу ждать)? Для меня это загадка.


Ну и собственно, как в Unity добиться "свободы" для игроков что я описал выше?


#1
12:24, 3 сен. 2018
+ Некогда объяснять, используй фотон

А по делу: встроенные NetworkTransform и подобные — чисто для прототипирования. Более того, даже волшебный SyncVar зачастую лучше переписать на ручную сериализацию.
А если от всего UNet'а использовать только NetworkIdentity, то уже и не возникает вопросов, что ты выше написал: берешь и делаешь :)

#2
9:38, 25 сен. 2018

Движковые сети зло.

Фотон тоже зло.

Используй сокеты и обычные пакеты.

PS: тушите пуканы.

ПрограммированиеФорумСеть

Тема в архиве.