I
I
Ivan Tumanow2021-05-13 03:08:40
Unity
Ivan Tumanow, 2021-05-13 03:08:40

Why is the character twitching near the wall?

Character twitching near a wall in Unity. I use CharacterController
When I approach a wall that I can't jump on, everything is fine, but when I approach a small wall and start quickly pressing the spacebar and the forward button, the character abruptly drops down.
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); // Постепенное снижение
    }
}

Answer the question

In order to leave comments, you need to log in

1 answer(s)
S
Sasha, 2021-05-13
@aryutin

To work with physics, it is recommended to use the FixedUpdate method instead of Update

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question