Netcode сессионки

Общие вопросы о Unity3D

Netcode сессионки

Сообщение Saltant 31 июл 2023, 23:44

Увидел недавно что Netcode for GameObjects все же релизнулся и я решил попробовать создать че нить, в итоге хайповые темы щас это сессионки, вот думаю создам че нить типа лобби где стартуют подключенные к серверу игроки, дальше кто там хочет встает в очередь на поиск матча, собсна матчмейкер собирает команду и вот тут начинается у меня затык... А собсна че дальше то?

Я полагаю нужно на сервере подгрузить сцену игрового уровня как Additive, взять сущности игроков (их playerPrefab из лобби) и закинуть через SceneManager.MoveGameObjectToScene переместить на эту сцену. Ну допустим, задача не сложная, а вот как игрокам переместиться на своих компутерах? Допустим после создания сцены и перетаскивания сущностей из лобби, я посылаю клиентское RPC всем участникам которые должны играть этот матч, что должно быть в этом RPC?

Если я просто попрошу их загрузить нужную сцену SceneManager.LoadScene то вываливаются ошибки что локальный игрок не может уничтожать NetworkObject (т.е например уже созданную сущность игрока, playerPrefab).
В общем логика становится мне не понятной, как чё куда, если речь идет о сессионных играх, где есть один авторитарный сервер и остальные клиенты подключаемые к нему.
У кого есть какие идеи, или может кто что то такое уже делал, на Netcode или каком нибудь Mirror/MLAPI/HLAPI и т.п "юнеты".
Я на Google Play _https://play.google.com/store/apps/developer?id=Saltant
Аватара пользователя
Saltant
Адепт
 
Сообщения: 2236
Зарегистрирован: 09 окт 2018, 16:40
Откуда: Химки
  • Сайт

Re: Netcode сессионки

Сообщение Saltant 01 авг 2023, 10:23

Спросил я тут свой вопрос у чат бота, вот че он мне ответил:
Для вашей задачи реализации сессионной игры с использованием Netcode for GameObjects, я бы посоветовал следующий подход:

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

Синхронизация состояний: Используйте функциональность Netcode for GameObjects для синхронизации состояний между клиентами и сервером. Например, вы можете отправить RPC от сервера ко всем клиентам для передачи стартовых данных и конфигурации игры.

Спавн игроков: После получения данных о старте игры, каждый клиент может создать свой собственный игровой объект игрока, используя playerPrefab из лобби. При создании игрока на клиенте используйте функцию NetworkManager.Spawn() для синхронизации создания игрового объекта между клиентами и сервером.

Управление игровыми объектами: В случае, если локальные игроки должны иметь возможность уничтожать свои игровые объекты, вы можете отправить RPC от клиента к серверу, чтобы сервер вызвал функцию Destroy() для соответствующего игрового объекта. Затем сервер может отправить сообщение об удалении объекта всем клиентам, чтобы они также уничтожили свои экземпляры объектов.

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


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

Но у меня сомнения этож если будет допустим онлайн 1000 чел которые "внезапно" тыкнут в матчмейкер но над будет запустить 500 экземпляров сервера... В сервере у меня доступно всего 192гб (из них реально доступно 170гб) это получается сервак сможет обработать только 1700 серваков (сейчас билд занимает 100мб в памяти) а это 3400 игроков (при условии матча 1х1). С одной стороны это вроде и не мало, но с другой стороны, с точки зрения масштабируемости как то жирно по деньгам (если еще один сервак покупать с 170гб оперативы к примеру).
Я на Google Play _https://play.google.com/store/apps/developer?id=Saltant
Аватара пользователя
Saltant
Адепт
 
Сообщения: 2236
Зарегистрирован: 09 окт 2018, 16:40
Откуда: Химки
  • Сайт

Re: Netcode сессионки

Сообщение Alkos26Rus 01 авг 2023, 13:36

Saltant писал(а):Если я просто попрошу их загрузить нужную сцену SceneManager.LoadScene то вываливаются ошибки что локальный игрок не может уничтожать NetworkObject (т.е например уже созданную сущность игрока, playerPrefab).

DontDestroyOnLoad наверно нужно юзать если объект не принадлежит клиенту.

Saltant писал(а):Но у меня сомнения этож если будет допустим онлайн 1000 чел которые "внезапно" тыкнут в матчмейкер но над будет запустить 500 экземпляров сервера

