>
>
>
V3216. Unity Engine. Checking a field w…


V3216. Unity Engine. Checking a field with a specific Unity Engine type for null may not work correctly due to implicit field initialization by the engine.

Анализатор обнаружил ненадежную проверку на null поля, которое может быть инициализировано в инспекторе Unity. Ненадежной она является, потому что выполняется с помощью оператора, не имеющего перегрузку для учета специфики кода Unity-скриптов. В частности, Unity неявно инициализирует отображаемые в инспекторе поля базовым значением если их тип — UnityEngine.Object или производный от него (исключение – MonoBehaviour и ScriptableObject классы). Этот объект является эквивалентом null, однако операторы ?., ??, ??= и is не знают об этом и воспринимают его как обычное значение.

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

public class ActivateTrigger: MonoBehaviour
{
  [SerializeField]
  GameObject _target;

  private void DoActivateTrigger()
  {
     var target = _target ?? gameObject;
    ....
  }
}

В данном случае, если значение _target еще не менялось в процессе выполнения, проверка ?? будет считать _target не равным null, независимо от того, было назначено значение поля в инспекторе Unity или нет.

Решением проблемы является использование ==, != или сокращенных проверок (field, !field) для проверки на равенство/неравенство с null, которые учитывают специфичные для Unity-скриптов моменты.

Так, в данном случае исправленный код может выглядеть следующим образом:

public class ActivateTrigger: MonoBehaviour
{
  [SerializeField]
  GameObject _target;

  private void DoActivateTrigger()
  {
    var target = _target;

    if (target == null)
      target = gameObject;
    ....
  }
}

Теперь вместо ?? используется проверка target на равенство null с помощью оператора ==. Данная операция имеет переопределение, учитывающее нюанс описанный в начале документации (так же как target != null), а потому проверка будет работать правильно в любом случае.

Данная диагностика классифицируется как: