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


using UnityEngine;

[RequireComponent(typeof(CharacterController))]
public class PlayerController : MonoBehaviour
{
    [Header("Movement")]
    public float moveSpeed = 6f;
    public float gravity = -20f;

    [Header("Jump")]
    public float jumpHeight = 2f;
    public int maxJumps = 3; // 2 = двойной, 3 = тройной

    [Header("Sliding")]
    public float slideSpeed = 12f;

    [Header("Camera")]
    public Transform cameraTransform;
    public Vector3 cameraOffset = new Vector3(0, 5, -7);
    public float cameraSmooth = 5f;

    private CharacterController controller;

    private Vector3 velocity;
    private int jumpCount;

    private bool isSliding;

    void Start()
    {
        controller = GetComponent<CharacterController>();
    }

    void Update()
    {
        Move();
        Jump();
        ApplyGravity();
        CameraFollow();
    }

    void Move()
    {
        float x = Input.GetAxis("Horizontal");
        float z = Input.GetAxis("Vertical");

        Vector3 move = transform.right * x + transform.forward * z;

        float currentSpeed = isSliding ? slideSpeed : moveSpeed;

        controller.Move(move * currentSpeed * Time.deltaTime);
    }

    void Jump()
    {
        if (controller.isGrounded)
        {
            velocity.y = -2f;
            jumpCount = 0;
        }

        if (Input.GetButtonDown("Jump") && jumpCount < maxJumps)
        {
            velocity.y = Mathf.Sqrt(jumpHeight * -2f * gravity);
            jumpCount++;
        }
    }

    void ApplyGravity()
    {
        velocity.y += gravity * Time.deltaTime;
        controller.Move(velocity * Time.deltaTime);
    }

    void CameraFollow()
    {
        if (cameraTransform == null)
            return;

        Vector3 targetPosition = transform.position + cameraOffset;

        cameraTransform.position = Vector3.Lerp(
            cameraTransform.position,
            targetPosition,
            cameraSmooth * Time.deltaTime
        );

        cameraTransform.LookAt(transform);
    }

    private void OnControllerColliderHit(ControllerColliderHit hit)
    {
        if (hit.gameObject.CompareTag("SlidePlatform"))
        {
            isSliding = true;
        }
        else
        {
            isSliding = false;
        }
    }
}