#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