Адаптируйте силу Vector3 к направленному Vector3 - PullRequest
0 голосов
/ 25 января 2019

У меня есть Vector3, который указывает на входную силу игрока для мяча

Vector3(moveHorizontally, 0.0f, moveVertically);

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 25 января 2019

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

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

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

0 голосов
/ 25 января 2019

Я бы не использовал 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);
...