Почему персонаж дергается возле стены?

Персонаж дергается возле стены в 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); // Постепенное снижение
    }
}
  • Вопрос задан
  • 295 просмотров
Пригласить эксперта
Ответы на вопрос 1
aryutin
@aryutin
Для работы с физикой рекомендуется использовать метод FixedUpdate вместо Update
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы