我不断收到此异常:“ MissingReferenceException:'刚体'类型的对象已被破坏,但您仍在尝试访问它。”
问题在于,我仅通过此字段对其进行指控:
private Rigidbody m_Rigidbody = null;
private Rigidbody Rigidbody => m_Rigidbody ?? (m_Rigidbody = GetComponent<Rigidbody>());
并且我的例外情况抛出了这一行:
public float CurrentSpeed => (Rigidbody?.velocity.magnitude ?? 0f) * ((m_SpeedType == SpeedType.MPH)?2.23693629f : 3.6f);
我的问题是,即使对象具有刚体(如果发生错误,抛出该异常的每个对象仍然具有其刚体并处于活动状态,那么我怎么可能得到空引用)。
提前感谢,祝您有美好的一天。
您不应该在从 这与Unity如何在内部为?
继承的任何东西上使用??
或UnityEngine.Object
。] >>==
实现其==
和!=
运算符(这基本上是任何Component,GameObject,Asset等的超类有关)
另请参阅!=
,其中[Re-Sharper外挂程式插件制造商基于UnityEngine.Object
进一步解释了它
UnityEngine.Object
的检查,因此,尤其是使用Possible unintended bypass of lifetime check of underlying Unity engine object和UnityBlog - "Custom == operator, should we keep it?"运算符的检查仅由==null
bypassed
为什么?
[从表面上看:在调用?
之后(例如,如果它是序列化字段并且尚未被引用),则Unity中的?
不再存在。 BUT它实际上是[[not
??
,它仍然保存一些元数据,并且只是-他们如何声明它a ??
。
这实际上是为什么您没有获得UnityObject
而是Unity内置Destroy
给您提示的原因
为什么
您通常会在此时得到Object
。它可以例如状态类型为'XY'的对象已被破坏,但您仍在尝试访问它
==null
具有隐式的fake null object
返回对象是否存在?
例如在NullReferenceException
被称为MissingReferenceException
或它是从未分配过的字段之后的NullReferenceException
,由于现在为UnityEngine.Object
,因此现在将不再执行(不再)。
bool
operator的东西要做的实际上是使用该运算符,例如bool
出于可读性原因,我也不喜欢将像这样的东西做成表达式主体。您的其他财产也将因此
if(destroyedObject)
[一般而言,我的看法:只要属性中可能隐藏更多工作,然后仅简化引用(例如detroyedObject
,例如此处Destroy(destroyedObject);
),它应该是一种方法。但这也许只是一个口味问题。