@LeBrone

Как сделать чтобы Player наносил урон Enemy?

Я новичок. Написал скрипт чтобы Player атаковал Enemy, но урон не проходит по Enemy. Помогите пожалуйста.
Скрипт атаки:
void Attack()
    {
        anim.SetTrigger("Attack");

        Collider2D[] hitEnemies = Physics2D.OverlapCircleAll(attackPoint.position, attackRange, enemyLayers);
         
        if (collision.tag == "Enemy")
        {
            collision.GetComponent<Health>().TakeDamage(damage);
        }
    }


Скрипт Damage:
public void TakeDamage(int damage)
    {
        currentHealth -= damage;

        if (currentHealth <= 0)
        {
            Die();
        }
    }
  • Вопрос задан
  • 2023 просмотра
Решения вопроса 1
@Ente
Unity developer
Сделай себе два скрипта, первый будет для всех объектов в игре, которые обладают здоровьем, это могут быть персонажи (твой игрок, враги), предметы (двери, стены и т.п.)

У этих объектов будет скрипт, назовем его Health.cs

[SerializedField] private int hitpoints = 100;
public Action<int, int> OnChange;

public void Change(int amount)
{
           hitpoints += amount;
           OnChange?.Invoke(hitpoints, amount);
}


В этом скрипте можно будет менять здоровье через функцию Change, причем в любую сторону, может проходить и урон, так и лечение, все зависит от знака в переданной переменной amount. Также скрипт бросает событие, что здоровье изменилось, чтобы другие скрипты могли подписаться и отреагировать. Например, скрипт, который рисует полосу здоровья или скрипт, который отвечает за смерть персонажа.

Второй скрипт - Damage.cs. Он будет работать на триггерах в Unity, и когда объекты пересекаются между собой, то происходит вызов функции урона, например, если персонаж встанет в огонь, его затронет пуля или меч. Само собой нужно проставить им триггеры нужного размера, как объекту с уроном, так и тому, кому наносится урон + поставить правильно матрицу коллизий, чтобы OnTriggerEnter2D не затрагивал другие объекты, которые не являются его целью.

[SerializedField] private int amount = -10;
public Action<int> OnDamage;

private void OnTriggerEnter2D(Collider2D collider)
{
      collider.gameObject.GetComponent<Health>().Change(amount);
      OnDamage?.Invoke(amount);
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы