using UnityEngine;
[RequireComponent(typeof(CharacterController))]
public class PlayerController : MonoBehaviour
{
[Header("Movement")]
public float speed = 6f;
public float gravity = -20f;
[Header("Jump")]
public float jumpForce = 8f;
public int maxJumps = 3; // двойной = 2, тройной = 3
[Header("Slide")]
public float slideSpeed = 12f;
public float slideDuration = 1f;
private CharacterController controller;
private Vector3 velocity;
private int jumpCount;
private bool isSliding;
private float slideTimer;
void Start()
{
controller = GetComponent<CharacterController>();
}
void Update()
{
Move();
HandleJump();
HandleSlide();
ApplyGravity();
}
void Move()
{
float h = Input.GetAxis("Horizontal");
float v = Input.GetAxis("Vertical");
Vector3 move = transform.right * h + transform.forward * v;
if (!isSliding)
controller.Move(move * speed * Time.deltaTime);
}
void HandleJump()
{
if (controller.isGrounded)
{
jumpCount = 0;
if (velocity.y < 0)
velocity.y = -2f;
}
if (Input.GetButtonDown("Jump") && jumpCount < maxJumps)
{
velocity.y = Mathf.Sqrt(jumpForce * -2f * gravity);
jumpCount++;
}
}
void HandleSlide()
{
if (isSliding)
{
slideTimer -= Time.deltaTime;
controller.Move(transform.forward * slideSpeed * Time.deltaTime);
if (slideTimer <= 0)
isSliding = false;
}
}
void ApplyGravity()
{
velocity.y += gravity * Time.deltaTime;
controller.Move(velocity * Time.deltaTime);
}
private void OnControllerColliderHit(ControllerColliderHit hit)
{
if (hit.collider.CompareTag("SlidePlatform"))
{
StartSlide();
}
}
void StartSlide()
{
isSliding = true;
slideTimer = slideDuration;
}
}