AddRelativeForce() не добавляет силу относительно

#unity3d

#unity3d

Вопрос:

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

 public GameObject ballPrefab;
GameObject ballInstance;

private float force=15;
Vector3 mouseStart;
Vector3 mouseStop;
float minDragDistance=15f;
float zDepth=20f;

void FixedUpdate()
{
    if (Input.GetMouseButtonDown(0))
    {
        mouseStart = Input.mousePosition;
    }
    if (Input.GetMouseButtonUp(0))
    {
        mouseStop = Input.mousePosition;

        if(Vector3.Distance(mouseStop, mouseStart) > minDragDistance)
        {
            //Here I am getting the position on screen coordinates to throw the rigidbody to                
            Vector3 hitPos = new Vector3(Input.mousePosition.x, Input.mousePosition.y, zDepth);

            //I transform screen coordinates to world coordinates
            Vector3 hitPoss = Camera.main.ScreenToWorldPoint(hitPos);
            //transforming rigidbody to look at hitpos direction             
            ballInstance.transform.LookAt(hitPoss);
            //adding relative force
            ballInstance.GetComponent<Rigidbody>().AddRelativeForce(Vector3.forward * force, ForceMode.Force);
        }
    }
}
 

Как я прокомментировал в коде, я изменяю transform.rotation свойства моего игрового объекта с LookAt() помощью функции, и когда я проверяю инспектор, он изменяет вращение в самый раз. но с его помощью AddRelativeForce(Vector3.forward) он напрямую переходит в глобальное направление z вместо локально измененного направления z.

Ответ №1:

AddRelativeForce применяет силу относительно ориентации родительского объекта, что здесь не имеет смысла, поскольку родительского объекта нет. Вместо:

 ballInstance.GetComponent<Rigidbody>().AddRelativeForce(Vector3.forward * force, ForceMode.Force);
 

Попробуйте:

 ballInstance.GetComponent<Rigidbody>().AddForce(ballInstance.transform.forward * force, ForceMode.Force);
 

Это должно сработать, поскольку вместо использования глобального прямого вектора Vector3.forward вы используете прямой вектор вашего ballInstance ballInstance.transform.forward

Ответ №2:

Изменение преобразования не вступит в силу мгновенно, вы должны установить Rigidbody.rotation вместо этого.

Проверьте документ: https://docs.unity3d.com/ScriptReference/Rigidbody-rotation.html