Как сделать прыжок плавным?

Реализую движение игрока при помощи Character Collider.
Всё вроде бы хорошо, но прыжок резкий, т.е он сразу, резко меняет Y координату, хотя гравитация реализованная по тому же принципу, и плавно опускает объект на земле, в отличии от прыжка.
Как это исправить, да и в целом, как можно улучшить качество говнокода?

Movement.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class Movement : MonoBehaviour
{
    [Header("Скорость движения игрока")]
    [SerializeField]
    private float _speedPlayer; // Переменная со ск-тью игрока

    [Header("Скорость движения игрока")]
    [SerializeField]
    private float _speedRotate; // Переменная со ск-тью поворота игрока

    [Header("Сила гравитации")]
    [SerializeField]
    private float _forceGravity; // Переменная со ск-тью поворота игрока

    [Header("Сила прыжка")]
    [SerializeField]
    private float _forceJump; // Переменная со ск-тью поворота игрока

    [Header("Джостик")]
    [SerializeField]
    private VariableJoystick _joystickPlayer; // Переменная со ск-тью поворота игрока

    private CharacterController _playerController; // Контроллер движений игрока
    private bool _isJumpBtnClick; // Нажата ли кнопка прыжка

    public bool IsJumpBtnClick // Публичная переменная для управления другими скриптами
    {
        get { return _isJumpBtnClick; }
        set { _isJumpBtnClick = value; }
    }

    private void Start() { // Инициализация
        _playerController = gameObject.GetComponent<CharacterController>(); // Присваиваем контроллер игрока в переменную
    }

    private void FixedUpdate() { // Метод физических вычислений
        _moveFunction(); // Движение
        if(_playerController.isGrounded && IsJumpBtnClick) _jumpPlayer(); // Функция прыжка
        else _gravitationPlayer(); // Гравитация
    }

    private void _moveFunction() { // Функция движения
        float _corX = _joystickPlayer.Horizontal == 0 ? Input.GetAxis("Horizontal") : _joystickPlayer.Horizontal; // Получаем x
        float _corZ = _joystickPlayer.Vertical == 0 ? Input.GetAxis("Vertical") : _joystickPlayer.Vertical; // Получаем z
        if ( _playerController.isGrounded && (_corX != 0 || _corZ != 0 ) ) { // Если есть изменения
            Vector3 _moveDir = Vector3.zero; // Нулевой вектор движения
            Vector3 _rotateDir = Vector3.zero; // Нулевой вектор поворота отн. движения
            /* Задаем вектор движения */
            _moveDir.x = _corX; // Меняем x вектора движения
            _moveDir.z = _corZ; // Меняем z вектора движения
            /* Задем вектор поворота */
            _rotateDir.y = _corX; // Задаем поворот по горизонтали
            /* Задаем векторы отн. координат игрока */
            _moveDir = transform.TransformDirection(_moveDir);
            _rotateDir = transform.TransformDirection(_rotateDir);
            /* Поворачиваем */
            transform.Rotate(_rotateDir * _speedRotate); // Поворачиваем игрока на вектор, для плавности умножаем на скорость
            /* Задаем движение */
            _playerController.Move(_moveDir * _speedPlayer); // Двигаем игрока по вектору, для плавности умножаем на скорость
        }
    }

    private void _gravitationPlayer() { // Функция гравитации
        Vector3 _gravityDir = Vector3.zero; // Нулевой вектор
        _gravityDir.y -= _forceGravity * Time.fixedDeltaTime; // Плавно меняем y
        _playerController.Move(_gravityDir * _forceGravity); // Двигаем y плавно=)
    }

    private void _jumpPlayer() { // Функция прыжка
         Vector3 _upDir = Vector3.zero; // Нулевой вектор, чтобы ошибок не было и так по правасланаму
         _upDir.y += _forceJump; // Задаем y
         _playerController.Move(_upDir * Time.fixedDeltaTime); // Двигаем по y
         IsJumpBtnClick = false;
    }

    public void OnClickBtnJump () { // Функция кнопки прыжка
        IsJumpBtnClick = true; // Нажата кнопка
    }
}

  • Вопрос задан
  • 121 просмотр
Решения вопроса 1
DanceM
@DanceM Куратор тега Unity Game Engine
Кто хочет -ищет способ, кто не хочет -ищет причину
Физику учили в школе? Так вот "прыжок" может быть лишь и только резким, так как это испульс силы заданый в момент отрыва от поверхности. Как поведет себя после тело зависит от времени, гравитации и сопротивления воздуха (если нет третей силы в виде ракетного двигателя). Всё иное уже импровизация и обход физических условий.

Ну а раз Вы физику хотите обойти, то... обходите, как Вам нравится. Скажем, создайте корутину, что будет после начала прыжка управлять его вектором силы. Типа, плавное ускорение, импульс, торможение.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
DanielMcRon
@DanielMcRon
C# && Unity
Я понимаю... Склероз, напомню ещё раз

Как сделать прыжок плавнее?
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
GD Company Санкт-Петербург
от 120 000 до 150 000 ₽
Mystery Tag Новосибирск
от 80 000 до 110 000 ₽
от 130 000 до 200 000 ₽
02 апр. 2020, в 21:27
600 руб./за проект
02 апр. 2020, в 21:15
3000 руб./за проект
02 апр. 2020, в 21:11
8500 руб./за проект