motkot
@motkot
Программирование C#.

Почему когда добавлю скрипт на обьект, меняется поведение физики игрока?

Типо добавил на обьект скрипт, а он начал очень медленно падать и не прыгает. Удалил компонент и он начал нормально падать.

В чем прикол?

Код:

using UnityEngine;

[RequireComponent(typeof(Rigidbody2D))]
public class PlayerMovement : MonoBehaviour
{
    [Header("Settings")]
    [SerializeField] private float _walkSpeed;
    [SerializeField] private float _jumpForce;

    [Header("Components")]
    [SerializeField] private Rigidbody2D _rigidbody;

    private void FixedUpdate()
    {
        Walk();
    }

    private void Update()
    {
        if(Input.GetButtonDown("Jump"))
        {
            Jump();
        }
    }

    private void Walk()
    {
        var direction = Input.GetAxisRaw("Horizontal");

        _rigidbody.velocity = Vector2.right * direction * _walkSpeed;
    }

    private void Jump()
    {
        print("Jump");

        _rigidbody.AddForce(Vector2.up * _jumpForce, ForceMode2D.Impulse);
    }
}
  • Вопрос задан
  • 32 просмотра
Пригласить эксперта
Ответы на вопрос 2
@pashara
Потому что каждый кадр Вы перетираете значение скорости, рассчитанное движком:
private void Walk()
{
    var direction = Input.GetAxisRaw("Horizontal");
    _rigidbody.velocity = Vector2.right * direction * _walkSpeed;
}

Данный код не должен отрабаытвать, когда объект падает.
Ответ написан
Комментировать
NikS42
@NikS42
Unity developer
В примере сразу присутствует образец того, как надо. Как и указано в документации Unity:


В большинстве случаев вам не нужно изменять скорость напрямую, т.к. это может быть причиной нереалистичного поведения. Не устанавливайте скорость объекта каждый физический шаг, это приведет к нереалистичной имитации физики. Типичный пример, где вы можете изменить скорость это прыжок в шутере от первого лица, потому что вам нужно немедленно изменить скорость.


Как и сказал pashara, может пригодиться глушить Walk, когда персонаж в прыжке, но не всегда. Например, в платформерах часто позволяется менять горизонтальную скорость в прыжке. Для этого тоже стоит использовать AddForce, чтобы можно было прыгать на бегу. Условно, пример, когда все таки может пригодиться сеттер velocity - проигрыш в Mario, когда скорость резко обнуляется, и персонаж подлетает на месте.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы