Мы используем куки, чтобы пользоваться сайтом было удобно.
Хорошо
to the top
menu mobile close menu
Проверка проектов
Дополнительная информация
toggle menu Оглавление

V3211. Unity Engine. The operators '?.', '??' and '??=' do not correctly handle destroyed objects derived from 'UnityEngine.Object'.

05 Фев 2025

Анализатор обнаружил потенциальную ошибку, связанную с тем, что объект производный от UnityEngine.Object был использован с оператором условного null (?.) или null-объединения (?? и ??= ).

Согласно документации Unity, не рекомендуется использовать операторы ?., ?? и ??=. Поскольку их нельзя перегрузить, они не учитывают возможность уничтожения объектов, производных от UnityEngine.Object. Вследствие чего, проверка может иметь некорректный результат.

Рассмотрим пример:

class CustomComponent: MonoBehaviour
{
  public bool HitConfirm(....)
  {  
    Projectile bullet;
    ....
    if(....)
      Destroy(bullet);
    ....
    if(bullet?.isJammed())
    {....}
  }
}

В данном случае при обращении к bullet проверка с помощью оператора условного null (?. ) не будет учитывать возможность, что объект может быть уничтожен, так как этот оператор нельзя перегрузить.

Чтобы это исправить, рекомендуется использовать проверку с помощью оператора == или !=.

Исправленный вариант:

class CustomComponent: MonoBehaviour
{
  public bool HitConfirm(....)
  {  
    Projectile bullet;
    ....
    if(....)
      Destroy(bullet);
    ....
    if(bullet != null ? bullet.isJammed() : null)
    {....}
  }
}