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

Почему 3д персонаж не прыгает?

Персонаж не прыгает, но в if заходит.
using UnityEngine;

public class PlayerMovement : MonoBehaviour
{
    [Header("Компоненты")]
    [SerializeField] private CharacterController _controller;
    [SerializeField] private Transform _camera;

    [Header("Настройки движения")]
    [SerializeField] private float _speed = 5f;
    [SerializeField] private float _sensitivity = 4f;
    [SerializeField] private float _smoothTime = 0.1f;

    [Header("Настройки прыжка и гравитации")]
    [SerializeField] private float _gravity = -9.81f;
    [SerializeField] private float _groundedGravity = -0.5f;
    [SerializeField] private float _jumpHeight = 12f;
    [SerializeField] private float _jumpCooldown = 0.1f;

    private float jumpForce => Mathf.Sqrt(_jumpHeight * -2f * _gravity);
    private Vector2 currentRotation;
    private Vector3 moveDirection;
    private float currentVelocityY;
    private bool isInitialized;
    private bool canJump = true;
    private float jumpCooldownTimer;

    private void Awake()
    {
        // Проверка и получение компонентов
        if (_controller == null)
            _controller = GetComponent<CharacterController>();

        if (_camera == null)
            _camera = Camera.main.transform;

        currentRotation = new Vector2(0, transform.eulerAngles.y);

        // Блокировка и скрытие курсора
        Cursor.lockState = CursorLockMode.Locked;
        Cursor.visible = false;

        isInitialized = true;
    }

    private void OnDisable()
    {
        // Разблокировка курсора при отключении скрипта
        Cursor.lockState = CursorLockMode.None;
        Cursor.visible = true;
    }

    private void Update()
    {
        if (!isInitialized) return;

        HandleMovement();
        HandleJump();
        HandleRotation();
        ApplyGravity();
    }

    private void HandleMovement()
    {
        // Получаем входные данные для движения
        float moveX = Input.GetAxis("Horizontal");
        float moveZ = Input.GetAxis("Vertical");

        // Вычисляем направление движения относительно поворота игрока
        moveDirection = transform.right * moveX + transform.forward * moveZ;
        moveDirection = Vector3.ClampMagnitude(moveDirection, 1f) * _speed;

        // Применяем движение с учетом гравитации
        Vector3 movement = moveDirection + new Vector3(0, currentVelocityY, 0);
        _controller.Move(movement * Time.deltaTime);
    }

    private void HandleRotation()
    {
        // Получаем движение мыши
        float mouseX = Input.GetAxis("Mouse X") * _sensitivity;
        float mouseY = Input.GetAxis("Mouse Y") * _sensitivity;

        // Обновляем вращение
        currentRotation.x = Mathf.Clamp(currentRotation.x - mouseY, -90f, 90f);
        currentRotation.y += mouseX;

        // Применяем вращение к камере и игроку
        _camera.localRotation = Quaternion.Euler(currentRotation.x, 0, 0);
        transform.rotation = Quaternion.Euler(0, currentRotation.y, 0);
    }

    private void HandleJump()
    {
        if (Input.GetKeyDown(KeyCode.Space) && _controller.isGrounded && canJump && jumpCooldownTimer <= 0f)
        {
            Debug.Log("1");
            currentVelocityY = jumpForce;
            canJump = false;
            jumpCooldownTimer = _jumpCooldown;
        }

        if (!canJump)
        {
            jumpCooldownTimer -= Time.deltaTime;
            if (jumpCooldownTimer <= 0f)
            {
                canJump = true;
            }
        }
    }

    private void ApplyGravity()
    {
        if (_controller.isGrounded)
        {
            // Небольшая отрицательная сила, чтобы держать персонажа на земле
            currentVelocityY = _groundedGravity;
        }
        else
        {
            // Применяем гравитацию
            currentVelocityY += _gravity * Time.deltaTime;
        }
    }
}
  • Вопрос задан
  • 84 просмотра
Подписаться 1 Простой 2 комментария
Пригласить эксперта
Ответы на вопрос 2
@Programist2728
Видимо писал тебе код нейросеть, она использует Character controller. Попроси чтоб он написал скрипт движение персонажа используя компонент Rigidbody. Либо можешь использовать этот скрипт но к персонажу добавь компонент Character controller. И к своей земле добавь тэг a Ground
Ответ написан
Комментировать
@DrRen7
_controller.isGrounded плохо срабатывает там подобрать Skin width
лучше использовать свое решение, ну как пример
private void GroundCheker()
    {
        Vector3 chechSpherePos = new Vector3(transform.position.x, transform.position.y + _sphereOffSet, transform.position.z);
        _isGround = Physics.CheckSphere(chechSpherePos, _sphereCheckRad, _groundMask);
    }
    //private void OnDrawGizmos() //visDebug
    //{
    //    Gizmos.color = Color.red;
    //    Gizmos.DrawSphere(transform.position + Vector3.up * _sphereOffSet, _sphereCheckRad);
    //}
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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