unity3d Unity,刚体,MovePosition()不工作,如果transform.position刚刚更改

hc8w905p  于 2022-11-16  发布在  其他
关注(0)|答案(2)|浏览(249)

问题

这段代码很管用。↓

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.autoSyncTransformsPhysics.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()适合我。
旧代码大约有几百行。用Rigidbody2D.MovePosition()替换transform.position需要一些时间。
所以我想我可以做以下几点来保存时间:
(1)保存初始位置,
(2)使用旧代码改变位置(transform.position),
(3)保存新职位、
(4)恢复旧位置,
(5)最后使用Rigidbody2D.MovePosition(newPosition)改变位置。
但事实证明,我无法在Unity中做到这一点。
有什么好主意吗?

xghobddn

xghobddn1#

首先,Rigidbody的MovePosition方法应该只在你经常检查碰撞/触发时使用,无论连接到游戏对象的刚体是否有连续/离散碰撞检测。如果你在项目中确实没有使用太多的物理,避免使用它,而是使用它的变换来移动对象。
物体不动的原因(至少我假设这是你在屏幕上看到的)是你试图在相同的FixedUpdate时间戳设置对象的变换位置和刚体,在FixedUpdate上更新变换与任何最佳实践都相差甚远。如果你将编辑变换位置的行移动到Update方法,它将可能移动对象(取决于游戏运行的固定更新的帧速率和时间戳)。
我的建议是,要么停止在FixedUpdate上更新转换的位置,只使用rb.MovePosition方法,要么删除FixedUpdate方法,在Update()方法上更新转换的位置。
此外,请确保您目前没有在MonoBehaviour类中的任何其他地方更改transform.position、rb.position或rb.velocity,以确保这段代码能够正常工作。

unftdfkk

unftdfkk2#

物理二维.同步转换();这个函数对我有用...我需要使用一个游戏对象的Transform.Translate,然后对一个子游戏对象使用Rigibody.MovePosition。孩子如何接收parend的平移,rb.MovePosition就不起作用...两个函数之间的物理更新是足够的。Physics2D.SyncTransforms()允许更新transform. translation的物理。

相关问题