Вопрос:
Как проверить, был ли назначен общедоступный игровой объект MonoBehaviour в инспекторе в Unity3D, поскольку сравнение для null
(object==null)
не выполняется.
Конкретный пример:
Я собираюсь написать общий метод для Unity3D, который можно вызывать для любого объекта, допускающего значение NULL. Он проверяет, является ли объект нулевым, и если да, то записывает Debug.LogError(customMessage)
. Метод выглядит следующим образом:
public static bool IsNull<T>([CanBeNull] this T myObject, string message = "")
{
if (myObject!= null) return false;
Debug.LogError("The object is null! " + message);
return true;
}
Этот метод можно вызывать для любого объекта, допускающего значение NULL, в любом месте кода, например, в этом простом моноповедении:
public class TestScript : MonoBehaviour
{
public GameObject testObject = null;
public void TestObject()
{
var result = testObject.IsNull("Error message");
Debug.Log(result);
Debug.Log(testObject);
}
}
В большинстве случаев мой метод работает отлично и экономит много времени при кодировании/отладке. Но моя проблема сейчас в том, что если я не подписал "testObject" в редакторе, мой тест не будет работать, потому что testObject кажется не нулевым, но его также нельзя использовать, потому что он не назначен. В этом случае вывод консоли:
Ложь
null
Как получается, что (myObject == null)
является ложным, а Debug.Log(testObject)
дает мне null
, пока соответствующий объект не был назначен в инспекторе единства.
Редактирование/решение. Благодаря помощи derHugo я получил этот общий фрагмент кода:
public static bool IsNull<T>(this T myObject, string message = "") where T : class
{
switch (myObject)
{
case UnityEngine.Object obj when !obj:
Debug.LogError("The object is null! " + message);
return true;
case null:
Debug.LogError("The object is null! " + message);
return true;
default:
return false;
}
}