我想通过在屏幕上拖动鼠标来为Rigidbody增加力量。即使我已将屏幕坐标转换为世界坐标,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方向。
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
的前向矢量
更改转换不会立即生效,您应该设置Rigidbody.rotation
。
检查文件:https://docs.unity3d.com/ScriptReference/Rigidbody-rotation.html