Да нет, проверка же должна быть, если сессия существует то присоединение к ней, если не существует или все полные - создается новая. Ну из за пинга может 2-3 создадутся пустые, а так в целом должны наполняться уже существующие.
Аватара пользователя
Alkos26Rus
Адепт
 
Сообщения: 1642
Зарегистрирован: 26 ноя 2020, 17:52
Откуда: Москва

Re: Netcode сессионки

Сообщение Saltant 01 авг 2023, 13:45

Alkos26Rus писал(а):
Saltant писал(а):Если я просто попрошу их загрузить нужную сцену SceneManager.LoadScene то вываливаются ошибки что локальный игрок не может уничтожать NetworkObject (т.е например уже созданную сущность игрока, playerPrefab).

DontDestroyOnLoad наверно нужно юзать если объект не принадлежит клиенту.

Saltant писал(а):Но у меня сомнения этож если будет допустим онлайн 1000 чел которые "внезапно" тыкнут в матчмейкер но над будет запустить 500 экземпляров сервера

Да нет, проверка же должна быть, если сессия существует то присоединение к ней, если не существует или все полные - создается новая. Ну из за пинга может 2-3 создадутся пустые, а так в целом должны наполняться уже существующие.

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

Что касаемо варианта с сессиями в виде гейм рум сцен на серваке, я кажется так на Mirror делал, там можно было отнаследоваться от их NetworkManager и оверрайдить логику всего мероприятия. А вот Netcode такого функционала не предоставляет, ну конечно вкорячить то можно самому что угодно, но "из коробки" такой фичи нет, там у них свой менеджер и теперь свой сценменеджер (NetworkSceneManager) который и занимается всей этой синхронизацией.

Я так понимаю (по исследованию их тестового проекта BossRoom) что юнити нацелена как раз на вариант серверной архитектуры который бот предлагает мне, т.е 1 инстанс = 1 игровая сессия, также юнитеки свои network сервисы продвигают собсна для хостинга всего этого мероприятия.

Буду дополнять темку эту, если че изобрету или какие вопросы появятся или будет чем поделиться для истории интернета.
Я на Google Play _https://play.google.com/store/apps/developer?id=Saltant
Аватара пользователя
Saltant
Адепт
 
Сообщения: 2236
Зарегистрирован: 09 окт 2018, 16:40
Откуда: Химки
  • Сайт

Re: Netcode сессионки

Сообщение skroliks 23 ноя 2023, 10:56

Saltant писал(а):
Alkos26Rus писал(а):
Saltant писал(а):Если я просто попрошу их загрузить нужную сцену SceneManager.LoadScene то вываливаются ошибки что локальный игрок не может уничтожать NetworkObject (т.е например уже созданную сущность игрока, playerPrefab).

DontDestroyOnLoad наверно нужно юзать если объект не принадлежит клиенту.

Saltant писал(а):Но у меня сомнения этож если будет допустим онлайн 1000 чел которые "внезапно" тыкнут в матчмейкер но над будет запустить 500 экземпляров сервера

Да нет, проверка же должна быть, если сессия существует то присоединение к ней, если не существует или все полные - создается новая. Ну из за пинга может 2-3 создадутся пустые, а так в целом должны наполняться уже существующие.

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

Что касаемо варианта с сессиями в виде гейм рум сцен на серваке, я кажется так на Mirror делал, там можно было отнаследоваться от их NetworkManager и оверрайдить логику всего мероприятия. А вот Netcode такого функционала не предоставляет, ну конечно вкорячить то можно самому что угодно, но "из коробки" такой фичи нет, там у них свой менеджер и теперь свой сценменеджер (NetworkSceneManager) который и занимается всей этой синхронизацией.

Я так понимаю (по исследованию их тестового проекта BossRoom) что юнити нацелена как раз на вариант серверной архитектуры который бот предлагает мне, т.е 1 инстанс = 1 игровая сессия, также юнитеки свои network сервисы продвигают собсна для хостинга всего этого мероприятия.

Буду дополнять темку эту, если че изобрету или какие вопросы появятся или будет чем поделиться для истории интернета.


Поясните, пожалуйста, мне темному - если я использую этот плагин (или как там его правильно назвать) от Unity - Netcode for Gameobjects в своей игре, я смогу дальше использовать его как подключив к тому же Multiplay хостингу от Unity или же использовать свой хостинг/сервер - это не будет иметь значения и весь код будет работать не зависимо что я использую в качестве сервера? Я правильно понимаю, что можно точно так же использовать решение от Photon или Mirror - это все что-то типа "кодовой базы/библиотеки", а подключать в роли сервера можно что угодно?
skroliks
UNIт
 
