Персонаж не прыгает, но в if заходит.
using UnityEngine;
public class PlayerMovement : MonoBehaviour
{
[Header("Компоненты")]
[SerializeField] private CharacterController _controller;
[SerializeField] private Transform _camera;
[Header("Настройки движения")]
[SerializeField] private float _speed = 5f;
[SerializeField] private float _sensitivity = 4f;
[SerializeField] private float _smoothTime = 0.1f;
[Header("Настройки прыжка и гравитации")]
[SerializeField] private float _gravity = -9.81f;
[SerializeField] private float _groundedGravity = -0.5f;
[SerializeField] private float _jumpHeight = 12f;
[SerializeField] private float _jumpCooldown = 0.1f;
private float jumpForce => Mathf.Sqrt(_jumpHeight * -2f * _gravity);
private Vector2 currentRotation;
private Vector3 moveDirection;
private float currentVelocityY;
private bool isInitialized;
private bool canJump = true;
private float jumpCooldownTimer;
private void Awake()
{
// Проверка и получение компонентов
if (_controller == null)
_controller = GetComponent<CharacterController>();
if (_camera == null)
_camera = Camera.main.transform;
currentRotation = new Vector2(0, transform.eulerAngles.y);
// Блокировка и скрытие курсора
Cursor.lockState = CursorLockMode.Locked;
Cursor.visible = false;
isInitialized = true;
}
private void OnDisable()
{
// Разблокировка курсора при отключении скрипта
Cursor.lockState = CursorLockMode.None;
Cursor.visible = true;
}
private void Update()
{
if (!isInitialized) return;
HandleMovement();
HandleJump();
HandleRotation();
ApplyGravity();
}
private void HandleMovement()
{
// Получаем входные данные для движения
float moveX = Input.GetAxis("Horizontal");
float moveZ = Input.GetAxis("Vertical");
// Вычисляем направление движения относительно поворота игрока
moveDirection = transform.right * moveX + transform.forward * moveZ;
moveDirection = Vector3.ClampMagnitude(moveDirection, 1f) * _speed;
// Применяем движение с учетом гравитации
Vector3 movement = moveDirection + new Vector3(0, currentVelocityY, 0);
_controller.Move(movement * Time.deltaTime);
}
private void HandleRotation()
{
// Получаем движение мыши
float mouseX = Input.GetAxis("Mouse X") * _sensitivity;
float mouseY = Input.GetAxis("Mouse Y") * _sensitivity;
// Обновляем вращение
currentRotation.x = Mathf.Clamp(currentRotation.x - mouseY, -90f, 90f);
currentRotation.y += mouseX;
// Применяем вращение к камере и игроку
_camera.localRotation = Quaternion.Euler(currentRotation.x, 0, 0);
transform.rotation = Quaternion.Euler(0, currentRotation.y, 0);
}
private void HandleJump()
{
if (Input.GetKeyDown(KeyCode.Space) && _controller.isGrounded && canJump && jumpCooldownTimer <= 0f)
{
Debug.Log("1");
currentVelocityY = jumpForce;
canJump = false;
jumpCooldownTimer = _jumpCooldown;
}
if (!canJump)
{
jumpCooldownTimer -= Time.deltaTime;
if (jumpCooldownTimer <= 0f)
{
canJump = true;
}
}
}
private void ApplyGravity()
{
if (_controller.isGrounded)
{
// Небольшая отрицательная сила, чтобы держать персонажа на земле
currentVelocityY = _groundedGravity;
}
else
{
// Применяем гравитацию
currentVelocityY += _gravity * Time.deltaTime;
}
}
}