Всякий раз, когда речь идет о Rigidbody
или Rigidbody2D
, существуют два основных правила
Не делайте вещи в Update
, а скорее в FixedUpdate
который используется для всех расчетов движка Physics и Physics2D.
Перемещение объекта в Update
приведет к некоторому дрожанию и торможению физических реакций, таких как столкновения и т. Д. c.
Не go непосредственно через Transform
, но используйте вместо этого свойства и методы Rigidbody
или Rigidbody2D
!
Как и в вашем случае Rigidbody2D.MovePosition
или Rigidbody2D.velocity
Повторное перемещение объекта с помощью компонента Transform
нарушает физику
, поэтому ваш код должен быть похож на
// already reference the component via the Inspector
[SerializeField] Rigidbody2D rb;
Vector3 acceleration;
Vector3 accelerationRight;
privtae void Awake()
{
if(!rb) rb = GetComponent<Rigidbody2D>();
}
// Get user input within Update
private void Update()
{
acceleration = Input.GetAxis("Vertical") * verticalInputAcceleration * transform.up;
accelerationRight = Input.GetAxis("Horizontal") * horizontalInputAcceleration * transform.right;
}
// update the Rigidbody in FixedUpdate
private void FixedUpdate()
{
velocity = rb.velocity;
// do these here so Time.deltaTime uses the correct value
velocity += acceleration * Time.deltaTime;
velocity += accelerationRight * Time.deltaTime;
velocity = velocity * (1 - Time.deltaTime * velocityDrag);
velocity = Vector3.ClampMagnitude(velocity, maxSpeed);
// Problem: MovePosition expects a value in global world space
// so if your velocity is in local space
// - which seems to be the case - you will have to convert
// it into a global position first
var newPosition = rb.position + transform.TransformDirection(velocity * Time.deltaTime);
rb.MovePosition(newPosition);
}
, или же вы можете просто назначить эту новую скорость жесткому телу
// update the Rigidbody in FixedUpdate
private void FixedUpdate()
{
velocity = rb.velocity;
// do these here so Time.deltaTime uses the correct value
velocity += acceleration * Time.deltaTime;
velocity += accelerationRight * Time.deltaTime;
velocity = velocity * (1 - Time.deltaTime * velocityDrag);
velocity = Vector3.ClampMagnitude(velocity, maxSpeed);
rb.velocity = velocity;
}
Набрано на смартфоне, но я надеюсь, что идея проясняется