缺少带有刚体字段和??的引用异常运算符

问题描述 投票:0回答:1

我不断收到此异常:“ 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);

我的问题是,即使对象具有刚体(如果发生错误,抛出该异常的每个对象仍然具有其刚体并处于活动状态,那么我怎么可能得到空引用)。

提前感谢,祝您有美好的一天。

c# unity3d nullreferenceexception rigid-bodies
1个回答
0
投票

您不应该在从?继承的任何东西上使用??UnityEngine.Object。] >>

这与Unity如何在内部为==实现其==!=运算符(这基本上是任何Component,GameObject,Asset等的超类有关)

另请参阅!=,其中[Re-Sharper外挂程式插件制造商基于UnityEngine.Object进一步解释了它

UnityEngine.Object的检查,因此,尤其是使用Possible unintended bypass of lifetime check of underlying Unity engine objectUnityBlog - "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);),它应该是一种方法。但这也许只是一个口味问题。
© www.soinside.com 2019 - 2024. All rights reserved.