我将在运行时(实际上是在另一个物体的
我正在生成的预制体的旋转中心点与物体的质心不重合。因此,重新缩放会导致相对于旋转中心点的质心位置发生变化。然而,它并没有被自动更新,因此我的生成对象具有意外的物理效果。
我尝试在调用
然而,如果我把对
Start()
方法中)生成一个预制对象,并需要对该对象进行缩放。我编写了一个小组件来处理这个问题:public class Spawner : MonoBehaviour {
public Transform SpawnPrefab;
public Vector3 Scale;
void Start () {
var spawn = Instantiate(SpawnPrefab, Vector3.zero, Quaternion.identity);
spawn.localScale = Vector3.Scale(spawn.localScale, Scale);
// spawn.GetComponent<Rigidbody>().ResetCenterOfMass(); // Has no effect
}
}
我正在生成的预制体的旋转中心点与物体的质心不重合。因此,重新缩放会导致相对于旋转中心点的质心位置发生变化。然而,它并没有被自动更新,因此我的生成对象具有意外的物理效果。
我尝试在调用
Scale()
后立即添加对GetComponent<Rigidbody>().ResetCenterOfMass()
的调用(如上面的注释行),但是这没有任何效果。然而,如果我把对
ResetCenterOfMass()
的调用放在一个单独的小组件的Start()
方法中,例如:public class COMReset : MonoBehaviour {
void Start() {
GetComponent<Rigidbody>().ResetCenterOfMass();
}
}
这确实可以正确地重新计算质心。然而,生成的物体似乎已经通过至少一个错误的质心物理更新,因此已经获得了一些意外的动量。
为什么没有自动重新计算质心,而不需要我明确调用 ResetCenterOfMass()
?如果我必须手动触发它,那么我能否在调用 Instantiate()
和 Scale()
后立即执行,而不是像现在这样延迟执行?
COMReset
组件的方法也存在这个问题(尽管程度似乎较小)。 - atkinsPhysics.SyncTransforms
发现了一个可靠的解决方案。 - atkins