Адаптировать силу Vector3 к направленному Vector3

У меня есть Vector3, который указывает усилие игрока, приложенное к мячу.

Vector3(moveHorizontally, 0.0f, moveVertically);

У меня есть еще один Vector3, который указывает нормализованное направление плоскости

Vector3(-1.0f, 0.0f, 0.0f);

Как я могу заставить мяч следовать за направлением объекта с помощью AddForce ()? В этом случае, я думаю, мяч должен идти налево, а не вперед, если я не ошибаюсь.

РЕДАКТИРОВАТЬ: Мне не нужно двигать мяч вперед в определенном направлении. Каждый раз, когда мяч запускает самолет, направление самолета становится направлением шара. Это игра, в которой мяч катится по нелинейной дорожке с поворотами.


person Trafel    schedule 25.01.2019    source источник
comment
Вам придется больше объяснять и показывать свое окружение. Можете ли вы сделать минимальный воспроизводимый пример детали, которая реализует движение мяча и опору? Тогда мы могли предложить, как реализовать желаемый эффект.   -  person Yunnosch    schedule 25.01.2019
comment
Просто запустите его с помощью коллайдера, прочитайте направление плоскости и передайте направление в качестве параметра в AddForce.   -  person Dave    schedule 25.01.2019


Ответы (2)


Я бы не использовал AddForce, так как я предполагаю, что вы хотите сразу изменить направление при столкновении.

Я думаю, что ты имеешь в виду, что-то вроде

private rigidBody;

private void Awake()
{
    rigidBody = GetComponent<RigidBody>();
}

private void OnCollisionEnter(Collision col)
{
    // Or however you want to check with what you are colliding
    if(col.gameObject.tag != "Plane") return;

    var hitPlane = col.gameObject;
    var invertedPlaneNormal = hitPlane.transform.forward.normalized * -1;

    var currentSpeed = rigidBody.velocity.magnitude;

    // Keep same velocity but change direction immediately
    rigidBody.velocity = invertedPlaneNormal * currentSpeed;
}

вы также можете добавить демпфирование, например

[Range(0,1)]
public float dampFactor;

//...

rigidBody.velocity = invertedPlaneNormal * currentSpeed * (1 - dampFactor);
person derHugo    schedule 25.01.2019

У меня нет конкретного кода, но предполагая, что к мячу прикреплено твердое тело, и и путь, и мяч имеют коллайдеры, вы можете использовать события столкновения Unity, чтобы определить будущее направление мяча.

Скажем, к мячу прикреплен скрипт, и когда он сталкивается, он запускает событие onCollisionEnter, затем оттуда вы можете получить компонент скрипта плоскости, с которой он столкнулся, и применить силу в правильном направлении в качестве ответа на столкновение.

Обратите внимание, что onCollisionEnter возникает только тогда, когда объект входит в коллизию.

person Libor Zachoval    schedule 25.01.2019
comment
Пожалуйста, не размещайте дополнительную информацию в качестве ответов. Если вы хотите расширить свой вопрос дополнительной информацией, отредактируйте его вместо этого и добавьте туда свою информацию - person derHugo; 25.01.2019