在 Unity3D 2019.3.05f 的检查器中检查是否已分配 GameObject
Check if a GameObject has been assigned in the inspector in Unity3D 2019.3.05f
问题:
How to check if a public gameObject of a MonoBehaviour has been assigned in the inspector in
Unity3D, as the comparison for null (object==null)
fails.
具体例子:
我正准备为 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 的对象调用该方法,例如在这个简单的 Monobehaviour 中:
public class TestScript : MonoBehaviour
{
public GameObject testObject = null;
public void TestObject()
{
var result = testObject.IsNull("Error message");
Debug.Log(result);
Debug.Log(testObject);
}
}
对于大多数用例,我的方法运行完美,并且在 encoding/debugging 期间节省了大量时间。但我现在的问题是,如果我没有在编辑器中签署"testObject",我的测试将无法运行,因为testObject 似乎不为null,但它也无法使用,因为它没有分配。在这种情况下,控制台输出为:
False
null
为什么 (myObject == null)
是假的,而 Debug.Log(testObject)
给我 null
只要相应的对象没有在统一检查器中分配。
Edit/Solution:
感谢 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;
}
}
Unity 有一个相等 ==
运算符的自定义实现(请参阅 Custom == operator, should we keep it?,这通常会导致混淆/意外行为。
即使 UnityEngine.Object
的值 等于 null
,它有时也不是 == null
。
Object
而仍然在其中存储一些元数据,例如你得到一个 MissingReferenceException
,而不是通常的 NullReferenceException
,因为 Unity 实现了一些自定义异常,这些异常通常包含 为什么 值等于 null
的更多细节.
特别是因为
public GameObject testObject = null;
是一个 public
字段,它会自动 序列化 ,因此您分配给它的 null
值无论如何都会在序列化期间被覆盖。
UnityEngine.Object
which GameObject
derives from has an implicit operator bool
Does the object exist?
与其直接 == null
比较,不如检查
public static bool IsNull<T>(this T myObject, string message = "") where T : UnityEngine.Object
{
if(!myObject)
{
Debug.LogError("The object is null! " + message);
return false;
}
return true;
}
对于适用于任何引用类型的通用方法,您可以例如使用像
这样的东西
public static bool IsNull<T>(this T myObject, string message = "") where T : class
{
if (myObject is UnityEngine.Object obj)
{
if (!obj)
{
Debug.LogError("The object is null! " + message);
return false;
}
}
else
{
if (myObject == null)
{
Debug.LogError("The object is null! " + message);
return false;
}
}
return true;
}
问题:
How to check if a public gameObject of a MonoBehaviour has been assigned in the inspector in Unity3D, as the comparison for null
(object==null)
fails.
具体例子:
我正准备为 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 的对象调用该方法,例如在这个简单的 Monobehaviour 中:
public class TestScript : MonoBehaviour
{
public GameObject testObject = null;
public void TestObject()
{
var result = testObject.IsNull("Error message");
Debug.Log(result);
Debug.Log(testObject);
}
}
对于大多数用例,我的方法运行完美,并且在 encoding/debugging 期间节省了大量时间。但我现在的问题是,如果我没有在编辑器中签署"testObject",我的测试将无法运行,因为testObject 似乎不为null,但它也无法使用,因为它没有分配。在这种情况下,控制台输出为:
False
null
为什么 (myObject == null)
是假的,而 Debug.Log(testObject)
给我 null
只要相应的对象没有在统一检查器中分配。
Edit/Solution: 感谢 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;
}
}
Unity 有一个相等 ==
运算符的自定义实现(请参阅 Custom == operator, should we keep it?,这通常会导致混淆/意外行为。
即使 UnityEngine.Object
的值 等于 null
,它有时也不是 == null
。
Object
而仍然在其中存储一些元数据,例如你得到一个 MissingReferenceException
,而不是通常的 NullReferenceException
,因为 Unity 实现了一些自定义异常,这些异常通常包含 为什么 值等于 null
的更多细节.
特别是因为
public GameObject testObject = null;
是一个 public
字段,它会自动 序列化 ,因此您分配给它的 null
值无论如何都会在序列化期间被覆盖。
UnityEngine.Object
which GameObject
derives from has an implicit operator bool
Does the object exist?
与其直接 == null
比较,不如检查
public static bool IsNull<T>(this T myObject, string message = "") where T : UnityEngine.Object
{
if(!myObject)
{
Debug.LogError("The object is null! " + message);
return false;
}
return true;
}
对于适用于任何引用类型的通用方法,您可以例如使用像
这样的东西public static bool IsNull<T>(this T myObject, string message = "") where T : class
{
if (myObject is UnityEngine.Object obj)
{
if (!obj)
{
Debug.LogError("The object is null! " + message);
return false;
}
}
else
{
if (myObject == null)
{
Debug.LogError("The object is null! " + message);
return false;
}
}
return true;
}