Unity - как использовать Vector2.Reflect ()

Я искал везде, включая документацию Unity, но, похоже, не нашел хороших примеров того, как использовать функцию Unity Vector2.Reflect (). Я пытаюсь использовать это, чтобы контролировать направление мяча (в 2D-игре Breakout), когда он ударяется о стену. Требуется 2 аргумента (inDirection, inNormal), но я не могу понять, как это использовать. Любая помощь будет оценена по достоинству.


person Kaz    schedule 13.12.2016    source источник
comment
Согласно параметрам, одно - это направление мяча, а другое - нормаль к стене.   -  person Sami Kuhmonen    schedule 13.12.2016
comment
Почему вы помечаете unity3d в 2D-вопросе?   -  person devRicher    schedule 13.12.2016
comment
Unity3D - это название приложения, которое я использую для создания 2D-игры.   -  person Kaz    schedule 13.12.2016
comment
И если есть какая-то путаница с комментарием Сами, нормаль к стене - это вектор, перпендикулярный поверхности стены.   -  person Serlite    schedule 13.12.2016
comment
Может ли кто-нибудь привести пример с параметрами?   -  person Kaz    schedule 13.12.2016
comment
В настоящее время нет - у нас недостаточно информации о вашей игре (как вы перемещаете мяч, как настроена ваша сцена, какие сценарии подходят), чтобы показать вам, как именно использовать этот метод в вашей ситуации. Однако, прежде чем перейти к этой мысли, мне любопытно - почему вы пытаетесь использовать метод Reflect() вместо того, чтобы просто полагаться на симуляцию физики Unity, чтобы отразить мяч от стены? Программное управление этим, скорее всего, приведет к неожиданному / нереалистичному поведению, которое может нанести ущерб опыту игрока.   -  person Serlite    schedule 13.12.2016
comment
Однако, идя по этому пути, вы, вероятно, будете использовать 2D raycast для получения этой информации. Как именно, нельзя определить без дополнительной информации о том, что вы в настоящее время делаете.   -  person Serlite    schedule 13.12.2016
comment
Когда мяч попадает в ракетку, я использую col.gameObject.GetComponent ‹Rigidbody2D› () .velocity = new Vector2 (-10f, 10f) * GameManager.speed; для перемещения мяча. Я хочу, чтобы при ударе мяча о стену я мог контролировать направление мяча, а не скорость. Я думал, что Vector2.Reflect поможет мне в этом.   -  person Kaz    schedule 14.12.2016
comment
Учитывая эту информацию, ответ Бенджамина кажется правильным - просто убедитесь, что вы установили новую скорость как newVelocity.normalized * GameManager.speed, чтобы сохранить величину вашей скорости на случай, если она будет потеряна. Я немного сомневаюсь, что Reflect() будет вести себя так, как вы ищете, но вы знаете свой проект лучше всего.   -  person Serlite    schedule 14.12.2016


Ответы (2)


введите описание изображения здесь

Vector2 Reflect(Vector2 inDirection, Vector2 inNormal):

inDirection: черная стрелка

inNormal: красная стрелка

return output: зеленая стрелка

person Lincoln Cheng    schedule 14.12.2016

inDirection должен быть скоростью вашего мяча, а inNormal должен быть единичным вектором, перпендикулярным вашей стене.

Попробуйте поместить это в свой шаровой объект:

void OnCollisionEnter(Collision collision)
{
    Vector2D inDirection = GetComponent<RigidBody2D>().velocity;
    Vector2D inNormal = collision.contacts[0].normal;
    Vector2D newVelocity = Vector2D.Reflect(inDirection, inNormal);
}

ПРИМЕЧАНИЕ. В настоящее время я не могу протестировать этот код, поэтому может потребоваться настройка имен вещей.

person Benjamin James Drury    schedule 13.12.2016
comment
Похоже, inNormal должен действительно быть единичным вектором, иначе ваш результат будет испорчен, поскольку Unity применит необработанную формулу без ее нормализации для производительности. - person hsandt; 28.02.2019