2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

UnityEngine.Object を継承したクラスをインターフェースとして保持していると Null (Fake Null)チェックできない

Last updated at Posted at 2018-05-30

sumibi-yakitori です。普段は Nintendo Switch でゲーム開発をしています。

さて、
下記のような何らかのインターフェース IFooMonoBehaviour を実装したクラス 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)
2
2
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?