Одна строка останавливает скрипт C# Unity

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

Вот части двух скриптов:

Player1.cs

private Bullet1 b1;

void Start()
{
    b1 = FindObjectOfType<Bullet1>();
}

void OnCollisionEnter2D(Collision2D col)
{
    if (col.gameObject.tag == "Bullet1")
    {
        hp1 -= damage1; // it works, my player loses hp
        Destroy1(); // doesn't work
    }
}

void Destroy1()
{
    b1.hit1 = true; // hit for bullet1.cs
}

Bullet1.cs

public bool hit1;

void Update()
{
    if (hit1)
    {
        hit1 = false;
        Destroy(gameObject);
    }
}

Если я переключаю bool hit = true в реальном времени в Unity, уничтожение работает. Это означает, что Bullet1.cs не может получить hit = true;

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

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

Alex Myers 31.05.2019 21:03

Похоже, b1 для меня нулевой. Вы не на это проверяете.

Retired Ninja 31.05.2019 21:04

В начале вашего плеера вы получаете ссылку на объект пули, но затем в своем объекте пули вы уничтожаете пулю. Ваша логика кода в этом очень странная. Вместо этого вы должны просто вызвать вызов, чтобы уничтожить пулю через обнаружение столкновения напрямую. Поместите Destroy(col.gameobject) внутри вашего обнаружения столкновений в плеере вместо того, чтобы делать то, что вы делаете с логическим значением.

Tim Hunter 31.05.2019 21:06

@AlexMyers 1) NullReferenceException: Object reference not set to an instance of an object PlayerController.Destroy2 () (at Assets/Scripts/Game/PlayerController.cs:255) PlayerController.OnCollisionEnter2D (UnityEngine.Collision2D col) (at Assets/Scripts/Game/PlayerController.cs:116) 2) NullReferenceException: Object reference not set to an instance of an object PlayerController.Destroy2 () (at Assets/Scripts/Game/PlayerController.cs:255)

Eloren 31.05.2019 21:09

254-256: void Destroy2() { b2.hit2 = true; }

Eloren 31.05.2019 21:09

116: if (col.gameObject.tag == "Bullet1") { lasthit = 1f; hp1 -= damage1; Destroy1(); // 116 line }

Eloren 31.05.2019 21:10

Пожалуйста, обновите свой вопрос соответствующей информацией (например, NullReferenceException), а не добавляйте ее в комментарии.

Rufus L 31.05.2019 21:24
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
7
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Просто уничтожьте пулю через столкновение вместо использования логического значения. Это создает ненужное использование ресурсов. Из приведенного кода это все, что вам нужно сделать, чтобы уничтожить пулю с помощью скрипта плеера. Показанные части сценария маркера не нужны. Если вы хотите, чтобы дополнительная логика обрабатывалась внутри пули при ее уничтожении, используйте функцию OnDestroy для ее обработки.

void OnCollisionEnter2D(Collision2D col)
{
    if (col.gameObject.tag == "Bullet1")
    {
        hp1 -= damage1;
        Destroy(col.gameobject); 
    }
}

Мне нужно использовать больший код в Bullet1.cs, когда пуля сталкивается. Нравится Создание анимации и активация звука. Так что мне нужно изменить bool в Bullet1.cs

Eloren 31.05.2019 21:14

@ЯрославСмирнов Я добавил ссылку на функцию OnDestroy, чтобы узнать, как с этим справиться. Он вызывает функцию при получении команды Destroy в качестве последнего набора инструкций, которые необходимо выполнить перед уничтожением объекта.

Tim Hunter 31.05.2019 21:16

Другие вопросы по теме