Как исправить баг смещения игрока на платформе?

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

Как исправить баг смещения игрока на платформе?

Сообщение EIvanov 29 янв 2024, 00:10

2D игра платформер. У меня есть движущаяся платформа. Платформа движется справа на лево, доходит до определенной точки, и потом движется назад (слева на право).
Всё, как в обычном платформере.

И у меня есть игрок.
Передвижение платформы и игрока сделано с помощью velocity.
У игрока и у платформы есть твердое тело. У игрока оно dynamic, у платформы kinematic.

Код написан по ролику с ютуба (не судите за архитектуру, мне самому она не нравится).
Общий смысл кода такой - когда игрок встает на платформу, скрипт игрока получает ссылку на твердое тело платформы.

В кода игрока, из ссылки на твердое тело платформы получаем её velocity и если игрок на платформе складываем velocity игрока и velocity платформы.
Итого, создается иллюзия, что игрок стоит на движущейся платформе, едет вместе с ней.
И всё работает.

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

Вот часть кода игрока
Синтаксис:
Используется csharp
private void FixedUpdate()
{
if (PlayerIsOnPlatform == true)
 
{
 
// Add the velocity of the player and velocity of the platform, to create the effect of a player riding on a platform.
// platformRigidbody2D - we get from the platform code, when the player enters the platform collider.
float platformSpeed = platformRigidbody2D.velocity.y;
float verticalMovement = platformRigidbody2D.gravityScale > 0 ? platformSpeed : -platformSpeed;
playerRigidbody2D.velocity = new Vector2((horizontalInput * playerRunSpeed) + platformRigidbody2D.velocity.x, verticalMovement);
}
else
{
// Simple player movement on the ground
playerRigidbody2D.velocity = new Vector2(horizontalInput * playerRunSpeed, playerRigidbody2D.velocity.y);
}
}


Вот часть кода платформы
Синтаксис:
Используется csharp
private void Start()
{
targetPosition = positionB.position;
DirectionCalculate();
}
 
 
// There may be a bug in this method, a movement inconsistency
private void FixedUpdate()
{
 
// Задаем движение платформе.
platformRigidbody2D.velocity = platformMoveDirection * platformSpeed;
 
// Изменяем направление движения платформы на противоположное, если она находится близко к точке слева или справа.
if (Vector2.Distance(transform.position, positionA.position) < 0.05f)
{
targetPosition = positionB.position;
DirectionCalculate();
}
 
else if (Vector2.Distance(transform.position, positionB.position) < 0.05f)
{
targetPosition = positionA.position;
DirectionCalculate();
}
}
 
 
 
private void DirectionCalculate()
{
platformMoveDirection = (targetPosition - transform.position).normalized;
}
 
 
private void OnTriggerEnter2D(Collider2D collision)
{
 
if (collision.gameObject.CompareTag("PlayerGroundCheck"))
{
// Возможно, игрока не нужно делать частью платформы.
player.transform.SetParent(transform);
playerController.PlatformRigidbody2D = platformRigidbody2D;
playerController.PlayerIsOnPlatform = true;
}
}
 
 
private void OnTriggerExit2D(Collider2D collision)
{
if (collision.gameObject.CompareTag("PlayerGroundCheck"))
{
player.transform.SetParent(null);
playerController.PlayerIsOnPlatform = false;
}
}


Как это исправить, чтобы игрок никуда не смещался?
EIvanov
UNIт
 
Сообщения: 103
Зарегистрирован: 05 июл 2021, 17:23

Re: Как исправить баг смещения игрока на платформе?

Сообщение EIvanov 31 янв 2024, 05:40

Сделал дебаг. Скорость игрока и платформы равны. До и после изменения направления движения.
Изображение

А игрок всё равно смещается, при изменении направления движения платформы.
EIvanov
UNIт
 
Сообщения: 103
Зарегистрирован: 05 июл 2021, 17:23

Re: Как исправить баг смещения игрока на платформе?

Сообщение Alkos26Rus 31 янв 2024, 11:01

// Возможно, игрока не нужно делать частью платформы.
player.transform.SetParent(transform);


Это пробовал убирать?
Аватара пользователя
Alkos26Rus
Адепт
 
Сообщения: 1642
Зарегистрирован: 26 ноя 2020, 17:52
Откуда: Москва

Re: Как исправить баг смещения игрока на платформе?

Сообщение EIvanov 31 янв 2024, 11:29

Alkos26Rus писал(а):
// Возможно, игрока не нужно делать частью платформы.
player.transform.SetParent(transform);


Это пробовал убирать?

Да. Не помогает.
Не понимаю в чем дело. Уже и дебаг сделал.
Думал, что скорость некорректно применяется во время смены движения, но в дебаге всё нормально. Скорости равны.
Причем игрок нормально стоит и перемещается по платформе, когда она движется в любую сторону. И только в момент смены направления движения платформы, игрок, как будто по инерции, чуть смещается.
Код вроде элементарный. Тестирую на отдельной сцене (без каких либо скриптов). У игрока в коде нет больше ничего, что его может сместить.
EIvanov
UNIт
 
Сообщения: 103
Зарегистрирован: 05 июл 2021, 17:23

Re: Как исправить баг смещения игрока на платформе?

Сообщение Alkos26Rus 31 янв 2024, 15:01

Попробуй ставить IsKinematic игроку когда он становиться на платформу
Аватара пользователя
Alkos26Rus
Адепт
 
Сообщения: 1642
Зарегистрирован: 26 ноя 2020, 17:52
Откуда: Москва


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

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

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