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