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

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

Сообщение IvanSS 09 авг 2020, 23:16

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

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


Очень жду решение :-ss
IvanSS
UNец
 
Сообщения: 5
Зарегистрирован: 09 авг 2020, 22:48

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

Сообщение Jarico 10 авг 2020, 08:58

Интерполяцию добавь
VK: _ttp://vk.com/salavan73
VK Group: _https://vk.com/salavan_dev
Discord: Майор Доигралес#9382
RakNet Unity: _https://www.youtube.com/channel/UCPQ04Xpbbw2uGc1gsZtO3HQ
RakNet Github: _https://github.com/ep1s0de3/RakNet_Networking
Аватара пользователя
Jarico
Старожил
 
Сообщения: 794
Зарегистрирован: 06 янв 2019, 17:37
Откуда: 0xDEAD
Skype: none
  • Сайт

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

Сообщение IvanSS 10 авг 2020, 17:12

Jarico писал(а):Интерполяцию добавь


Можете подсказать как для мяча её добавить? Для игроков я её делал, но тут я без понятия
IvanSS
UNец
 
Сообщения: 5
Зарегистрирован: 09 авг 2020, 22:48

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

Сообщение Jarico 11 авг 2020, 09:18

IvanSS писал(а):
Jarico писал(а):Интерполяцию добавь


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

Теперь узнавай что такое интерполяция и экстраполяция
Последний раз редактировалось Jarico 11 авг 2020, 10:13, всего редактировалось 1 раз.
VK: _ttp://vk.com/salavan73
VK Group: _https://vk.com/salavan_dev
Discord: Майор Доигралес#9382
RakNet Unity: _https://www.youtube.com/channel/UCPQ04Xpbbw2uGc1gsZtO3HQ
RakNet Github: _https://github.com/ep1s0de3/RakNet_Networking
Аватара пользователя
Jarico
Старожил
 
Сообщения: 794
Зарегистрирован: 06 янв 2019, 17:37
Откуда: 0xDEAD
Skype: none
  • Сайт

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

Сообщение IDoNotExist 11 авг 2020, 09:24

Боюсь что интерполяция мало поможет, проблема то в другом, для Rigidbody хозяином является мастер - клиент, соответственно с другими игроками будет синхронизироваться только то, что происходит на мастер - клиенте, соответственно ты у себя на клиенте хоть пинай этот мяч, хоть запинайся, эталонной позицией для синхронизации один фиг будет позиция на мастер-клиенте и он всегда будет стремиться в неё вернуться. Простой вариант - НЕ на мастере попробуй отключи коллизии между игроком и мячом, тогда коллизии между ними будут только на мастере, с мастера он будет всегда получать актуальную позицию и его не будет так трясти.
Аватара пользователя
IDoNotExist
Адепт
 
Сообщения: 1430
Зарегистрирован: 23 мар 2011, 09:18
Skype: iamnoexist

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

Сообщение Jarico 11 авг 2020, 10:13

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


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

Пример:

Интервал отправки данных от мастера = 0,2
1. Пнули мячик на игроке (не мастер), мячик полетел и в момент удара как-то сообщаем мастеру (посредством RPC) что пнули мяч с такими-то параметрами: ускорение, углы вращения и т.д., можно указать просто направление удара а параметры удара будут в отдельном ScriptableObject'е (параметры удара могут быть общими как для мастера так и для клиента и незачем отправлять лишние данные)
2. Мастер принял RPC, применил полученные данные к мячу и через 0,2 секунды отправляет игроку текущее состояние мяча
3. Игрок принимает RPC от мастера и т.к. игрок уже пнул мяч и физика сделала своё дело тут уже проверяем дистанцию мяча игрока с мячом мастера, если есть разница то двигаем мячик к последней позиции мастера
VK: _ttp://vk.com/salavan73
VK Group: _https://vk.com/salavan_dev
Discord: Майор Доигралес#9382
RakNet Unity: _https://www.youtube.com/channel/UCPQ04Xpbbw2uGc1gsZtO3HQ
RakNet Github: _https://github.com/ep1s0de3/RakNet_Networking
Аватара пользователя
Jarico
Старожил
 
Сообщения: 794
Зарегистрирован: 06 янв 2019, 17:37
Откуда: 0xDEAD
Skype: none
  • Сайт

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

Сообщение IvanSS 12 авг 2020, 05:31

Спасибо за ответы, буду пробовать :-?
IvanSS
UNец
 
Сообщения: 5
Зарегистрирован: 09 авг 2020, 22:48

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

Сообщение IvanSS 30 авг 2020, 06:30

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


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

Пример:

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


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

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

Сообщение Jarico 30 авг 2020, 09:41

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


Это интервал отправки данных между игроками, 0.2 это примерное значение может быть и другое
VK: _ttp://vk.com/salavan73
VK Group: _https://vk.com/salavan_dev
Discord: Майор Доигралес#9382
RakNet Unity: _https://www.youtube.com/channel/UCPQ04Xpbbw2uGc1gsZtO3HQ
RakNet Github: _https://github.com/ep1s0de3/RakNet_Networking
Аватара пользователя
Jarico
Старожил
 
Сообщения: 794
Зарегистрирован: 06 янв 2019, 17:37
Откуда: 0xDEAD
Skype: none
  • Сайт

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

Сообщение IvanSS 31 авг 2020, 05:19

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


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


А как обеспечить этот самый интервал? Как в скрипте сделать эту паузу в 0,2? Или просто не понимаю
IvanSS
UNец
 
Сообщения: 5
Зарегистрирован: 09 авг 2020, 22:48

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

Сообщение Jarico 31 авг 2020, 13:44

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


Забей, Пункт 2 может пропускать
VK: _ttp://vk.com/salavan73
VK Group: _https://vk.com/salavan_dev
Discord: Майор Доигралес#9382
RakNet Unity: _https://www.youtube.com/channel/UCPQ04Xpbbw2uGc1gsZtO3HQ
RakNet Github: _https://github.com/ep1s0de3/RakNet_Networking
Аватара пользователя
Jarico
Старожил
 
Сообщения: 794
Зарегистрирован: 06 янв 2019, 17:37
Откуда: 0xDEAD
Skype: none
  • Сайт


Вернуться в Photon

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

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