Движение Unity FPS

Я создал FPS-контроллер с жестким корпусом по учебнику youtube, и все работает нормально, кроме диагонального движения, так как скорость x1,4 ошибочна. Итак, я попробовал vector3.normalized и vector3.ClampMagnitude, но, похоже, это не вариант для моего решения контроллера fps, поскольку скорость становится постоянной и неизменной. Исходный код:

    x = Input.GetAxis("Horizontal") * speed * Time.deltaTime;
    z = Input.GetAxis("Vertical") * speed * Time.deltaTime;

    Vector3 moveVec = orientation.right * x + orientation.forward * z + Vector3.up * rb.velocity.y;      
    rb.velocity = moveVec;

Итак, я попробовал это

    x = Input.GetAxis("Horizontal") ;
    z = Input.GetAxis("Vertical");

    Vector3 moveVec = Vector3.ClampMagnitude(orientation.right * x + orientation.forward * z + 
    Vector3.up * rb.velocity.y, 1.0f) * speed * Time.deltaTime;      
    rb.velocity = moveVec;   

И это сработало, но когда я ударяю по объекту и получаю какое-то случайное преобразование Y, я летаю в воздухе, так как rb.velocity также умножается на скорость и deltaTime. Какие-нибудь советы?


person Pawnee    schedule 20.03.2021    source источник


Ответы (1)


Отделите свой вход от текущей скорости и примените множитель speed только к входу.

Обратите внимание, что вы имеете дело с скоростью, которая выражается в единицах Unity в секунду. = ›Здесь не умножать на Time.deltaTime!

x = Input.GetAxis("Horizontal");
z = Input.GetAxis("Vertical");

Vector3 moveVec = Vector3.ClampMagnitude(orientation.right * x + orientation.forward * z, 1.0f) * speed;
moveVec += Vector3.up * rb.velocity.y;    
rb.velocity = moveVec;
person derHugo    schedule 21.03.2021
comment
спасибо большое, это именно то, что я не мог понять) - person Pawnee; 21.03.2021