【问题标题】:Unity, Rigidbody.MovePosition() is not working if transform.position is just changed如果刚刚更改了 transform.position,Unity,Rigidbody.MovePosition() 将不起作用
【发布时间】: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


【解决方案1】:

首先,Rigidbody 的 MovePosition 方法应仅在您不断检查碰撞/触发时才应使用,即连接到游戏对象的刚体是否具有连续/离散碰撞检测。如果您在项目中确实没有使用太多物理,请避免使用它并使用其变换来移动对象。

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

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

另外,请确保暂时不要更改 MonoBehaviour 类中其他任何地方的 transform.position、rb.position 或 rb.velocity,以确保这段代码正常工作。

【讨论】:

  • 谢谢。我正在为项目添加一些新内容。物理学应该使它们变得容易。玩家控制一把剑。有手里剑飞向玩家。控制剑击飞手里剑。据我所知,剑应该是运动的,手里剑应该是动态的。
  • 如果我只将 FixedUpdate 更改为 Update,它也不应该移动。我已经测试过了。
  • 如果我把transform.position全部改成Rigidbody2D.MovePosition(),就是几百行,所以想找个更简单的方法。如果没有办法,只好去做。
猜你喜欢
  • 1970-01-01
  • 2021-03-13
  • 1970-01-01
  • 2015-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多