@YuraYuraYuraYura
Студент. Учусь программировать

Почему спринт продолжает работать после срабатывания прыжка?

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class CharacterControl: MonoBehaviour
{
    //скорость персонажа
    public float speed = 4.0f;
    //скорость прыжка персонажа
    public float jumpSpeed = 8.0f;
    //переменная гравитации персонажа
    public float gravity = 20.0f;
    // переменная движения персонажа 
    private Vector3 moveDir = Vector3.zero;
    //переменная CharacterController
    private CharacterController controller;
    
    void Start()
    {
        controller = GetComponent<CharacterController>();

    }

    void Update()
    {
        if (controller.isGrounded)
        {
            
            moveDir = new Vector3(Input.GetAxis("Horizontal"), 0, Input.GetAxis("Vertical"));
            moveDir = transform.TransformDirection(moveDir);
            moveDir *= speed;
        }

        if(Input.GetKeyDown(KeyCode.Space)&& controller.isGrounded)
        {
            moveDir.y = jumpSpeed;
        }

        moveDir.y -= gravity * Time.deltaTime;
        controller.Move(moveDir * Time.deltaTime);

         //начал делать спринт и вот здесь косяк
         if (Input.GetKey(KeyCode.LeftShift)&& controller.isGrounded)
        {
            speed = 10.0F; 
        }
         else if (Input.GetKeyUp(KeyCode.LeftShift) && controller.isGrounded)
       {
            speed = 4.0F;
        }
    }
}


Если во время спринта прыгнуть, спринт как бы залипает и ждет еще одного нажатия шифта, чтобы вернуться к обычной скорости. Может кто сталкивался с подобным?
  • Вопрос задан
  • 47 просмотров
Решения вопроса 1
DanceM
@DanceM Куратор тега Unity Game Engine
Кто хочет -ищет способ, кто не хочет -ищет причину
Как написали, так и работает. У вас условие на отпускание кнопки проверяется ТОЛЬКО пока персонаж на земле. А кнопка то один раз отпускается, вот он и "бегает" пока повторно не "отпустите на земле".

И рекомендую не комментировать переменные (тем более на русском, лучше уж англ), а писать им полные названия, чтобы смысл угадывался сразу по прочтению. Лучше длинная переменная со смыслом, чем короткое нечто.
Например:
public float characterMovementSpeed = 4.0f;
public float characterJumpSpeed = 8.0f;
public float characterGravity = 20.0f;
private Vector3 characterMovenmentDirection;
private CharacterController characterController;


Числа в коде лучше не держать, после, когда скрипты станут большими, устанете их искать:
private const float MaxSpeedRun = 10f;
private const float MaxSpeedWalk = 4f;
...
characterMovementSpeed = MaxSpeedRun;
...
characterMovementSpeed = MaxSpeedWalk;
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы