July 28, 2020

Нашел в Photon очень интересную штуку: Buffered RPC

Photon, к слову, это очень клевый мультиплеерный движок, гораздо более простой и удобный, чем Unet, у которого я использую версию Photon Unity Networking (или, как они его называют, PUN), которая предназначена, как следует из названия, для работы с движком Unity.

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

Вообще, RPC это Remote Procedure Calls, то есть вызовы функций, синхронизирующиеся между инстансами объектов на разных клиентах. С событиями тоже понятно: вызываешь что-то, что происходит у всех подключенных к лобби игрокам.

А как быть, когда, например, на мастер клиенте процедурно генерится данж и остальные должны получить такой же сид? Или просто комната с рандомным индексом из ассетов. Чтобы другие могли подключиться и сразу же сгенерить у себя такие же локации.

Я пытался мастерить свой велосипед, но получалось так себе и тут я наткнулся на Buffered RPC: удобную фичу, позволяющую сохранять в стек вызовы RPC и, когда подключится новый игрок, вся последовательность буферизированных синхронных вызовов произойдет и у него. Таким образом не придется пытаться стучаться до каких-то глобальных синхронных менеджеров или ифать переменными, ведь можно просто заюзать буферизацию для RPC.

А вот описание этой штуки из документации