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


using UnityEngine;

public class PlayerController : MonoBehaviour
{
    [Header("Настройки движения")]
    public float speed = 8f;
    public float jumpForce = 12f;

    [Header("Настройки двойного прыжка")]
    public int maxJumps = 2;              // Сколько всего прыжков можно сделать
    private int jumpsRemaining;           // Сколько прыжков осталось в текущий момент
    public ParticleSystem jumpEffect;     // Сюда перетащим эффект из инспектора

    private Rigidbody2D rb;
    private Animator anim;
    private bool isGrounded;

    void Start()
    {
        // Привязываем компоненты
        rb = GetComponent<Rigidbody2D>();
        anim = GetComponent<Animator>();
    }

    void Update()
    {
        // 1. Получаем ввод с клавиатуры (A/D или стрелки)
        float moveInput = Input.GetAxis("Horizontal");

        // 2. Двигаем персонажа
        rb.velocity = new Vector2(moveInput * speed, rb.velocity.y);

        // 3. ПЕРЕДАЕМ СКОРОСТЬ В АНИМАТОР
        // Mathf.Abs делает число всегда положительным (даже если бежим влево, скорость будет > 0)
        anim.SetFloat("Speed", Mathf.Abs(moveInput));

        // 4. РАЗВОРАЧИВАЕМ СПРАЙТ
        if (moveInput > 0)
        {
            transform.localScale = new Vector3(3, 3, 1); // Смотрит вправо
        }
        else if (moveInput < 0)
        {
            transform.localScale = new Vector3(-3, 3, 1); // Смотрит влево (зеркально)
        }

        // Обновляем количество доступных прыжков, когда белка гарантированно стоит на земле
        if (isGrounded)
        {
            jumpsRemaining = maxJumps;
        }

        // 5. ПРЫЖОК
        if (Input.GetButtonDown("Jump"))
        {
            // Первый обычный прыжок с земли
            if (isGrounded)
            {
                rb.velocity = new Vector2(rb.velocity.x, 0f); // Сбрасываем лишнюю скорость по Y перед толчком
                rb.AddForce(Vector2.up * jumpForce, ForceMode2D.Impulse);
                jumpsRemaining--; // Тратим первый прыжок
            }
            // Второй прыжок в воздухе (срабатывает, если мы уже летим и остался запас)
            else if (jumpsRemaining > 1)
            {
                rb.velocity = new Vector2(rb.velocity.x, 0f); // Сбрасываем падение, чтобы второй прыжок ощущался мощно
                rb.AddForce(Vector2.up * jumpForce, ForceMode2D.Impulse);
                jumpsRemaining--; // Тратим второй прыжок

                // Включаем эффект пыли, если он привязан
                if (jumpEffect != null)
                {
                    jumpEffect.Play();
                }
            }
        }

        anim.SetFloat("yVelocity", rb.velocity.y);

        // Передаем, на земле ли мы (используй свою переменную заземления, например isGrounded)
        anim.SetBool("isGrounded", isGrounded);
    }

    // Проверка касания земли (не забудь поставить тег Ground на землю!)
    private void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.gameObject.CompareTag("Ground"))
        {
            isGrounded = true;
        }
    }

    private void OnCollisionExit2D(Collision2D collision)
    {
        if (collision.gameObject.CompareTag("Ground"))
        {
            isGrounded = false;
        }
    }

    public void TakeDamage()
    {
        // Активируем триггер урона, аниматор сам переключит на анимацию Hurt
        anim.SetTrigger("Hurt");
    }
}