В общем, как только возникает 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);
}