Как сделать отскок персонажа от стены?

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

Как сделать отскок персонажа от стены?

Сообщение EIvanov 29 ноя 2023, 18:23

Как сделать отскок персонажа от стены?

Вот пример, как бы хотелось это сделать. Поворот спрайта не нужен, просто чтобы отскакивал.
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 работает, но это не то что надо.
EIvanov
UNIт
 
Сообщения: 103
Зарегистрирован: 05 июл 2021, 17:23

Re: Как сделать отскок персонажа от стены?

Сообщение Alkos26Rus 29 ноя 2023, 18:52

EIvanov писал(а):У стены есть RigidBody2D=Static

У стены вообще не должно быть RigidBody

EIvanov писал(а):rb.AddForce(forceDirection * wallForce, ForceMode2D.Impulse);

AddForce добавляет силу, не факт что будет изменение траектории движения, обычно саму velocity переназначают
Аватара пользователя
Alkos26Rus
Адепт
 
Сообщения: 1642
Зарегистрирован: 26 ноя 2020, 17:52
Откуда: Москва

Re: Как сделать отскок персонажа от стены?

Сообщение EIvanov 29 ноя 2023, 20:30

Alkos26Rus писал(а):У стены вообще не должно быть RigidBody

У стены тайлмеп коллайдер. У него галка - используемый композит коллайдером. У объекта с композит коллайдером есть RigidBody с типом статик.

Alkos26Rus писал(а):AddForce добавляет силу, не факт что будет изменение траектории движения, обычно саму velocity переназначают

Спасибо, кое как разобрался. Результат, конечно, посредственный, но работает.
Синтаксис:
Используется csharp
Vector2 forceDirection = new Vector2(-1, 3);
rb.velocity = forceDirection *5;
 
EIvanov
UNIт
 
Сообщения: 103
Зарегистрирован: 05 июл 2021, 17:23


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

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

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