Я хочу добавить силу Rigidbody, перетаскивая мышь на экране. несмотря на то, что я преобразовал координаты экрана в мировые координаты, а вращение твердого тела смотрит на координаты, где отпущена кнопка мыши. Когда я добавляю относительную силу с помощью 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.

0
EmreAkkoc 15 Апр 2019 в 20:07

2 ответа

Лучший ответ

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

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

Пытаться:

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

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

1
Ali Baba 16 Апр 2019 в 16:22

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

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

0
shingo 16 Апр 2019 в 04:03