Не работает часть скрипта Unity C#

124
18 января 2021, 10:20

Часть кода работает, при столкновении с пулей (hp1 -= damage1;), а вторая часть не работает. Подскажите, в чем ошибся?

Вот выбранные части кода:

Player1.cs

    private Bullet1 b1;
    void Start()
    {
        b1 = FindObjectOfType<Bullet1>();
    }
    void OnCollisionEnter2D(Collision2D col)
        {
                if (col.gameObject.tag == "Bullet1")
                {
                    hp1 -= damage1; // работает, hp1 уменьшается
                    Destroy1(); // не работает
                }
       }
    void Destroy1()
        {
            b1.hit1 = true; // для скрипта Bullet1.cs, попадание
        }

Bullet1.cs

public bool hit1;
void Update()
    {
        if (hit1)
        {
            hit1 = false;
            LeanTween.delayedCall(0.7f, () =>
            {
                Destroy(gameObject);
            });
        }
    }

Проблема не в LeanTween, у меня все работает, если внутри игры нажать на паузу и вручную переключить bool - hit то все взрывается. До скрипта не доходит почему-то в момент касания, что hit = true;

Если же я меняю местами hp1 -= damage1; и Destroy1();, то у меня не происходит ничего -- урон не принимается. Значит, Destroy1(); не дает пройти коду дальше. Также, если просто написать b1.hit1 = true; вместо Destroy1();, то ситуация такая же.

Answer 1

Я проверил твой скрипт и у меня все работает. Попробуйте не использовать LeanTween Замените:

    LeanTween.delayedCall(0.7f, () =>
    {
        Destroy(gameObject);
    });

На:

Destroy(gameObject);
Answer 2

Скорее всего LeanTween.delayedCall() вызывается много раз и 0.7 секунд не успевают проходить до следующего вызова Update (время стает допустим 0.633 сек и в следующем Update меняется на 0.7f и также это ударяет по оптимизации, ведь зачем нам вызывать это в каждом кадре, если можно вызвать 1 раз. Вообще не знал про этот LeanTween даже). Это не самая лучшая идея для реализации этого алгоритма. Я вам рекомендую не делать скрипт Bullet1.cs и просто впихнуть всё это дело в метод Destroy1(). Не понадобится создавать и вешать скрипт на пулю (как вы наверное сделали) и будет + в производительность :) Кстати, вместо всяких delayedCall вы можете прописать Destroy(gameObject, time) и вместо time - время.

READ ALSO
Создание scope: разница между IServiceProvider и IServiceScopeFactory

Создание scope: разница между IServiceProvider и IServiceScopeFactory

В некотором aspnet mvc приложении (под

105
Книги и учебные ресурсы по Python

Книги и учебные ресурсы по Python

Рекомендуемая литература, курсы и документация по Python

109
Стиль с TargetType в App.xaml игнорируется

Стиль с TargetType в App.xaml игнорируется

В appxaml объявлен стиль:

129
Отправить Сочетания клавиш Winapi C#

Отправить Сочетания клавиш Winapi C#

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

97