【Unity】MonoBehaviourについて調べてみた

Unityでスクリプトを作成する際にデフォルト「MonoBehaviour」を継承したクラスになります。 普段余り考えて使っていなかったのですが、このMonoBehaviourが一体どういったクラスなのかに興味をもち少し調べてみました。 簡単ですがブログに記事にまとめていきます。

MonoBehaviour

UnityのドキュメントにはMonoBehaviourはこのように説明がされています。 MonoBehaviour - リファレンス

このページを見れば、だいたいどのようなことができるのかがわかってきます。

MonoBehaviourの継承ツリー

MonoBehaviourは、次のようにクラスを継承して作られています。 それぞれで使える機能が違っています。

  • Object
  • Component
  • Behaviour

Object

MonoBehaviourの一番最下層の基底クラスが「Object」です。 Unityを少しでも使っている方ですと、GameObjectを生成するときにもしかしたらこの型を見たことがあるかもしれません。 [c] // Instantiate()はObjectにメソッドが定義されています。 var oj = Instantiate(_prefab, transform);

// DestoryもObjectに定義されています。 Destroy(_object);

[/c]

そのため、Instantiate()で生成するためには、Objectを継承したクラスでないといけません。 Destory()も同じです。 逆にいえば、Destory()だけを使いたい場合はMonoBehaviourを継承するのではなく、Objectを継承したほうがパフォーマンスがよくなります。

GameObject

Objectによく似たクラスに「GameObject」があります。 Unityを使っていると、この「GameObject」の方が馴染みがあると思います。

「GameObject」はObjectを継承したクラスで、UnityではおなじみのGetComponent()やSetActive()、transformなど使うことができます。 [c] obj.SetActive(false);

obj.transform.localPosition = new Vector3(1f, 1f, 0f); [/c]

GameObjectはsealedで定義されているため、継承元としては使うことができません。

Component

「Object」を継承しているクラスが「Component」になります。 GetComponent()やtransform、SendMessageなどが利用できます。先程の「GameObject」とよく似た機能が使えるようです。 こちらは継承可能なクラスです。

[c] var go = GetComponent<GameObject>(); [/c]

Behaviour

「Component」を継承しているクラスが、Behaviourです。 ここでは2つのメソッドが定義されています。個人的にenabledはよく使っています。 [c] // コンポーネントを有効・向こうを制御する _behaviour.enabled = true;

// アクティブかつコンポネントが有効化どうか var hoge = _behaviour.isActiveAndEnabled; [/c]

有効・無効

コンポーネントを有効・無効にするとは、次の画像だと「MonoText」のスクリプトにチェックを操作します。 チェックを外すとスクリプトは動きません。 2019_01_19_memo

MonoBehaviour

最後にMonoBehaviourではどのようなことができるのかを調べていきたいと思います。 代表的なのがStartCoroutine()です。 [c] StartCoroutine(HogeCorutine());

private IEnumerator HogeCoroutine() { yield return null; } [/c]

非同期処理をUnityで実装するにはコルーチンを使うのが最も手っ取り早い方法です。 MonoBehaviourを継承したクラスではこのコルーチンを使うことができます。

Invoke()

Invoke()は特定の場所でActionを呼び出すことができます。 [c] // Hoge()を0.0fで呼び出しています。 monoObject.Invoke("Hoge", 0.0f); [/c]

print

これはDebug.Log()を呼び出しているだけですので、直接呼び出しても良い気がしました。 [c] monoObject.print("メッセージ"); [/c]

最後に

Unityを使っているとMonoBehaviourを継承したクラスを作成しがちだと思います(デフォルトで設定されているので) 今回色々調べてみて、必ずしもMonoBehaviourを使わないくても良いとわかったので、必要に応じでクラスを作成していこうと思います。