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


using UnityEngine;

public class EnemyFox : MonoBehaviour
{
    [Header("Нарактеристики движения")]
    public float walkSpeed = 2f;         // Скорость обычного патруля
    public float runSpeed = 5f;          // Скорость погони за белкой
    public Transform pointA;             // Левая граница патруля
    public Transform pointB;             // Правая граница патруля

    [Header("Охота")]
    public float chaseRange = 6f;        // Радиус, в котором лиса замечает белку
    public float kickForceX = 6f;        // Сила отброса белки
    public float kickForceY = 5f;

    private Transform targetPoint;
    private Transform playerTransform;
    private bool isChasing = false;
    private SpriteRenderer spriteRenderer;
    private Rigidbody2D rb;

    void Start()
    {
        spriteRenderer = GetComponent<SpriteRenderer>();
        rb = GetComponent<Rigidbody2D>();
        targetPoint = pointB;

        // Автоматически находим белку на сцене по тегу
        GameObject player = GameObject.FindWithTag("Player");
        if (player != null)
        {
            playerTransform = player.transform;
        }
    }

    void Update()
    {
        if (playerTransform == null) return;

        // Считаем расстояние до белки
        float distanceToPlayer = Vector2.Distance(transform.position, playerTransform.position);

        if (distanceToPlayer <= chaseRange)
        {
            // Лиса увидела белку -> Режим погони!
            isChasing = true;
            ChasePlayer();
        }
        else
        {
            // Белка далеко -> Лиса спокойно патрулирует
            if (isChasing) 
            {
                // Если только что потеряла из виду, возвращается к патрулю
                isChasing = false;
                targetPoint = (Vector2.Distance(transform.position, pointA.position) < Vector2.Distance(transform.position, pointB.position)) ? pointB : pointA;
            }
            Patrol();
        }
    }

    void Patrol()
    {
        // Движение между точками А и Б
        transform.position = Vector2.MoveTowards(transform.position, new Vector2(targetPoint.position.x, transform.position.y), walkSpeed * Time.deltaTime);

        if (Vector2.Distance(transform.position, new Vector2(targetPoint.position.x, transform.position.y)) < 0.2f)
        {
            targetPoint = (targetPoint == pointB) ? pointA : pointB;
        }

        // Разворот спрайта
        float direction = targetPoint.position.x - transform.position.x;
        FlipSprite(direction);
    }

    void ChasePlayer()
    {
        // Бежим строго в сторону белки по горизонтали
        float directionToPlayer = playerTransform.position.x - transform.position.x;
        
        transform.position = Vector2.MoveTowards(transform.position, new Vector2(playerTransform.position.x, transform.position.y), runSpeed * Time.deltaTime);
        
        FlipSprite(directionToPlayer);
    }

    void FlipSprite(float direction)
    {
        if (direction > 0 && spriteRenderer != null)
        {
            transform.localScale = new Vector3(Mathf.Abs(transform.localScale.x), transform.localScale.y, transform.localScale.z); // Смотрит вправо
        }
        else if (direction < 0 && spriteRenderer != null)
        {
            transform.localScale = new Vector3(-Mathf.Abs(transform.localScale.x), transform.localScale.y, transform.localScale.z); // Смотрит влево
        }
    }

    // Столкновение и нанесение урона
    private void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.gameObject.CompareTag("Player"))
        {
            PlayerController player = collision.gameObject.GetComponent<PlayerController>();
            Rigidbody2D playerRb = collision.gameObject.GetComponent<Rigidbody2D>();

            if (player != null && playerRb != null)
            {
                player.TakeDamage(); // Твоя анимация Hurt

                // Отбрасываем белку
                float side = Mathf.Sign(collision.transform.position.x - transform.position.x);
                playerRb.velocity = Vector2.zero; 
                playerRb.AddForce(new Vector2(side * kickForceX, kickForceY), ForceMode2D.Impulse);
            }
        }
    }

    // Визуальное отображение радиуса атаки в окне Scene (для удобства настройки)
    private void OnDrawGizmosSelected()
    {
        Gizmos.color = Color.red;
        Gizmos.DrawWireSphere(transform.position, chaseRange);
    }
}