我想你实际上想反过来!
Transform.InverseTransformDirection https://docs.unity3d.com/ScriptReference/Transform.InverseTransformDirection.html将向量从世界空间转换为局部空间。
然而,你得到的输入是localXZ 平面上的向量和Rigidbody.AddForce https://docs.unity3d.com/ScriptReference/Rigidbody.AddForce.html期望一个世界空间向量。
您希望根据玩家对象的方向应用此方向,例如按右(您的输入是1,0,0
)物体应朝其方向移动transform.right
vector.
因此,您宁愿以相反的方向转换到世界空间,以在 Unity 世界空间中移动对象。
你应该使用Transform.TransformDirection https://docs.unity3d.com/ScriptReference/Transform.TransformDirection!
var worldMove = transform.TransformDirection(controlVector);
sphere.AddForce(worldMove * 10);
或者你也可以只乘以旋转,例如
var worldMove = transform.rotation * controlVector;
sphere.AddForce(worldMove * 10);
但是,由于您使用的是 Rigidbody,因此还存在Rigidbody.AddForceRelative https://docs.unity3d.com/ScriptReference/Rigidbody.AddRelativeForce.html它基本上以相同的方式工作,并期望一个局部空间矢量,然后在内部转换为世界空间力。
sphere.AddRelativeForce (controlVector * 10);