Почему не работает, нанесение урона игроку?

Рейтинг: -1Ответов: 2Опубликовано: 17.07.2023

Имеется здание (Игрок) и враг. Враг движется к зданию и наносит урон при касании. Подскажите, что не так с кодом?

Это здание:

    public class Building : MonoBehaviour
{
    public int health = 100;
    public int level = 1;

    private Rigidbody2D rb;

    private void Start()
    {
        rb = GetComponent<Rigidbody2D>();
        rb.bodyType = RigidbodyType2D.Kinematic;
    }

    public void TakeDamage(int attackDamage)
    {
        health -= attackDamage;
        if (health <= 0)
        {
            Destroy(gameObject);
        }
    }

    public void Upgrade()
    {
        level++;
    }
}

Это враг:

    public class Enemy : MonoBehaviour
{
    public float movementSpeed = 5f;
    public int attackDamage = 10;

    private Transform target;

    private void Start()
    {
        target = GameObject.FindGameObjectWithTag("Building").transform;
    }

    private void Update()
    {
        // Движение врага к зданию
        transform.position = Vector2.MoveTowards(transform.position, target.position, movementSpeed * Time.deltaTime);
    }

    private void OnTriggerEnter2D(Collider2D other)
    {
        if (other.CompareTag("Building"))
        {
            // Атака здания
            Building building = other.GetComponent<Building>();
            if (building != null)
            {
                building.TakeDamage(attackDamage);
            }
        }
    }
}

Ответы

▲ 1

Unity всегда в консоли показывает ошибки. Предлагаю их читать. В данном случае Unity наверняка скажется, что строка other.CompareTag неправильная, а надо писать other.gameObject.CompareTag. Это написано в документации: https://docs.unity3d.com/ru/2020.2/ScriptReference/GameObject.CompareTag.html

В итоге, посмотрев в консоль и прочитав ошибку о коллайдере, вы могли пойти в документацию и свериться что не так с текущим кодом. Это примечание на будущее.

Также не лишним будет ознакомиться с этой темой:

Функции событий столкновений: OnCollisionEnter, OnCollisionEnter2D, OnCollisionStay, OnTriggerEnter

▲ 0

Замена "other.CompareTag" на "other.gameObject.CompareTag" не дала никаких результатов. Что бы урон наносился постоянно, нужно создать второй Collider2D и сделать его радиус чуть больше чем первый Collider2D. Так-же, для второго Collider2D необходимо поставить параметр "is Trigger" включённым, что бы область проходила через область здания. А что бы урон постоянно наносился, а не только при первом контакте со зданием, нужно заменить "OnTriggerEnter2D" на "OnTriggerStay2D" и можно добавить перезарядку, по желанию.

(У здания, параметр "Body Type" лучше выбрать "Static", а если вы хотите что бы здание можно было двигать, поставьте на "Dynamic")

Вот итоговый код:

public class Enemy : MonoBehaviour
{
    public float movementSpeed = 5f;
    public int attackDamage = 10;

    public float reloadTime = 2f;
    private bool isReloading = false;

    private Transform target;

    private void Start()
    {
        target = GameObject.FindGameObjectWithTag("Building").transform;
    }

    private void Update()
    {
        // Движение врага к зданию
        transform.position = Vector2.MoveTowards(transform.position, target.position, movementSpeed * Time.deltaTime);
    }

    private void OnTriggerStay2D(Collider2D other)
    {
        if (other.gameObject.CompareTag("Building"))
        {
            if (!isReloading)
            {
                // Атака здания
                Building building = other.GetComponent<Building>();
                if (building != null)
                {
                    building.TakeDamage(attackDamage);
                    isReloading = true;
                    Invoke("Reload", reloadTime);
                }
            }
        }
    }

    private void Reload()
    {
        isReloading = false;
    }
}