Анализатор обнаружил ненадежную проверку на 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
), а потому проверка будет работать правильно в любом случае.
Данная диагностика классифицируется как: