Общедоступная функция из другого скрипта не вызывается в Unity2D

#c# #function #unity3d

#c# #функция #unity3d

Вопрос:

Я пытаюсь создать механику атаки для моей 2D-игры. Это будет работать следующим образом: если игрок стоял перед врагом и нажал пробел, враг умрет. Для этого я написал это в скрипте проигрывателя:

     void Attack()
{
        Collider2D[] hitEnemies = Physics2D.OverlapCircleAll(AttackArea.position, AttackRange, EnemyLayers);
        foreach (Collider2D enemy in hitEnemies)
        {
            enemy.GetComponent<Enemy_1>().Death();
            
        }
  }
  

И это во вражеском скрипте:

     public void Death()
    {
        Destroy(gameObject);
    }
  

Это сработало безупречно, но я хотел создать в игре врага другого типа, поэтому я добавил это для второго врага в сценарий атаки игрока (я упомянул, что «GunBoi» — это имя второго вражеского скрипта, и я назвал вторую функцию «Dead ()» вместо «Death() » поскольку я думал, что это не сработает, если у них будет одно и то же имя)

 Collider2D[] hitEnemies2 = Physics2D.OverlapCircleAll(AttackArea.position, AttackRange, EnemyLayers);
        foreach (Collider2D enemy2 in hitEnemies2)
        {
            enemy2.GetComponent<GunBoi>().Dead();
        }
  

и это во втором вражеском скрипте:

     public void Dead()
    {
        Destroy(gameObject);
    }
  

но всякий раз, когда я пытаюсь атаковать второго врага, ничего не происходит. Когда я пытаюсь атаковать первого врага, это срабатывает, и враг умирает. Кто-нибудь знает, почему это происходит?

Комментарии:

1. I named the second function "Dead()" instead of "Death()" since I thought it wouldn't work if they had the same name это действительно не имеет никакого значения.. имена в основном для вас 😉 Пока они размещены в разных областях (в вашем случае в разных классах), они могут иметь одно и то же имя.. позже это становится скомпилированным машинным кодом без каких-либо имен;) просто адреса

2. Поскольку ваш код делает то же самое, похоже, вам лучше иметь общий базовый класс или интерфейс вместо двух полностью независимых классов … чем отличаются объекты? Может быть, им просто не хватает компонентов коллайдера?

3. Я проверил, и к ним обоим прикреплены жесткие тела и коллайдеры. Под разными я подразумевал, что они делают совершенно разные вещи. Предполагается, что первый враг должен двигаться, а другой должен оставаться на одном месте и стрелять в игрока. Я также хочу упомянуть, что я использовал учебник brackeys по 2D рукопашному бою, чтобы помочь с некоторыми вещами ( youtube.com /… )

4. Пожалуйста, убедитесь, что используете правильные теги. Ваш код находится в c# unityscript является / был разновидностью JavaScript, подобной пользовательскому языку, ранее использовавшемуся Unity, и к настоящему времени давно устарел

Ответ №1:

О вашей проблеме: ваш код в порядке. Проверьте, был ли скрипт назначен вражескому сборному.

Теперь рекомендация. Если вы будете следовать этому, ваша проблема может быть решена.

Вы сказали, что создали новый скрипт для нового врага, но у них обоих одна и та же механика: функция Death() (и, пока они оба враги, я полагаю, у них будет много других механик, таких как HP, урон и другие традиционные вещи).).

В этом случае, я думаю, что лучшим решением является наследование сценария GunBoi от сценария общего врага.

Копировать функцию, которая выполняет точно то же самое, но имеет (не очень) другое имя, является плохой практикой. Если вы решите создать третьего врага, вам придется создать третью функцию, чтобы уничтожить его, но опять же, с другим именем.

Ответ №2:

Несколько вещей могут быть неправильными, но на первый взгляд я бы, по крайней мере, проверил эти два:

  1. находятся ли GunBoi на хорошем уровне
  2. Есть ли у них компонент GunBoi

Нам не хватает слишком много информации, чтобы помочь вам дальше, чем это.

Но, честно говоря, вы должны попытаться реорганизовать это, чтобы оба вражеских типа имели общий вражеский компонент. Нет причин, по которым нужно было бы выполнять логику столкновения дважды. Вы хотите написать как можно меньше кода. С вашим подходом вам придется делать это для каждого нового типа врага, что является как проблематичным, так и подверженным ошибкам.

Комментарии:

1. Я убедился, что оба врага находятся на правильном уровне и что ко второму врагу прикреплен скрипт Gunboi. Причина, по которой я решил выполнить логику столкновения дважды, заключается в том, что два врага совершенно разные. У них обоих разные сценарии и они выполняют разные действия. Первый враг должен партол на платформе, а второй должен оставаться на одном месте и стрелять в игрока. (и да, я проверил, к ним обоим подключены компоненты rigidbody).

2. Я также хочу упомянуть, что я пытался просто добавить public void Death() второй вражеский скрипт, не изменяя сценарий атаки и не добавляя вторую логику атаки, и это просто не сработало