Сообщения: 60
Зарегистрирован: 10 сен 2022, 13:30

Re: Netcode сессионки

Сообщение Saltant 23 ноя 2023, 16:07

skroliks писал(а):Поясните, пожалуйста, мне темному - если я использую этот плагин (или как там его правильно назвать) от Unity - Netcode for Gameobjects в своей игре, я смогу дальше использовать его как подключив к тому же Multiplay хостингу от Unity или же использовать свой хостинг/сервер - это не будет иметь значения и весь код будет работать не зависимо что я использую в качестве сервера? Я правильно понимаю, что можно точно так же использовать решение от Photon или Mirror - это все что-то типа "кодовой базы/библиотеки", а подключать в роли сервера можно что угодно?

Думаю все будет работать,но я не использую ничего облачного или же хостинг юнити, у меня свои сервера в дата центре, а на них всё развернул.
Saltant писал(а):Буду дополнять темку эту, если че изобрету или какие вопросы появятся или будет чем поделиться для истории интернета.

Раз уж апнули тему, дополню - предложенный варик ботом, сработал отлично, каждая сессия = новый экземпляр. Игра в 2024 году будет уже в Steam, страничку регнул там уже, но пока не открывал в паблик, в Q1 думаю будет ЗБТ, но это уже наверно в Кузне че нить создам для желающих потыкать мультиплеер. Пока что идет найм в команду дополнительных 3д моделеров, сейчас двое трудятся, но рук мало, а моделей нужно запилить еще много :)

Я на Google Play _https://play.google.com/store/apps/developer?id=Saltant
Аватара пользователя
Saltant
Адепт
 
Сообщения: 2236
Зарегистрирован: 09 окт 2018, 16:40
Откуда: Химки
  • Сайт

Re: Netcode сессионки

Сообщение skroliks 24 ноя 2023, 09:41

Saltant писал(а):Думаю все будет работать,но я не использую ничего облачного или же хостинг юнити, у меня свои сервера в дата центре, а на них всё развернул.


Вот тут тогда сразу два вопроса: Вы для подключения к своему серверу использовали решение Unity (я про Netcode for gameobjects) или писали что-то отдельно? И второй вопрос: на сколько сложно подключить свой сервер? - есть у Юнити готовое решение или надо искать рыть как это делать все самому? Я вроде в процессе поиска информации встречал что-то типа готового решения от Юнити еще для ихнего Unet (или что-то под Mirror, точно уже не помню), но по ссылке инфы уже нет (т.к. и Юнета уже фактически нет) - или то я что-то не то нарыл?
skroliks
UNIт
 
Сообщения: 60
Зарегистрирован: 10 сен 2022, 13:30

Re: Netcode сессионки

Сообщение Saltant 24 ноя 2023, 11:45

skroliks писал(а):
Saltant писал(а):Думаю все будет работать,но я не использую ничего облачного или же хостинг юнити, у меня свои сервера в дата центре, а на них всё развернул.


Вот тут тогда сразу два вопроса: Вы для подключения к своему серверу использовали решение Unity (я про Netcode for gameobjects) или писали что-то отдельно? И второй вопрос: на сколько сложно подключить свой сервер? - есть у Юнити готовое решение или надо искать рыть как это делать все самому? Я вроде в процессе поиска информации встречал что-то типа готового решения от Юнити еще для ихнего Unet (или что-то под Mirror, точно уже не помню), но по ссылке инфы уже нет (т.к. и Юнета уже фактически нет) - или то я что-то не то нарыл?

NetCode предоставляет клиент-серверное решение. Работает все по тому же принципу что и Unet, т.е грубо говоря есть методы StartServer, StartClient или StartHost (где запустивший так экземпляр одновременно является и клиентом и сервером).
По этому если брать чисто игровую логику, ничего дополнительного не нужно, размещаешь на удаленном сервере экземпляр билда юнити где запускается netcode как StartServer а клиенты подключаются к нему как StartClient указав все нужные для этого данные типа айпи порта и секретной фразы если она установлена.

Вся информация тут: https://unity.com/ru/products/netcode
Полный видеогайд тут:
Я на Google Play _https://play.google.com/store/apps/developer?id=Saltant
Аватара пользователя
Saltant
Адепт
 
Сообщения: 2236
Зарегистрирован: 09 окт 2018, 16:40
Откуда: Химки
  • Сайт


Вернуться в Общие вопросы

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9