Unity中如何基于全局位置给球体施加向下力实现无XZ偏移的运球效果
问题根源
你当前的代码逻辑存在两次方向转换的错误,导致施力方向会跟随篮球自身的旋转角度偏移:
AddRelativeForce方法本身会将传入的向量按物体本地坐标系解析,自动转换为对应世界空间的施力方向- 额外调用的
TransformDirection又做了一次本地方向到世界方向的转换,最终施力方向完全不受控,自然会产生X、Z轴的额外位移
修正方案
直接使用世界空间下的施力方法 AddForce 即可,无需做任何方向转换,力会始终沿世界Y轴向下,不受球体自转影响:
if (Physics.Raycast(ray, out hit)) { Pickupable p = hit.collider.GetComponent<Pickupable>(); if (p != null) { Rigidbody rb = hit.collider.GetComponent<Rigidbody>(); // 沿世界坐标系Y轴施加向下冲量,不受球体自身旋转影响 rb.AddForce(Vector3.down * 5, ForceMode.Impulse); } }
如果想要彻底避免X、Z轴产生位移,可以额外锁定刚体的X、Z轴位置约束,不影响球体自转效果:
// 在获取Rigidbody后添加该行即可 rb.constraints = RigidbodyConstraints.FreezePositionX | RigidbodyConstraints.FreezePositionZ;
你也可以直接在Unity编辑器的Rigidbody组件面板上,勾选Freeze Position下的X、Z选项,效果一致。
内容的提问来源于stack exchange,提问作者Dallas Keating
相关产品推荐
相关产品推荐

