Проверка на null

Программирование на Юнити.

Проверка на null

Сообщение Heliosis 15 ноя 2018, 22:10

Бомжур

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

* Момент в том, что если два спутника находятся рядом, то они будут атаковать одну и ту же цель, то есть пули будут лететь до одного и того же астероида.
Если пуля следовала за астероидом, а его в этот момент уничтожили, то она просто ставит значение цели null и летит себе по прямой.

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

Синтаксис:
Используется csharp
public void DestroyObject(Asteroid asteroid)
{
 if (spawnedAsteroids.Contains(asteroid))
 {
  Destroy(asteroid.gameObject);
 }
}
 


Ошибка выдавалась в строке с условием, мол, asteroid отчего-то равен null. Это уже странно, ведь он не мог вызвать этот метод с нулевым значением, ведь метод вызывается при OnTriggerEnter.
Тогда я поставил проверку на null:

Синтаксис:
Используется csharp
public void DestroyObject(Asteroid asteroid)
{
 if (asteroid != null)
 {
  if (spawnedAsteroids.Contains(asteroid))
  {
   Destroy(asteroid.gameObject);
  }
 }
}
 


Но вот и то, чего я так и не могу понять: он проходит проверку на null, а на поиске в списке астероидов, что asteroid равен null.
print() после условия также показывает null (хотя и, конечно, не всегда):

Синтаксис:
Используется csharp
public void DestroyObject(Asteroid asteroid)
{
 if (asteroid != null)
 {
  print(asteroid);
  if (spawnedAsteroids.Contains(asteroid))
  {
   Destroy(asteroid.gameObject);
  }
 }
}
 


Что мне с этим делать?

(P.S.: код я не копировал, а по памяти кусок переписал, ошибки в орфографии или в синтаксисе не учитывать)
Heliosis
UNIт
 
Сообщения: 147
Зарегистрирован: 10 фев 2016, 20:50

Re: Проверка на null

Сообщение 1max1 15 ноя 2018, 22:15

Там у геймобджектов перегрузка на проверку на null, поэтому может и ведет себя странно. Ты после удаления астероида не забывай удалять его из списка.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Проверка на null

Сообщение Heliosis 15 ноя 2018, 22:19

1max1 писал(а):Там у геймобджектов перегрузка на проверку на null, поэтому может и ведет себя странно. Ты после удаления астероида не забывай удалять его из списка.

Если я буду проверять
Синтаксис:
Используется csharp
if (asteroid.gameObject != null)

Это может что-то изменить?
Heliosis
UNIт
 
Сообщения: 147
Зарегистрирован: 10 фев 2016, 20:50

Re: Проверка на null

Сообщение Heliosis 15 ноя 2018, 22:21

1max1 писал(а):Там у геймобджектов перегрузка на проверку на null, поэтому может и ведет себя странно. Ты после удаления астероида не забывай удалять его из списка.


Синтаксис:
Используется csharp
public void DestroyObject(Asteroid asteroid)
    {
        if (asteroid != null)
        {
            if (spawnedAsteroids.Contains(asteroid) == true)
                spawnedAsteroids.RemoveAt(spawnedAsteroids.FindIndex(a => a == asteroid));
            player.money += asteroid.moneyForDestruction;
            Destroy(asteroid.gameObject);
        }
    }


Вот полный код метода, я удаляю его там из списка, все с этим нормально.
Heliosis
UNIт
 
Сообщения: 147
Зарегистрирован: 10 фев 2016, 20:50

Re: Проверка на null

Сообщение Heliosis 15 ноя 2018, 22:26

Может, это как-то поможет.

Когда снаряд спутника попадает по астероиду, он наносит ему урон, после чего уничтожается, но он не проверяет в этом OnTriggerEnter здоровье астероида.
Астероид сам проверяет свое здоровье в собственном Update.
Heliosis
UNIт
 
Сообщения: 147
Зарегистрирован: 10 фев 2016, 20:50

Re: Проверка на null

Сообщение DimaJoke 16 ноя 2018, 08:52

Так у тебя проверка на null совершается в OnTriggerEnter??
Что бы повзрослеть, человек должен преодолеть ошибки юности.

Поэтому я снова здесь..
Аватара пользователя
DimaJoke
UNITрон
 
Сообщения: 293
Зарегистрирован: 12 авг 2018, 18:59
Откуда: Ульяновск
  • Сайт

Re: Проверка на null

Сообщение DimaJoke 16 ноя 2018, 12:24

Края, если да, то пусть будет типо
Синтаксис:
Используется csharp
OnTriggerEnter(Collider col)
{
if(col.tag == "Asteroid")
{
if(col.gameObject != null)
{
Destroy(col);
}
}
}
 
Что бы повзрослеть, человек должен преодолеть ошибки юности.

Поэтому я снова здесь..
Аватара пользователя
DimaJoke
UNITрон
 
Сообщения: 293
Зарегистрирован: 12 авг 2018, 18:59
Откуда: Ульяновск
  • Сайт


Вернуться в Скрипты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8