I
I
Ivan Belovikov2020-03-09 22:04:47
C++ / C#
Ivan Belovikov, 2020-03-09 22:04:47

How to make the jump smoother?

Good day!

I'm making a game, and already at the initial stage, a bug...
I tried to make a smooth jump, but it abruptly assigns the y coordinate to the player equal to the "jump strength"
It seems that I multiply by Time.deltaTime, but it doesn't matter!

The script itself

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

public class Movement : MonoBehaviour { 
    [SerializeField]
    private float _speedMove; // Ск-ть движения
    [SerializeField]
    private float _speedRotate; // Ск-ть поворота камеры
    [SerializeField]
    private float _gravity; // Сила гравитации
    [SerializeField]
    private float _jumpForce; // Сила прыжка

    [SerializeField]
    private FixedJoystick _fixedJoystick;

    private CharacterController _cc; //  Контроллер движений
    private Animator _animatorCharacter; // Контроллер анимаций

    private void Start() { // Метод при загрузки игры
        _cc = gameObject.GetComponent<CharacterController>(); // Получаем контроллер
        _animatorCharacter = gameObject.GetComponent<Animator>(); // Получаем аниматор
    }

    private void FixedUpdate() { // Метод физ. вычеслений
        _movePlayer(); // Функция движения
        _gravityForce(); // Иммитация гравитации
        if (Input.GetKeyDown(KeyCode.Space)) OnJump();
    }

    private void _movePlayer () { // Создаем функцию для движения
        float _corX = _fixedJoystick.Horizontal; // Получаем x координату по нажатию
        float _corZ = _fixedJoystick.Vertical; // Получаем z координату по нажатию

        if ( _cc.isGrounded && (_corX != 0 || _corZ != 0) ) { // Если изм. координаты и если на земле
            Vector3 _dir = Vector3.zero; // Задаем нулевой вектор отн. мира
            Vector3 _dirRotate = Vector3.zero; // Задаем вектор 0 для поворота
            /* Задаем в вектор движения координаты направления */
            _dir.x = _corX; // Задаем x координату движения отн. мира
            _dir.z = _corZ; // Задаем z координату движения отн. мира
            _dir = transform.TransformDirection(_dir); // Задаем вектор отн. игрока
            /* Поворот персонажа */
            _dirRotate.y = _corX * _speedRotate; // Задаем вектор поворот в сторону
            transform.Rotate(_dirRotate); // Изм. поворот
            /* Движение персонажа */
            _cc.Move(_dir * _speedMove); // Задаем движение
            _animatorCharacter.SetBool("walk", true);
        } else {
            _animatorCharacter.SetBool("walk", false);
        }
    }

    private void _gravityForce () { // Метод гравитации
        Vector3 _gravityDir = Vector3.zero; // Создаем нулевой вектор
        _gravityDir.y -= _gravity * Time.fixedDeltaTime; // Создаем притяжение, у меньшая плавно y координату
        _cc.Move(_gravityDir); // Двигаем по y с учетом гравитации
    }

    public void OnJump() { // Метод для прыжка
        if (_cc.isGrounded) { // Если на земле
            Vector3 _jump = Vector3.zero;
            _jump.y += _jumpForce * Time.deltaTime; // Сам "плавный" прыжок
            _cc.Move(_jump); // Плавный прыжок
        }
    }

}

Answer the question

In order to leave comments, you need to log in

2 answer(s)
D
DanielMcRon, 2020-03-09
@arat1337

public float jumpSpeed = 15.0f;
public float gravity = -9.8f;
public float terminalVelocity = -10.0f;
public float minFall = -1.5f;
private float _vertSpeed;
...
void Start() {
 _vertSpeed = minFall; 
 ...
}
 void Update() {
 ...
 if (_charController.isGrounded) {
 if (Input.GetButtonDown("Jump")) { 
 _vertSpeed = jumpSpeed;
 } else {
 _vertSpeed = minFall;
 }
 } else { 
 _vertSpeed += gravity * 5 * Time.deltaTime;
 if (_vertSpeed < terminalVelocity) {
 _vertSpeed = terminalVelocity;
 }
 }
 movement.y = _vertSpeed;
 movement *= Time.deltaTime; 
 _charController.Move(movement);
 }
}

I didn’t bother, I took it from the book "Unity in action"
I think it's not worth explaining, page like 188 in the book, if anything

M
maxmahsudov, 2020-03-09
@maxmahsudov

This is because the OnJump method is called once when the space bar is pressed, plus it's not a good idea to track a keystroke in FixedUpdate. I would solve the problem in the following way:
public Rigidbody rb;
void Start()
{
rb = GetComponent();
}
private void Update(){
If(Input.GetKeyDown(KeyCode.Space)){
rb.AddForce(Vector3.up * _jumpForce)
}
}

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question