Я делая управление персонажу, а конкретно прыжок, столкнулся с проблемой.
Когда игрок стоит на месте, нажимая на пробел, игрок не прыгает, если же игрок будет двигаться, то игрок будет непрерывно прыгать (это обусловлено методом GetButton). Возникает вопрос,
как исправить проблему с прыжком?
using System;
using UnityEngine;
public class Controller : MonoBehaviour
{
[SerializeField] Transform orientation;
[Header("Настройки игрока")]
[SerializeField] private float sprintSpeed = 10f;
[SerializeField] private float walkSpeed = 5f;
[SerializeField] private float jumpHeight = 2f;
private Vector3 yMove;
private Vector3 direction;
private CharacterController controller;
private float speed;
private float gravity = 9.81f;
private float verticalVelocity;
private float sprintTransitSpeed = 5f;
public Climbing intermediary;
private void Start()
{
controller = GetComponent<CharacterController>();
Cursor.lockState = CursorLockMode.Locked;
Cursor.visible = false;
}
private void Update()
{
if(intermediary.isClimb == false)
{
InputManagment();
MoveOnGround();
}
else
{
ClimbCalculation();
}
yCalculation();
}
private void InputManagment()
{
direction.x = Input.GetAxisRaw("Horizontal");
direction.z = Input.GetAxisRaw("Vertical");
}
private void MoveOnGround()
{
Vector3 move = orientation.forward * direction.z + orientation.right * direction.x;
if (Input.GetKey(KeyCode.LeftShift))
{
speed = Mathf.Lerp(speed, sprintSpeed, sprintTransitSpeed * Time.deltaTime);
}
else
{
speed = Mathf.Lerp(speed, walkSpeed, sprintTransitSpeed * Time.deltaTime);
}
controller.Move(move.normalized * speed * Time.deltaTime);
}
private void yCalculation()
{
yMove.y = GravityCalculation();
controller.Move(yMove * Time.deltaTime);
}
private void ClimbCalculation()
{
if (Input.GetKey(KeyCode.W))
{
verticalVelocity = 2f;
}
else if (Input.GetKey(KeyCode.S))
{
verticalVelocity = -2f;
}
else
{
verticalVelocity = 0;
}
controller.Move(Vector3.up * verticalVelocity * Time.deltaTime);
}
private float GravityCalculation()
{
if (controller.isGrounded)
{
verticalVelocity = 0;
if (Input.GetButton("Jump")) //реализация прыжка
{
verticalVelocity = jumpHeight;
}
}
else
{
verticalVelocity -= gravity * Time.deltaTime;
}
return verticalVelocity;
}
}
Механика прыжка реализована в методе GravityCalculation. На метод ClimbCalculation не стоит обращать внимания, здесь он не играет какую-то роль.