问题
这个密码起作用了。↓
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);
}
我在联合2019.4和2020.3考试过。
因此,如果刚刚更改了Rigidbody.MovePosition(),则似乎transform.position ()将无法工作。
这一切为什么要发生?
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改变了位置。
我学了一些物理知识,认为运动学和Rigidbody2D.MovePosition()对我来说是合适的。
旧代码大约有几百行。将transform.position替换为Rigidbody2D.MovePosition()需要一些时间。
因此,我想我可以做以下几点来节省时间:
(1)保留初始位置, (2)使用旧代码更改位置(transform.position), (3)保留新职位, (4)恢复旧位置, (5)最后用Rigidbody2D.MovePosition(newPosition)改变位置。
但事实证明我不能在团结公司这么做。
有什么好主意吗?
发布于 2021-08-16 11:19:58
首先,只有在不断检查游戏对象的刚体是否存在连续/离散碰撞检测时,才应使用刚体的MovePosition方法。如果您在项目中确实没有使用太多的物理,请避免使用它,而是使用它的转换来移动对象。
对象没有移动的原因(至少我认为这是您在屏幕上看到的)是因为您试图在同一个 FixedUpdate 时间戳上设置对象的转换位置和刚体,并更新FixedUpdate上的转换,这与任何最佳实践都相差甚远。如果将编辑transform的位置的行移动到Update方法,则可能会移动对象(取决于游戏运行的FixedUpdate的框架和时间戳)。
我建议的是,要么停止更新转换在FixedUpdate上的位置,只使用rb.MovePosition方法,要么删除FixedUpdate方法并更新转换在Update()方法上的位置。
另外,确保目前不更改transform.position、rb.position或rb.velocity在MonoBehaviour类中的任何其他位置,只是为了确保这段代码正常工作。
https://stackoverflow.com/questions/68801079
复制相似问题