【发布时间】:2021-08-16 10:16:10
【问题描述】:
问题
此代码有效。 ↓
private void FixedUpdate()
{
Vector3 newPosition = new Vector3(0, 1, 0);
GetComponent<Rigidbody>().MovePosition(newPosition);
}
此代码无效。 ↓
private void FixedUpdate()
{
Vector3 newPosition = new Vector3(0, 1, 0);
Vector3 oldPosition = transform.position;
transform.position = newPosition;
transform.position = oldPosition;
GetComponent<Rigidbody>().MovePosition(newPosition);
}
我在 Unity 2019.4 和 2020.3 中进行了测试。
因此,如果刚刚更改了 transform.position,Rigidbody.MovePosition() 似乎将不起作用。
为什么会这样?
2021.9.3 评论
我发现它与 Physics2D.SyncTransforms() 相关。
Physics.autoSyncTransforms, Physics.SyncTransforms
此代码有效。 ↓
private void FixedUpdate()
{
Vector3 newPosition = new Vector3(0, 1, 0);
Vector3 oldPosition = transform.position;
transform.position = newPosition;
transform.position = oldPosition;
Physics2D.SyncTransforms(); //newly added
GetComponent<Rigidbody>().MovePosition(newPosition);
}
另一个小问题
另外一个小问题,以及我上面写代码的原因。
我没有在我的项目中使用太多物理。我通过设置 transform.position 改变了位置。
我学习了一些物理学,并认为 Kinematic 和 Rigidbody2D.MovePosition() 适合我。
旧代码大约有几百行。将 transform.position 替换为 Rigidbody2D.MovePosition() 需要一些时间。
所以我想我可以做以下事情来节省时间:
(1)保存初始位置,
(2)使用旧代码改变位置(transform.position),
(3)保存新位置,
(4)恢复旧位置,
(5)最后使用 Rigidbody2D.MovePosition(newPosition) 改变位置。
但事实证明我无法在 Unity 中执行此操作。
有什么好主意吗?
【问题讨论】:
-
请使用正确的标签!请注意,
unityscript是或更好地曾经是一种 JavaScript 风格,类似于早期 Unity 版本中使用的自定义语言,并且现在已经不推荐使用了!你的代码在c#!
标签: c# unity3d game-physics