Как сделать прыжок быстрее, когда игрок бежит?

У меня есть движение контроллера персонажа, где игрок может ходить, бегать и прыгать. Однако столкнулся с проблемой прыжков. При прыжках на ходу скорость прыжка выглядит неплохо. Но при прыжках во время бега скорость прыжка слишком мала по сравнению со скоростью бега. Как я могу это исправить?

Вот мой код:

public class PlayerMovement : MonoBehaviour
{
    [SerializeField] Transform playerCamera = null;
    [SerializeField] float mouseSensitivity = 3.5f;
    [SerializeField] float walkSpeed = 10.0f;
    [SerializeField] float RunSpeed = 12.0f;
    [SerializeField] float gravity = 9.81f;
    [SerializeField] bool lockCursor = true;
    [SerializeField] [Range(0.0f, 0.5f)] float moveSmoothTime = 0.3f;
    public float jumpHeight = 3f;

    Vector3 velocity;
    public float verticalVelocity;
    float cameraPitch = 0.0f;

    CharacterController controller = null;
    Vector2 currentDir = Vector2.zero;
    Vector2 currentDirVelocity = Vector2.zero;
    Vector2 currentMouseDelta = Vector2.zero;
    Vector2 currentMouseDeltaVelocity = Vector2.zero;

    void Start()
    {
        controller = GetComponent<CharacterController>();
        if (lockCursor)
        {
            Cursor.lockState = CursorLockMode.Locked;
            Cursor.visible = false;
        }
    }
    void Update()
    {
        UpdateMouseLook();
        UpdateMovement();
    }
    void UpdateMouseLook()
    {
        Vector2 targetMouseDelta = new Vector2(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y"));

        currentMouseDelta = Vector2.SmoothDamp(currentMouseDelta, targetMouseDelta, ref currentMouseDeltaVelocity, mouseSmoothTime);

        cameraPitch -= currentMouseDelta.y * mouseSensitivity;

        cameraPitch = Mathf.Clamp(cameraPitch, -90.0f, 90.0f);

        playerCamera.localEulerAngles = Vector3.right * cameraPitch;

        transform.Rotate(Vector3.up * currentMouseDelta.x * mouseSensitivity);
    }
    void UpdateMovement()
    {
        Vector2 targetDir = new Vector2(Input.GetAxisRaw("Horizontal"), Input.GetAxisRaw("Vertical"));
        targetDir.Normalize();

        currentDir = Vector2.SmoothDamp(currentDir, targetDir, ref currentDirVelocity, moveSmoothTime);

        if (controller.isGrounded)
            velocity.y = 0.0f;
        velocity += (velocity.y < 0 ? Physics.gravity * 2 : Physics.gravity) * Time.deltaTime;

        velocity = (transform.forward * currentDir.y + transform.right * currentDir.x) * walkSpeed + Vector3.up * velocity.y;
          if (Input.GetKeyDown(KeyCode.J) && controller.isGrounded)
        {
           velocity.y = Mathf.Sqrt(jumpHeight * -2f * gravity);
           velocity += (velocity.y < 0 ? Physics.gravity * 2 : Physics.gravity) * Time.deltaTime;
        }
        controller.Move(velocity * Time.deltaTime);
        if ((Input.GetKey("left shift") || Input.GetKey("right shift")) && controller.isGrounded && !Input.GetKey(KeyCode.S) && !Input.GetKey(KeyCode.DownArrow))
        {
            velocity = (transform.forward * currentDir.y + transform.right * currentDir.x) * RunSpeed + Vector3.up * velocity.y;
            controller.Move(velocity * Time.deltaTime);
        }

      
    

}

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
46
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Когда вы используете контроллер персонажа, вам нужно сделать все расчеты для всех ситуаций. Чтобы получить результат, который вы ищете, вы можете сделать расчет между прыжком и скоростью ходьбы.

Другой способ — использовать жесткое тело (зафиксировать вращение) и добавить силы для прыжка и движения.

оба примера здесь: https://thewikihow.com/video_b1uoLBp2I1w

Ответ принят как подходящий

Я оптимизировал приведенный выше код и удалил некоторые дубликаты. Я также заметил, что проблема со скоростью была связана с наличием isGrounded в теле условия бега, из-за чего бег зависел от нахождения на земле. Это скрипт плеера:

   public class Player : MonoBehaviour
    {
        [SerializeField] Transform playerCamera = null;
        [SerializeField] float mouseSensitivity = 3.5f;
        [SerializeField] float walkSpeed = 10.0f;
        [SerializeField] float runSpeed = 12.0f;
        [SerializeField] float gravity = 9.81f;
        [SerializeField] bool lockCursor = true;
        [SerializeField] [Range(0.0f, 0.5f)] float moveSmoothTime = 0.3f;
        public float jumpHeight = 3f;
    
        Vector3 velocity;
        private float verticalVelocity;

        private Vector3 inputVector;
        float cameraPitch = 0.0f;
    
        CharacterController controller = null;
        Vector2 currentDir = Vector2.zero;
        Vector3 currentDirVelocity = Vector3.zero;
        Vector2 currentMouseDelta = Vector2.zero;
        Vector2 currentMouseDeltaVelocity = Vector2.zero;

        void Start()
        {
            controller = GetComponent<CharacterController>();
            
            if (lockCursor)
            {
                Cursor.lockState = CursorLockMode.Locked;
                Cursor.visible = false;
            }
        }
        void Update()
        {
            UpdateMouseLook();
            UpdateMovement();
        }
        void UpdateMouseLook()
        {
            var targetMouseDelta = new Vector2(Input.GetAxis("Mouse X"), Input.GetAxis("Mouse Y"));
    
            currentMouseDelta = Vector2.SmoothDamp(currentMouseDelta, targetMouseDelta, ref currentMouseDeltaVelocity, moveSmoothTime);
    
            cameraPitch -= currentMouseDelta.y * mouseSensitivity;
    
            cameraPitch = Mathf.Clamp(cameraPitch, -90.0f, 90.0f);
    
            playerCamera.localEulerAngles = Vector3.right * cameraPitch;
    
            transform.Rotate(Vector3.up * currentMouseDelta.x * mouseSensitivity);
        }

        void UpdateMovement()
        {
            // jumping
            var isGrounded = Physics.Raycast(transform.position, Vector3.down, 1.1f) && velocity.y <= 0;

            if (isGrounded) 
            {
                velocity.y = Input.GetKeyDown(KeyCode.Space) ? Mathf.Sqrt(jumpHeight) : 0f;
            }
            else
            {
                velocity += (velocity.y < 0 ? Physics.gravity * 2 : Physics.gravity) * Time.deltaTime;
            }
            
            controller.Move(velocity);
            
            // movement
            inputVector = new Vector3(Input.GetAxisRaw("Horizontal"), 0, Input.GetAxisRaw("Vertical")).normalized;

            var smoothDamp = Vector3.SmoothDamp(inputVector, inputVector, ref currentDirVelocity, moveSmoothTime);

            var runKey = (Input.GetKey(KeyCode.LeftShift) || Input.GetKey(KeyCode.RightShift)) &&
                         !Input.GetKey(KeyCode.S) && !Input.GetKey(KeyCode.DownArrow);

            controller.Move(smoothDamp * (runKey ? runSpeed : walkSpeed) * Time.deltaTime);
        }
    }

Также эти настройки подходили для капсулы высотой 2:

Если ваш персонаж больше 2, отрегулируйте длину обнаружения земли raycast соответственно, потому что условие controller.isGrounded не всегда работает.

Теперь клавиши со стрелками перевернуты, стрелка влево заставляет идти вправо и так далее. и он больше не прыгает и не бегает.

Okashi 13.05.2022 20:04

Переворачивание клавиш может быть связано с переворачиванием камеры. Если это так, добавьте - за Input.GetAxisRaw("Horizontal"). Клавишу прыжка я помещал в пробел, конечно, вы можете изменить ее вручную, запуск также был протестирован. run работает с правой или левой клавишей Shift.

KiynL 13.05.2022 20:26

для меня текущее значение было слишком низким, что делало его незаметным. когда я изменил его, это сработало. но все еще не прыгает, а стрелки переворачиваются. Я пробовал это: но ничего не меняет. я постараюсь заставить его работать

Okashi 13.05.2022 23:06

Я настраиваю скрипт с единичным базовым масштабом (как обычно, как .gif, я загрузил 2 высоты для персонажа). Я думаю, что Ваш проект может иметь большие размеры и нуждаться в адаптации. для перевернутой оси, если - это было неэффективно, я действительно понятия не имею, почему ключи были перевернуты, потому что я проверил их, и это было хорошо. Я знаю только, что следующий шаг в улучшении — это добавление координации между клавишами и камерой, что делается с помощью Camera.transformDirection. Конечно, это улучшение подходит для 3D игр и обычно не требует 2D и 2.5D.й, но может и могло бы, но может решить проблему направлений.

KiynL 14.05.2022 02:37

Большое спасибо за вашу помощь, ваши усилия оценены по достоинству. Можете ли вы помочь мне и здесь? stackoverflow.com/questions/72242442/… Я приму ваш ответ и проголосую за вас, если ваш ответ помог

Okashi 14.05.2022 21:28

@Okashi Взаимное спасибо, друг, я постараюсь отправить сообщение в ближайшее время.

KiynL 15.05.2022 03:47

Другие вопросы по теме