Вопрос Засчитывает 2 очка за 1 убийство.

Эксперт
Статус
Оффлайн
Регистрация
9 Апр 2020
Сообщения
1,442
Реакции[?]
671
Поинты[?]
30K
У меня вылетают 3 объекта, если условный враг натыкается на тег объекта, то он проигрывает анимацию взрыва, удаляет себя (объект врага), удаляет объект снаряда, и прибавляет очко за убийство.
Но тк у меня вылетает 3 снаряда, он может засчитать все 3 очка, но враг должен был удалиться после 1-го же попадания.
C#:
private void OnTriggerEnter2D(Collider2D Collision)
    {
        if (Collision.tag == "PlayerBulletTag")
        {
            Destroy(gameObject);
            Destroy(Collision.gameObject);     

            GameObject ExplosionObject = (GameObject)Instantiate(Explosion);
            ExplosionObject.transform.position = transform.position;

            PlayerStruct.Score += 1;
        }
    }
 
onetap.su technology
Пользователь
Статус
Оффлайн
Регистрация
20 Июн 2020
Сообщения
378
Реакции[?]
110
Поинты[?]
3K
Начинающий
Статус
Оффлайн
Регистрация
23 Ноя 2022
Сообщения
23
Реакции[?]
11
Поинты[?]
11K
Попробуй этот код.

C#:
// Добавляем логическую переменную к вражескому объекту
private bool hasBeenHit = false;

private void OnTriggerEnter2D(Collider2D collision)
{
    if (collision.CompareTag("PlayerBulletTag") && !hasBeenHit)
    {
        // Установите для переменной hasBeenHit значение true, чтобы указать, что враг был поражен
        hasBeenHit = true;

        // Уничтожить врага и снаряд
        Destroy(gameObject);
        Destroy(collision.gameObject);

        // Создаем объект взрыва
        GameObject explosionObject = Instantiate(Explosion, transform.position, Quaternion.identity);

        // Добавляем точку для убийства
        PlayerStruct.Score += 1;
    }
}
 
Пользователь
Статус
Оффлайн
Регистрация
29 Авг 2020
Сообщения
86
Реакции[?]
109
Поинты[?]
16K
Читаем юнити доки
Пожалуйста, авторизуйтесь для просмотра ссылки.

Actual object destruction is always delayed until after the current Update loop, but is always done before rendering.

То есть если у тебя в одном конкретном кадре все три пули попали во врага, то три раза будет вызван твой код.

И да, в этом случае поможет выставить флаг hasBeenHit в true, и проверять его как написал HiErO9 выше.
 
Начинающий
Статус
Оффлайн
Регистрация
1 Окт 2023
Сообщения
2
Реакции[?]
0
Поинты[?]
0
Нужно перенести её в самый них, после всех команд, иначе после этой строки будет вылетать ошибка, из-за того, что уничтожается сам объект, и дальнейшие команды будут просто невыполнимы.
 
Сверху Снизу