首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >统一,如果刚刚更改了Rigidbody.MovePosition(),则transform.position ()无法工作。

统一,如果刚刚更改了Rigidbody.MovePosition(),则transform.position ()无法工作。
EN

Stack Overflow用户
提问于 2021-08-16 10:16:10
回答 2查看 4K关注 0票数 0

问题

这个密码起作用了。↓

代码语言:javascript
运行
复制
private void FixedUpdate()
{
    Vector3 newPosition = new Vector3(0, 1, 0);
    GetComponent<Rigidbody>().MovePosition(newPosition);
}

这个代码不起作用。↓

代码语言:javascript
运行
复制
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.autoSyncTransformsPhysics.SyncTransforms

这个密码起作用了。↓

代码语言:javascript
运行
复制
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)改变位置。

但事实证明我不能在团结公司这么做。

有什么好主意吗?

EN

Stack Overflow用户

发布于 2021-08-16 11:19:58

首先,只有在不断检查游戏对象的刚体是否存在连续/离散碰撞检测时,才应使用刚体的MovePosition方法。如果您在项目中确实没有使用太多的物理,请避免使用它,而是使用它的转换来移动对象。

对象没有移动的原因(至少我认为这是您在屏幕上看到的)是因为您试图在同一个 FixedUpdate 时间戳上设置对象的转换位置和刚体,并更新FixedUpdate上的转换,这与任何最佳实践都相差甚远。如果将编辑transform的位置的行移动到Update方法,则可能会移动对象(取决于游戏运行的FixedUpdate的框架和时间戳)。

我建议的是,要么停止更新转换在FixedUpdate上的位置,只使用rb.MovePosition方法,要么删除FixedUpdate方法并更新转换在Update()方法上的位置。

另外,确保目前不更改transform.position、rb.position或rb.velocity在MonoBehaviour类中的任何其他位置,只是为了确保这段代码正常工作。

票数 1
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68801079

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档