unity 如何将 transform.position 转换为物理运动?

unity how can I convert transform.position into physical movement?

在我的代码中,我使用 transform.position 移动玩家,但这会导致对撞机和我游戏的物理问题。

 transform.position = new Vector3(
                transform.position.x + touch.deltaPosition.x * multiplier,
                transform.position.y,
                transform.position.z + touch.deltaPosition.y * multiplier)

我如何将其转换为速度或一些物理运动以使速度不起作用?

一般来说,一旦发生 Rigidbody 和碰撞,您应该避免两件事:

  • 通过 transform
  • 移动对象
  • Update
  • 中移动您的对象

两者都打破了物理学。

您更愿意做的是直接更新 Rigidbody.velocity。在 Update

中这样做很好
// If possible already reference via Inspector
[SerializeField] private Rigidbody _rigidbody;

private void Start()
{
    if(!_rigidbody) _rigidbody = GetComponent<Rigidbody>();
}

private void Update()
{
    ...

    _rigidbody.velocity = Vector3.right * touch.deltaPosition.x * multiplier 
        + Vector3.forward * touch.deltaPosition.y * multiplier;
    ...
}

另一种方法是将用户输入 (Update) 与物理例程 (FixedUpdate) 分开并使用 MovePosition

(假设你的代码是在更新中执行的)

private Vector3 targetPosition;

// If possible already reference via Inspector
[SerializeField] private Rigidbody _rigidbody;

private void Start()
{
    if(!_rigidbody) _rigidbody = GetComponent<Rigidbody>();

    targetPosition = transform.position;
}

private void Update()
{
    ...

    targetPosition = _rigidbody.position 
        + Vector3.right * touch.deltaPosition.x * multiplier 
        + Vector3.forward * touch.deltaPosition.y * multiplier;

    ...
}

private void Update()
{
    _rigidbody.MovePosition(targetPosition);
}