Извините за большое количество текста, просто описываю всё детально. Код очень простой.
Игра 2D платформер.
Есть движущаяся платформа, на которой стоит игрок. Платформа движется по горизонтали, от точки до дочки (и назад).
Я бы хотел, чтобы игрок двигался вместе с платформой, когда на ней стоит. Всё, как в обычном платформере.
Код ниже написан по ролику с ютуба (не судите за архитектуру, мне самому она не нравится).
Код очень простой - банальное сложение скоростей.
Общий смысл кода такой:
У игрока и у платформы есть твердое тело. У игрока оно типа dynamic, у платформы типа kinematic.
Передвижение платформы и передвижение игрока сделано с помощью velocity, действующее на твердое тело объекта.
Когда игрок встает на платформу, скрипт игрока получает ссылку на твердое тело платформы.
Скрипт игрока использует ссылку на твердое тело платформы и получает velocity платформы.
Скрипт игрока складывает velocity игрока и velocity платформы, когда игрок стоит на платформе.
Итого, создается иллюзия, что игрок стоит на движущейся платформе, едет вместе с ней.
И всё работает.
Но когда платформа меняет направление - дошла до точки и начинает движение в другую сторону, игрок как бы проскальзывает на платформе, незначительно смещается по инерции в направлении предыдущего движения.
Например - платформа едет слева на право и меняет направление движения на противоположное. В момент смены движения игрок незначительно сместится слева на право, как будто есть инерция.
Это как при резкой остановке машины, пассажир смещается вперед, по ходу движения.
Вот часть кода игрока
private void FixedUpdate()
{
// Если игрок стоит на платформе
if (PlayerIsOnPlatform == true)
{
// Получили скорость платформы из ссылки на её твердое тело
playerRigidbody2D.velocity = new Vector2((horizontalInput * playerRunSpeed) + platformRigidbody2D.velocity.x, playerRigidbody2D.velocity.y);
}
else
{
// Если игрок не на платформе
playerRigidbody2D.velocity = new Vector2(horizontalInput * playerRunSpeed, playerRigidbody2D.velocity.y);
}
}
Вот часть кода платформы
// Начальный расчет куда двигаться платформе.
private void Start()
{
targetPosition = positionB.position;
DirectionCalculate();
}
// Возможно, в этом методе есть логическая ошибка
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)
{
// Игрок (его элемент PlayerGroundCheck) встал на платформу (проверено - игрок стоит на платформе)
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;
}
}
И всё работает - игрок движется вместе с платформой, когда на ней стоит. Но, как только платформа меняет движение на противоположное - игрок незначительно смещается в направлении предыдущего движения (не успела применится новая скорость?).
UPD
Сделал дебаг. Скорость игрока и платформы равны. До и после изменения направления движения.
Как исправить смещение игрока на движущейся платформе?