Вот пример, как бы хотелось это сделать. Поворот спрайта не нужен, просто чтобы отскакивал.
https://youtu.be/2YWNMzXGd2s?si=PwoFBMeKHrrPAQ-f&t=70
У стены есть RigidBody2D=Static
У игрока RigidBody2D=Dynamic Mass=60 Gravityscale=3.
Вот пример рабочего кода чат гпт.
Синтаксис:
Используется csharp
public float wallForce = 100f; // Сила отталкивания от стены
public int wallAngle = 45; // Угол отталкивания от стены
private void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.CompareTag("Wall"))
{
Debug.Log("Collision2D"); // Да, коллизия происходит.
if (collision.contacts.Length > 0)
{
// Получаем первый контакт
ContactPoint2D contact = collision.contacts[0];
// Вычисляем направление отталкивания
Vector2 reflectDirection = Vector2.Reflect(rb.velocity.normalized, contact.normal).normalized;
// Пересчитываем угол отталкивания
Vector2 forceDirection = Quaternion.Euler(0, 0, wallAngle) * reflectDirection;
// Применяем силу
rb.AddForce(forceDirection * wallForce, ForceMode2D.Impulse);
}
}
}
Проблемы в коде такие:
1) игрок не отскакивает от стены, а движется "вверх по стене", вне зависимости от угла (менял его). При касании стены сила применяется в направлении стены, строго вертикально и игрок касаясь стены, летит вверх по стене.
2) когда у игрока Gravityscale=3 (нужно для механики игры), игрок практически не движется по стене, даже с увеличением силы до 10000f. При Gravityscale=1 движение происходит, согласно силе (но всё так же вверх).
В чем тут проблема? Есть типовой код отскока игрока от стены?
PS
Отскок с помощью материала Bounciness работает, но это не то что надо.