Слишком резкий прыжок unity 3d

Рейтинг: 0Ответов: 2Опубликовано: 06.04.2023

Использовал классические инструменты для реализации передвижения персонажа: Rigidbody и CapsuleCollider. Для прыжка использовал функцию Rigidbody.AddForce(). При использовании данной функции прыжок не должен происходить резко как телепортация, но происходит обратное. Вот наглядный пример того, как прыгает объект в моем проекте

:введите сюда описание изображения

Я же хочу добиться следующего результата:

2

В чем может быть проблема, если я реализовал логику прыжка точно таким же образом, как и автор поста Правильная реализация передвижения персонажа из клипа выше?

Еще информация, которая может оказаться важной: для более быстрого падения я в настройках Player Settings изменил значение Gravity для у с -9.81 на -200, так как до этого все объекты падали очень медленно. По моим наблюдениям, на мою проблему это вообще никак не влияет.

Вот код моего персонажа:

    using UnityEngine;

    public class HeroController : MonoBehaviour
    {
    //Oсновные параметры
    [SerializeField] float jumpForce;
    [SerializeField] float moveSpeed;
    [SerializeField] float rotationSpeed;
    [SerializeField] bool isGrounded;

    // Параметры геймплея
    private Vector3 moveVector;// направление  передвижения


    //Ссылки на компоненты
    private MobileController mController;
    private Animator ch_animator;
    private Rigidbody rb;

    // Start is called before the first frame update
    void Start()
    {
        rb = GetComponent<Rigidbody>();
        /*ch_animator = GetComponent<Animator>();*/
        mController = GameObject.FindGameObjectsWithTag("Joystick")[0].GetComponent<MobileController>();
    }

    // Update is called once per frame
    private void FixedUpdate()
    {
        Move();
        Jump();
    }

    private void Move()
    {
        //перемещение персонажа
        /*moveVector = Vector3.zero;*/
        moveVector.x = mController.Horizontal() * moveSpeed;
        moveVector.z = mController.Vertical() * moveSpeed;
        
        if (moveVector.magnitude > 0.1f)
        {
            Quaternion rotation = Quaternion.LookRotation(moveVector);
            transform.rotation = Quaternion.Lerp(transform.rotation, rotation, rotationSpeed * Time.deltaTime);
        }

        rb.velocity = moveVector;//метод передвижения 
    }
    private void Jump()
    {
        if (Input.GetAxis("Jump") > 0)
        {
            if (isGrounded)
            {
                rb.AddForce(Vector3.up * jumpForce, ForceMode.Impulse);
            }
        }
    }
    void OnCollisionEnter(Collision collision)
    {
        IsGroundedUpate(collision, true);
    }

    void OnCollisionExit(Collision collision)
    {
        IsGroundedUpate(collision, false);
    }

    private void IsGroundedUpate(Collision collision, bool value)
    {
        if (collision.gameObject.tag == ("Ground"))
        {
            isGrounded = value;
        }
    }
}

Код автора статьи.

Ответы

▲ 0Принят

В Jump сразу задавайте IsGrounded = false

Почему? Когда вы нажимаете пробел (так же известный, как GetAxis("Jump"), у вас этот метод вызывается не один раз, а несколько(Игрок может ещё находиться несколько кадров, поэтому ивент OnCollisionExit() не самый лучший выбор в этом плане).

Я не уверен, что именно в этом проблема, но это как минимум ошибка)

▲ 0

Проблема действительно была в методе Move(). Я заменил rb.velocity = moveVector на rb.AddForce(moveVector * moveSpeed, ForceMode.Impulse) и таким образом добился желаемой плавности.