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);
}
在我的代码中,我使用 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);
}