Как сделать нормальный рикошет?

Программирование на Юнити.

Как сделать нормальный рикошет?

Сообщение Sarcasop 31 окт 2019, 00:46

Суть в том, что мне необходимо реализовать рикошет шара. Хочу сделать это без помощи Rigidbody. Пробую сейчас сделать через Raycast. Рикошет действительно получается, но в том случае, если шар выпускаю из координат (0, y), y - любое. В случае, если x отличный от нуля, то рикошет идёт по непонятной мне траектории. Что можете посоветовать? Ниже участок кода с самим рикошетом.
Синтаксис:
Используется csharp
if (Input.GetKey(KeyCode.Space))
        {
            _direction = transform.up;
        }

        transform.Translate(transform.TransformDirection(_direction) * Time.deltaTime * _speed);
        LayerMask _mask = LayerMask.GetMask("Wall");
        if (Physics2D.Raycast(transform.position, _direction, .5f, _mask))
        {
            GameObject _tempo;
            _tempo = Instantiate(_forInstantiate, transform.position, _forInstantiate.transform.rotation); //_forInstantiate необходим для определения перпендикуляра для метода Reflect
            _direction = transform.TransformDirection(Vector2.Reflect(transform.position, _tempo.transform.right).normalized);
            Destroy(_tempo.gameObject, .1f);
        }
 
Sarcasop
UNец
 
Сообщения: 14
Зарегистрирован: 31 окт 2019, 00:38

Re: Как сделать нормальный рикошет?

Сообщение 1max1 31 окт 2019, 06:44

Синтаксис:
Используется csharp
Vector2.Reflect(transform.position, _tempo.transform.right)

Ты почитай параметры какие надо https://docs.unity3d.com/ScriptReferenc ... flect.html
Ты в 1 параметр суешь позицию, во второй вообще фиг пойми что... Слышал что такое нормаль плоскости?
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Как сделать нормальный рикошет?

Сообщение Sarcasop 31 окт 2019, 10:30

1max1 писал(а):
Синтаксис:
Используется csharp
Vector2.Reflect(transform.position, _tempo.transform.right)

Ты почитай параметры какие надо https://docs.unity3d.com/ScriptReferenc ... flect.html
Ты в 1 параметр суешь позицию, во второй вообще фиг пойми что... Слышал что такое нормаль плоскости?

Спасибо за ответ. Да, я слышал про нормаль плоскости. Я не знаю как определить нормаль плоскости без использования коллизий. Поэтому решил сделать по другому. Я во время соприкосновения со стеной, от которой должен быть рикошет, я создаю пустой объект и как второй параметр передаю _tempo.transform.right, так как посчитал что этот вектор можно считать перпендикуляром. Безусловно, скорее всего я не прав, не могли бы Вы подсказать как правильно вычислить нормаль плоскости?
Sarcasop
UNец
 
Сообщения: 14
Зарегистрирован: 31 окт 2019, 00:38

Re: Как сделать нормальный рикошет?

Сообщение 1max1 31 окт 2019, 10:39

У рейкаста есть перегруженный метод https://docs.unity3d.com/ScriptReferenc ... ycast.html
Он возвращает это https://docs.unity3d.com/ScriptReferenc ... Hit2D.html
У этого есть поле https://docs.unity3d.com/ScriptReferenc ... ormal.html
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Как сделать нормальный рикошет?

Сообщение Sarcasop 31 окт 2019, 13:04

Реализовал как Вы и писали, но проблема не изменилась, все также он рикошетит по странной траектории если x - отличный от нуля.
Синтаксис:
Используется csharp
transform.Translate(_direction * Time.deltaTime * _speed);
        LayerMask _mask = LayerMask.GetMask("Wall");
       
        RaycastHit2D hit = Physics2D.Raycast(transform.position, _direction, .5f, _mask);
        if (hit && isActive)
        {
            _direction = Vector2.Reflect(transform.position, hit.normal).normalized;
        }
 
Sarcasop
UNец
 
Сообщения: 14
Зарегистрирован: 31 окт 2019, 00:38

Re: Как сделать нормальный рикошет?

Сообщение Sarcasop 31 окт 2019, 13:08

Вопрос снят, невнимательно прочитал Ваше первое сообщение. Спасибо большое за помощь. Вот рабочий код:
Синтаксис:
Используется csharp
transform.Translate(_direction * Time.deltaTime * _speed);
        LayerMask _mask = LayerMask.GetMask("Wall");
        RaycastHit2D hit = Physics2D.Raycast(transform.position, _direction, .5f, _mask);
        if (hit && isActive)
        {
            _direction = Vector2.Reflect(_direction, hit.normal).normalized;
        }
 
Sarcasop
UNец
 
Сообщения: 14
Зарегистрирован: 31 окт 2019, 00:38


Вернуться в Скрипты

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

Сейчас этот форум просматривают: Yandex [Bot] и гости: 13