Вопрос:
Как проверить, был ли опубликован c gameObject объекта MonoBehaviour в инспекторе в Unity3D, в качестве сравнения для null (object==null)
терпит неудачу.
Конкретный пример:
Я собираюсь написать обобщенный c метод для Unity3D, который можно вызывать для любого обнуляемого объекта. Он проверяет, является ли объект нулевым, и если да, то записывает 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;
}
Метод можно вызывать для любого объекта, допускающего обнуление, в любом месте кода, например, в рамках этого простого монобиха:
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, кажется, не нулевой, но он также не может использоваться, потому что он не назначен. В этом случае консольный вывод:
False
null
Почему (myObject == null)
ложно, а Debug.Log(testObject)
дает мне null
до тех пор, пока соответствующий объект не был назначен в инспекторе единства.
Редактировать / Решение: Благодаря помощи derHu go я получил этот обобщенный c фрагмент кода:
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;
}
}