Unity / C # Странный глюк в контроллере FPS

1

у меня странный сбой, когда я спускаюсь с угла (я не нажимаю прыжок), игрок будет падать с очень быстрой скоростью. Если я прыгну, то все будет нормально. (Его контроллер Quill18 FPS, я узнаю оттуда, поэтому поэтому я не использую встроенный контроллер)

using UnityEngine;
using System.Collections;    
[RequireComponent (typeof(CharacterController))]
public class FirstPersonController : MonoBehaviour
{

    public float movementSpeed = 5.0f;
    public float mouseSensitivity = 5.0f;
    public float jumpSpeed = 20.0f;

    float verticalRotation = 0;
    public float upDownRange = 60.0f;

    float verticalVelocity = 0;

    CharacterController characterController;

    // Use this for initialization
    void Start()
    {
//     Screen.lockCursor = true;
       characterController = GetComponent<CharacterController>();
    }

    // Update is called once per frame
    void Update() 
    {
       // Rotation

       float rotLeftRight = Input.GetAxis("Mouse X") * mouseSensitivity;
       transform.Rotate(0, rotLeftRight, 0);

       verticalRotation -= Input.GetAxis("Mouse Y") * mouseSensitivity;
       verticalRotation = Mathf.Clamp(verticalRotation, -upDownRange, upDownRange);
       Camera.main.transform.localRotation = Quaternion.Euler(verticalRotation, 0, 0);

       // Movement

       float forwardSpeed = Input.GetAxis("Vertical") * movementSpeed;
       float sideSpeed = Input.GetAxis("Horizontal") * movementSpeed;

       verticalVelocity += Physics.gravity.y * Time.deltaTime;

       if (characterController.isGrounded && Input.GetButton("Jump"))
       {
          verticalVelocity = jumpSpeed;
       }

       Vector3 speed = new Vector3(sideSpeed, verticalVelocity, forwardSpeed ;

       speed = transform.rotation * speed;

       characterController.Move(speed * Time.deltaTime);
    }
}
  • 0
    Вы уверены, что это что-то аномальное, что вы видите? Я имею в виду, вы достигнете заданной скорости понижения быстрее от падения с места, чем от прыжка, именно так работает кинематика.
  • 0
    Да, если я не прыгну, просто сойди с лестницы, это почти как телепорт на пол.
Показать ещё 3 комментария
Теги:
unity3d

1 ответ

1

Проблема в том, что каждый кадр, в котором выполняется эта строка:

verticalVelocity + = Physics.gravity.y * Time.deltaTime;

Таким образом, вы набираете "импульс" каждую секунду, и он не останавливается до тех пор, пока вы не прыгаете, потому что вы "перезагружаете" скорость Y до нормального значения. Раньше я сталкивался с этой проблемой, и ее можно устранить просто добавлением скорости Y, когда вы не заземлены. Вы можете использовать Raycast, чтобы проверить, есть ли у вас земля, а если нет, увеличьте verticalVelocity на эту сумму.

  • 0
    Спасибо за помощь, даже если я новичок, так могу ли я попросить код для включения в сценарий? Если это не займет много времени для вас.
  • 0
    Если вы новичок, то я советую не спрашивать код, но гораздо приятнее получать вещи самостоятельно. Однако я могу сказать, что вы можете использовать Raycast, чтобы проверить, находитесь ли вы на земле, и, если это так, не добавляйте verticalVelocity , необходимая документация находится здесь, Raycast . Я надеюсь, что это поможет вам!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню