Реализую движение игрока при помощи
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; // Нажата кнопка
}
}