Загрузка данных


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;
    }
}