В игре есть такой момент, спутник стреляет по появляющимся астероидам (которые при появлении записываются в список), пули самонаводящиеся, следуют за астероидом, и, достигнув его, уничтожают.
С обычным количеством астероидов и спутников все, в целом, работает как надо, и я решил проверить, что будет, если будет много астероидов.
Наспавнил кучу астероидов, поставил несколько спутников, которые должны стрелять по ним.
* Момент в том, что если два спутника находятся рядом, то они будут атаковать одну и ту же цель, то есть пули будут лететь до одного и того же астероида.
Если пуля следовала за астероидом, а его в этот момент уничтожили, то она просто ставит значение цели null и летит себе по прямой.
Вопрос вот в чем: я заметил, что в момент смерти астероида, когда в него выстреливает несколько спутников одновременно, мне начинает спамить ошибка о NullReferenceException.
Оказалось, что в методе, где я уничтожаю астероид, он пытается найти его в списке заспавненных астероидов, но не может.
Синтаксис:
Используется csharp
public void DestroyObject(Asteroid asteroid)
{
if (spawnedAsteroids.Contains(asteroid))
{
Destroy(asteroid.gameObject);
}
}
{
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);
}
}
}
{
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);
}
}
}
{
if (asteroid != null)
{
print(asteroid);
if (spawnedAsteroids.Contains(asteroid))
{
Destroy(asteroid.gameObject);
}
}
}
Что мне с этим делать?
(P.S.: код я не копировал, а по памяти кусок переписал, ошибки в орфографии или в синтаксисе не учитывать)