Персонаж дергается возле стены в Unity. Пользуюсь CharacterController'ом
Когда подхожу к стене, на которую невозможно запрыгнуть то все нормально, но когда подхожу к маленькой стене и начинаю быстро нажимать пробел и кнопку вперед, то персонаж резко отпускается вниз.
https://youtu.be/qinCKJdCNp8
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[RequireComponent(typeof(CharacterController))]
public class PlayerController : MonoBehaviour
{
private CharacterController _controller;
[Header("Настройки игрока")]
[SerializeField] private float _playerVelocity = 5.0f; // Скорость игрока
[SerializeField] private float _playerJumpHeight = 1.2f;
[Header("Физические настройки")]
[SerializeField] private float _gravityForce = -32.62f; // Сила гравитации(значение)
private Vector3 _valueActionPhysics = Vector3.up; // Действие физики(гравитации) на игрока
[Header("Настройки для доступности прыжка")]
[SerializeField] private Transform _checkGroundPosition;
[SerializeField] private float _checkGroundRadius = 0.4f;
[SerializeField] private LayerMask _groundLayer;
private bool _playerIsGrounded;
private void Start(){
_controller = GetComponent<CharacterController>();
}
private void Update(){
Move();
Jump();
Debug.Log($"Jump is {_controller.isGrounded}");
}
private void Move(){
// Метод отвечающий за передвижение игрока
// Передвижение
float moveInputX = Input.GetAxis("Horizontal");
float moveInputZ = Input.GetAxis("Vertical");
// Направление персонажа в пространстве(Зависимо от поворотов персонажа); Куда смотрит туда и идет
Vector3 playerDirection = transform.right * moveInputX + transform.forward * moveInputZ;
_controller.Move(playerDirection * _playerVelocity * Time.deltaTime); // Перемещение(установка значений)
}
private void Jump(){
// Метод отвечающий за прыжок и действие гравитации на персонажа
// Проверка стоит ли игрок на земле
_playerIsGrounded = Physics.CheckSphere(_checkGroundPosition.position, _checkGroundRadius, _groundLayer);
if (_playerIsGrounded == true && _valueActionPhysics.y < 0.0f){ // Изменяем вертикальное положение
_valueActionPhysics.y = -2.0f; // направления на 0
// Прыжок персонажа
if (Input.GetKeyDown(KeyCode.Space) == true){
_valueActionPhysics.y = Mathf.Sqrt(_playerJumpHeight * -2.0f * _gravityForce); // Расчет высоты прыжка
}
}
// Гравитация
_valueActionPhysics.y += _gravityForce * Time.deltaTime; // Действие гравитации на игрока(ось у)
_controller.Move(_valueActionPhysics / 2.0f * Time.deltaTime); // Постепенное снижение
}
}