ИИ врага, патрулирование по точкам, преследование и возвращение к патрулированию
Помогите написать ИИ для патрулирующего врага Unity2D. Нашел несколько скриптов на просторах интернета, но соединить их в 1 не могу. Враг должен ходить по точкам при патрулировании и если игрок входит в зону агро врага он его преследует и атакует в ближнем бою и если игрок убегает от него, он возвращается к патрулированию. Ниже приложу скрипт, в нем у меня враг двигается не при помощи RigetBody, а хотелось бы чтобы враг был не как картинка.
[Header("Здоровье")]
public float maxHealth = 10;
public float currentHealth;
private PlayerController playerHealth;
[Header("Скорость")]
[SerializeField] private float speed;
[Header("Параметр Атаки")]
[SerializeField] public float damage;
[SerializeField] private float attackCooldown;
[Header("Зона поражения")]
[SerializeField] private float range;
[SerializeField] private float rangeY;
[SerializeField] private float colliderDistance;
[SerializeField] private BoxCollider2D boxCollider;
[SerializeField] private LayerMask playerLayer;
private float cooldownTimer = Mathf.Infinity;
private Animator anim;
private EnemyPatrol enemyPatrol;
private void Start()
{
anim = GetComponent<Animator>();
enemyPatrol = GetComponentInParent<EnemyPatrol>();
}
private void Update()
{
currentHealth = maxHealth;
cooldownTimer += Time.deltaTime;
if (PlayerInSight())
{
if (cooldownTimer >= attackCooldown)
{
cooldownTimer = 0;
anim.SetTrigger("Attack");
}
}
if(enemyPatrol != null)
enemyPatrol.enabled = !PlayerInSight();
}
//получение урона
public void TakeDamage(float damage)
{
currentHealth -= damage;
//тут могла бы быть ваша анимация получения урона
Debug.Log("Вы нанесли урон " + damage);
if(currentHealth <= 0)
{
//GetComponentInParent<PlayerController>().enabled = false;
Die();
}
}
private bool PlayerInSight()
{
//параметры зоны отрисовки
RaycastHit2D hit = Physics2D.BoxCast(boxCollider.bounds.center + transform.right * range * transform.localScale.x * colliderDistance,
new Vector3(boxCollider.bounds.size.x * range, boxCollider.bounds.size.y * rangeY, boxCollider.bounds.size.z), 0, Vector2.left, 0, playerLayer);
if (hit.collider != null)
playerHealth = hit.transform.GetComponent<PlayerController>();
return hit.collider != null;
}
//отоброжение зоны порожения
private void OnDrawGizmos()
{
Gizmos.color = Color.red;
Gizmos.DrawWireCube(boxCollider.bounds.center + transform.right * range * transform.localScale.x * colliderDistance,
new Vector3(boxCollider.bounds.size.x * range, boxCollider.bounds.size.y * rangeY, boxCollider.bounds.size.z));
}
private void DamagePlayer()
{
if (PlayerInSight())
{
playerHealth.TakeDamage(damage);
}
}
void Die()
{
anim.SetTrigger("Die");
if (GetComponentInParent<EnemyPatrol>() != null)
GetComponentInParent<EnemyPatrol>().enabled = false;
if (GetComponentInParent<Enemy>() != null)
GetComponentInParent<Enemy>().enabled = false;
//GetComponent<Collider2D>().enabled = false;
//this.enabled = false;
}