sumibi-yakitori です。普段は Nintendo Switch でゲーム開発をしています。
さて、
下記のような何らかのインターフェース IFoo
と MonoBehaviour
を実装したクラス FooComponent
があるとして、
public class FooComponent : MonoBehaviour, IFoo { }
次のコードのように、インターフェースとして保持していると Fake null がチェックできません。
==
演算子をオーバーロードしているのは UnityEngine.Object
だからですかね。
var fooComponent = this.GetComponent<FooComponent>();
var foo = (IFoo)fooComponent;
Object.Destroy(fooComponent);
Observable.NextFrame().Subscribe(_ => {
if (fooComponent == null) {
Debug.Log("fooComponent は null"); // OK
}
if (foo == null) {
Debug.Log("foo は null "); // NG
}
}).AddTo(this);
この問題は、
UnityEngine.Object
にキャストした結果をチェックすることで回避することができます。
foo as UnityEngine.Object == null;
foo
はこの場合はローカル変数ですが、
インターフェースとして保持しているのはプロパティやフィールドのことが多いと思うので、
UnityEngine.Object
を継承していなかった場合のことを考え、
私は次のような条件式でユーティリティメソッド化して使っています。
(コメントで指摘いただいたので更に修正!ありがとうございます)
foo == null || (foo is UnityEngine.Object && foo as UnityEngine.Object == null)