Есть скрипт противника, и его радиус атаки написан через OnTriggerStay2D, но он работает не коректно, урон проходит 2 раза. Я хочу написать его через Collider2D[] enemies = Physics2D.OverlapCircleAll как у игрока, но из за того что я новичок и пока не понимаю что да как, у меня не получается это сделать. Подскажите как лучше написать скрипт чтобы урон проходил адекватно а не через два коллайдера?
Вот скрипт врага
public class Enemy : MonoBehaviour
{
private float timeBtwAttack;
public float startTimeBtwAttack;
public int health;
public float speed;
public int damage;
private float stopTime;
public float startStopTime;
public float normalSpeed;
private Player player;
private Animator anim;
private bool _isPlayerNear;
private void Start()
{
anim = GetComponent<Animator>();
player = FindObjectOfType<Player>();
normalSpeed = speed;
_isPlayerNear = false;
}
private void Update()
{
if(stopTime <= 0)
{
speed = normalSpeed;
}
else
{
speed = 0;
stopTime -= Time.deltaTime;
}
if(health <= 0)
{
Destroy(gameObject);
}
if(player.transform.position.x > transform.position.x)
{
transform.eulerAngles = new Vector3(0, 180, 0);
}
else
{
transform.eulerAngles = new Vector3(0, 0, 0);
}
transform.position = Vector2.MoveTowards(transform.position, player.transform.position, speed * Time.deltaTime);
}
public void TakeDamage(int damage)
{
stopTime = startStopTime;
health -= damage;
}
public void OnTriggerStay2D(Collider2D other)
{
if (other.CompareTag("Player"))
{
if (timeBtwAttack <= 0)
{
anim.SetTrigger("enemyAttack");
}
else
{
timeBtwAttack -= Time.deltaTime;
}
_isPlayerNear = true;
}
}
public void OnTriggerExit2D(Collider2D other)
{
if (other.CompareTag("Player"))
{
_isPlayerNear = false;
}
}
public void OnEnemyAttack()
{
if (_isPlayerNear)
{
player.health -= damage;
}
timeBtwAttack = startTimeBtwAttack;
}
}
Вот скрипт атаки игрока
public class PlayerAttack : MonoBehaviour
{
private float timeBtwAttack;
public float startTimeBtwAttack;
public Transform attackPos;
public LayerMask enemy;
public float attackRange;
public int damage;
public Animator anim;
private void Update()
{
if(timeBtwAttack <= 0)
{
if (Input.GetMouseButton(0))
{
anim.SetTrigger("attack");
timeBtwAttack = startTimeBtwAttack;
}
}
else
{
timeBtwAttack -= Time.deltaTime;
}
}
public void OnAttack()
{
Collider2D[] enemies = Physics2D.OverlapCircleAll(attackPos.position, attackRange, enemy);
for (int i = 0; i < enemies.Length; i++)
{
enemies[i].GetComponent<Enemy>().TakeDamage(damage);
}
for (int i = 0; i < enemies.Length; i++)
{
Debug.Log(enemies[i]);
}
}
private void OnDrawGizmosSelected()
{
Gizmos.color = Color.red;
Gizmos.DrawWireSphere(attackPos.position, attackRange);
}
}