Загрузка данных
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);
}
}