在C#中,可以优美的使用?.来隐性代替xxx!=null,但在unity中,有时会出现即使xx为null,仍然执行后续方法导致的报错。
//方法1
if(unit!=null&& unit.mainViewUnit!=null) unit.mainViewUnit.Deselected();
//方法2
unit?.mainViewUnit?.Deselected();
上述示例无论怎么看都是没有区别的,但在在Unity中,MonoBehaviour继承自UnityEngine.Object
重写了==和!=运算符,因此当其引用的物体被销毁而该引用依然保存的时候,就会在调用gameObject属性时抛出异常。
这是unity的原罪,所以在使用MonoBehaviour时,尽可能的不用?.而是使用传统的if(!=null)