Добавление приседания в FPS Player в Unity

Добавление механизма приседания может углубить погружение и придать тактическую глубину игровому процессу, особенно в играх от первого лица и стелс-играх. Основываясь на нашем руководстве Unity Контроллер FPS, в этом руководстве показано, как добавить функцию плавного приседания в Unity.

Предварительные условия

Шаги

  • В класс с именем 'SC_FPSController' из руководства Unity Контроллер FPS добавьте следующие переменные для обработки приседания:
public bool isCrouching = false;
public float crouchHeight = 0.5f;
public float crouchSpeed = 3.5f;
public float crouchTransitionSpeed = 10f;
private float originalHeight;
public float crouchCameraOffset = -0.5f;
private Vector3 cameraStandPosition;
private Vector3 cameraCrouchPosition;
  • Измените метод 'Start()', чтобы сохранить исходную высоту 'CharacterController' и установить положения камеры:
void Start()
{
    characterController = GetComponent<CharacterController>();
    originalHeight = characterController.height;

    // Define camera positions for standing and crouching
    cameraStandPosition = playerCamera.transform.localPosition;
    cameraCrouchPosition = cameraStandPosition + new Vector3(0, crouchCameraOffset, 0);

    // Lock cursor
    Cursor.lockState = CursorLockMode.Locked;
    Cursor.visible = false;
}
  • В методе 'Update()' проверьте нажатие клавиши приседания и переключите переменную 'isCrouching':
if (Input.GetKeyDown(KeyCode.C) && canMove)
{
    isCrouching = !isCrouching;

    if (isCrouching)
    {
        characterController.height = crouchHeight;
        walkingSpeed = crouchSpeed;
    }
    else
    {
        characterController.height = originalHeight;
        walkingSpeed = 7.5f;
    }
}
  • За пределами предыдущего блока реализуйте плавный переход положения камеры между приседанием и стоянием:
if (isCrouching)
{
    playerCamera.transform.localPosition = Vector3.Lerp(playerCamera.transform.localPosition, cameraCrouchPosition, crouchTransitionSpeed * Time.deltaTime);
}
else
{
    playerCamera.transform.localPosition = Vector3.Lerp(playerCamera.transform.localPosition, cameraStandPosition, crouchTransitionSpeed * Time.deltaTime);
}
  • Отрегулируйте скорость движения игрока в зависимости от текущего состояния:
float curSpeedX = canMove ? (isRunning ? runningSpeed : (isCrouching ? crouchSpeed : walkingSpeed)) * Input.GetAxis("Vertical") : 0;
float curSpeedY = canMove ? (isRunning ? runningSpeed : (isCrouching ? crouchSpeed : walkingSpeed)) * Input.GetAxis("Horizontal") : 0;

Вопросы:

  1. Зачем использовать 'Vector3.Lerp()' для перехода камеры во время приседания? : Функция 'Vector3.Lerp()' используется для плавной интерполяции между двумя векторами. В этом контексте это позволяет камере плавно переходить из положения стоя в положение приседа, а не резко щелкать.
  2. Какова роль 'crouchTransitionSpeed'?: 'crouchTransitionSpeed' определяет, насколько быстро происходит переход между положением камеры приседая и стоя. Более высокое значение приводит к более быстрому переходу.
  3. Можно ли настроить клавишу приседания? : Абсолютно. Для клавиши приседания в настоящее время установлено значение 'C' ('KeyCode.C'). Замените его на любой желаемый 'KeyCode', чтобы настроить клавишу приседания.

Заключение

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