Страница 1 из 1

Синхронизация динамичного объекта сцены с RigidBody

СообщениеДобавлено: 09 авг 2020, 23:16
IvanSS
Добрый день, наткнулся тут на одну проблему. Существует сцена, в которой заранее лежит объект "мяч", туда игроки попадают, к примеру, через быструю игру. Игроки должны толкать мяч, чтобы забить в ворота. И вот тут развязка - мяч адекватно работает только у Мастер Клиента, у других он плохо толкается и вообще передвигается рывками.

На мяч установлены RigidBody2d, колайдер ,PhotonView, PhotonTransformView и PhotonRigidBody2DView, как показано на картинке ниже
Изображение
Вот видео, чтобы было понятно, в чем проблема: https://youtu.be/4jz0XjCbnSE


Очень жду решение :-ss

Re: Синхронизация динамичного объекта сцены с RigidBody

СообщениеДобавлено: 10 авг 2020, 08:58
Jarico
Интерполяцию добавь

Re: Синхронизация динамичного объекта сцены с RigidBody

СообщениеДобавлено: 10 авг 2020, 17:12
IvanSS
Jarico писал(а):Интерполяцию добавь


Можете подсказать как для мяча её добавить? Для игроков я её делал, но тут я без понятия

Re: Синхронизация динамичного объекта сцены с RigidBody

СообщениеДобавлено: 11 авг 2020, 09:18
Jarico
IvanSS писал(а):
Jarico писал(а):Интерполяцию добавь


Можете подсказать как для мяча её добавить? Для игроков я её делал, но тут я без понятия

Теперь узнавай что такое интерполяция и экстраполяция

Re: Синхронизация динамичного объекта сцены с RigidBody

СообщениеДобавлено: 11 авг 2020, 09:24
IDoNotExist
Боюсь что интерполяция мало поможет, проблема то в другом, для Rigidbody хозяином является мастер - клиент, соответственно с другими игроками будет синхронизироваться только то, что происходит на мастер - клиенте, соответственно ты у себя на клиенте хоть пинай этот мяч, хоть запинайся, эталонной позицией для синхронизации один фиг будет позиция на мастер-клиенте и он всегда будет стремиться в неё вернуться. Простой вариант - НЕ на мастере попробуй отключи коллизии между игроком и мячом, тогда коллизии между ними будут только на мастере, с мастера он будет всегда получать актуальную позицию и его не будет так трясти.

Re: Синхронизация динамичного объекта сцены с RigidBody

СообщениеДобавлено: 11 авг 2020, 10:13
Jarico
IDoNotExist писал(а):Боюсь что интерполяция мало поможет, проблема то в другом, для Rigidbody хозяином является мастер - клиент, соответственно с другими игроками будет синхронизироваться только то, что происходит на мастер - клиенте, соответственно ты у себя на клиенте хоть пинай этот мяч, хоть запинайся, эталонной позицией для синхронизации один фиг будет позиция на мастер-клиенте и он всегда будет стремиться в неё вернуться.


Вместо интерполяции внедрить экстраполяцию (симулировать движение на основе последних принятых данных), нужно применять ускорение,угловую скорость,позицию к мячу в момент получения данных от мастера-клиента, и между интервалами получения данных на локальном игроке применять такую же силу удара (применять такие же параметры).
И так получится некое согласование между игроками.

Пример:

Интервал отправки данных от мастера = 0,2
1. Пнули мячик на игроке (не мастер), мячик полетел и в момент удара как-то сообщаем мастеру (посредством RPC) что пнули мяч с такими-то параметрами: ускорение, углы вращения и т.д., можно указать просто направление удара а параметры удара будут в отдельном ScriptableObject'е (параметры удара могут быть общими как для мастера так и для клиента и незачем отправлять лишние данные)
2. Мастер принял RPC, применил полученные данные к мячу и через 0,2 секунды отправляет игроку текущее состояние мяча
3. Игрок принимает RPC от мастера и т.к. игрок уже пнул мяч и физика сделала своё дело тут уже проверяем дистанцию мяча игрока с мячом мастера, если есть разница то двигаем мячик к последней позиции мастера

Re: Синхронизация динамичного объекта сцены с RigidBody

СообщениеДобавлено: 12 авг 2020, 05:31
IvanSS
Спасибо за ответы, буду пробовать :-?

Re: Синхронизация динамичного объекта сцены с RigidBody

СообщениеДобавлено: 30 авг 2020, 06:30
IvanSS
Jarico писал(а):
IDoNotExist писал(а):Боюсь что интерполяция мало поможет, проблема то в другом, для Rigidbody хозяином является мастер - клиент, соответственно с другими игроками будет синхронизироваться только то, что происходит на мастер - клиенте, соответственно ты у себя на клиенте хоть пинай этот мяч, хоть запинайся, эталонной позицией для синхронизации один фиг будет позиция на мастер-клиенте и он всегда будет стремиться в неё вернуться.


Вместо интерполяции внедрить экстраполяцию (симулировать движение на основе последних принятых данных), нужно применять ускорение,угловую скорость,позицию к мячу в момент получения данных от мастера-клиента, и между интервалами получения данных на локальном игроке применять такую же силу удара (применять такие же параметры).
И так получится некое согласование между игроками.

Пример:

Интервал отправки данных от мастера = 0,2
1. Пнули мячик на игроке (не мастер), мячик полетел и в момент удара как-то сообщаем мастеру (посредством RPC) что пнули мяч с такими-то параметрами: ускорение, углы вращения и т.д., можно указать просто направление удара а параметры удара будут в отдельном ScriptableObject'е (параметры удара могут быть общими как для мастера так и для клиента и незачем отправлять лишние данные)
2. Мастер принял RPC, применил полученные данные к мячу и через 0,2 секунды отправляет игроку текущее состояние мяча
3. Игрок принимает RPC от мастера и т.к. игрок уже пнул мяч и физика сделала своё дело тут уже проверяем дистанцию мяча игрока с мячом мастера, если есть разница то двигаем мячик к последней позиции мастера


Я остановился на пункте 2, а конкретнее, где нужно через 0,2 секунды отправить позицию мяча. Не подскажите, каким методом это лучше всего сделать? Все что приходит в голову, так это Thread.Sleep()

Re: Синхронизация динамичного объекта сцены с RigidBody

СообщениеДобавлено: 30 авг 2020, 09:41
Jarico
IvanSS писал(а):Я остановился на пункте 2, а конкретнее, где нужно через 0,2 секунды отправить позицию мяча. Не подскажите, каким методом это лучше всего сделать? Все что приходит в голову, так это Thread.Sleep()


Это интервал отправки данных между игроками, 0.2 это примерное значение может быть и другое

Re: Синхронизация динамичного объекта сцены с RigidBody

СообщениеДобавлено: 31 авг 2020, 05:19
IvanSS
Jarico писал(а):
IvanSS писал(а):Я остановился на пункте 2, а конкретнее, где нужно через 0,2 секунды отправить позицию мяча. Не подскажите, каким методом это лучше всего сделать? Все что приходит в голову, так это Thread.Sleep()


Это интервал отправки данных между игроками, 0.2 это примерное значение может быть и другое


А как обеспечить этот самый интервал? Как в скрипте сделать эту паузу в 0,2? Или просто не понимаю

Re: Синхронизация динамичного объекта сцены с RigidBody

СообщениеДобавлено: 31 авг 2020, 13:44
Jarico
IvanSS писал(а):А как обеспечить этот самый интервал? Как в скрипте сделать эту паузу в 0,2? Или просто не понимаю


Забей, Пункт 2 может пропускать