Задать вопрос
@Moskaa

CharacterController.isGrounded работает некорректно. Что делать?

Я делая управление персонажу, а конкретно прыжок, столкнулся с проблемой. Когда игрок стоит на месте, нажимая на пробел, игрок не прыгает, если же игрок будет двигаться, то игрок будет непрерывно прыгать (это обусловлено методом GetButton). Возникает вопрос, как исправить проблему с прыжком?
using System;
using UnityEngine;

public class Controller : MonoBehaviour
{
    [SerializeField] Transform orientation;

    [Header("Настройки игрока")]
    [SerializeField] private float sprintSpeed = 10f;
    [SerializeField] private float walkSpeed = 5f;
    [SerializeField] private float jumpHeight = 2f;

    private Vector3 yMove;
    private Vector3 direction;

    private CharacterController controller;

    private float speed;
    private float gravity = 9.81f;
    private float verticalVelocity;
    private float sprintTransitSpeed = 5f;

    public Climbing intermediary;

    private void Start()
    {
        controller = GetComponent<CharacterController>();

        Cursor.lockState = CursorLockMode.Locked;
        Cursor.visible = false;
    }

    private void Update()
    {
        if(intermediary.isClimb == false)
        {
            InputManagment();
            MoveOnGround();
        }
        else
        {
            ClimbCalculation();
        }

        yCalculation();
    }

    private void InputManagment()
    {
        direction.x = Input.GetAxisRaw("Horizontal");
        direction.z = Input.GetAxisRaw("Vertical");
    }

    private void MoveOnGround()
    {
        Vector3 move = orientation.forward * direction.z + orientation.right * direction.x;

        if (Input.GetKey(KeyCode.LeftShift))
        {
            speed = Mathf.Lerp(speed, sprintSpeed, sprintTransitSpeed * Time.deltaTime);
        }
        else
        {
            speed = Mathf.Lerp(speed, walkSpeed, sprintTransitSpeed * Time.deltaTime);
        }

        controller.Move(move.normalized * speed * Time.deltaTime);
    }

    private void yCalculation()
    {
        yMove.y = GravityCalculation();

        controller.Move(yMove * Time.deltaTime);
    }

    private void ClimbCalculation()
    {
        if (Input.GetKey(KeyCode.W))
        {
            verticalVelocity = 2f;
        }
        else if (Input.GetKey(KeyCode.S))
        {
            verticalVelocity = -2f;
        }
        else
        {
            verticalVelocity = 0;
        }

        controller.Move(Vector3.up * verticalVelocity * Time.deltaTime);
    }

    private float GravityCalculation()
    {
        if (controller.isGrounded)
        {
            verticalVelocity = 0;

            if (Input.GetButton("Jump"))              //реализация прыжка
            {
                verticalVelocity = jumpHeight;
            }
        }

        else
        {
            verticalVelocity -= gravity * Time.deltaTime;
        }

        return verticalVelocity;
    }
}


Механика прыжка реализована в методе GravityCalculation. На метод ClimbCalculation не стоит обращать внимания, здесь он не играет какую-то роль.
  • Вопрос задан
  • 92 просмотра
Подписаться 1 Простой Комментировать
Решения вопроса 1
@LDC
Не легче использовать ChekShepre?
Возвращает true если на земле, а false если нет
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы
26 дек. 2024, в 15:04
3000 руб./за проект
26 дек. 2024, в 14:50
2000 руб./за проект
26 дек. 2024, в 14:40
15000 руб./за проект