サイトアイコン GAMEWORKS LAB

【Unity】MonoBehaviour

MonoBehaviour

UnityではMonoBehaiviour呼ばれるクラスが存在しています。
これはUnity上でコンポーネントとして扱う際に必ず継承する必要があるクラスです。
※コンポーネントとはMonoBehaiviourを継承して実装された様々な機能を指します

このMonoBehaiviourを継承することでUnityのInspector上で機能の追加や設定などを行うことができるようになります。
Unity上で管理されている機能は基本的に全てMonoBehaiviourを継承しています。
なので3Dや2Dといったものからエフェクトやサウンドまで様々なオブジェクトがMonoBehaiviourを継承してコンポーネントとされています。
※自作の場合はMonoBehaiviourを継承しない手段もあります。

試しにHierarchyで[3D] -> [Cube]を作成してます。
そして生成されたCubeを選択してみるとInspector上に下記のようなコンポーネントが並びます。

これらが3Dのオブジェクトを生成するだけで使用されています。
Unityではこのように様々なコンポーネントを組み合わせることでゲームとして動作させています。

 

コンポーネントの作成

MonoBehaiviourを継承したコンポーネントは自分でも作成することができます。
コンポーネントを作成することでゲーム内に様々な機能を追加していくことができます。

では早速コンポーネントを作成していきましょう。
先ずはHierarchy上にコンポーネントを追加するためのオブジェクトを作成します。

右クリックして[Create Empty]を押すことでコンポーネントのないオブジェクトを作成できます。
GameObjectが作成されたことが分かるかと思います。

  

 

次にGameObjectをクリックしてInspectorに設定を表示させます。
するとCubeと違ってTransformしか表示されないのが分かるかと思います。
ではここに自作コンポーネントを追加していきましょう!

最初にInspector上にある[Add Component]のボタンを押します。
次に表示されるコンポーネント一覧の下部にある[New Script]を選択します。

 

最後に作成するコンポーネントの名前を入力して[Create and Add]をクリックします。
すると先ほどのInspector上に指定して名前のコンポーネントが追加されます。

 

今回は名前をデフォルトのNew Behaiviour Scriptにしたのでその名前が表示されています。
同時にProject上のAssetsにもNewBehaviourScript.csが追加されています。

ではProject上からNewBehaviourScript.csをダブルクリックしてみましょう。

Visual Studioが起動して作成したスクリプトが表示されました。
これでコンポーネントを実装していく準備が整いました。

 

コンポーネントの実装

ここからはC#のスクリプトを編集してコンポーネントを作成していきます。
先ずMonoBehaiviourを継承したオブジェクトの基本機能を説明していきます。

公式のドキュメントに載っている内容ですがよく使用する内容として下記のような機能が存在します。

Awake

Awakeは全てのGameObjectのインスタンス作成後に呼び出される最初のメソッドです。
インスタンスは作成されているので他のオブジェクトの参照も安全に行えます。
ゲーム開始前に呼び出されるので主に初期化などに使用します。
又、スクリプトが無効の状態でも呼び出されます。

注意事項としては、Awakeが呼び出される順番がランダムなのでAwake内で他のオブジェクトのAwakeで初期化する値を参照しないようにしましょう。

void Awake(){}

Start

void Start()は初回のUpdate直前に一度だけ呼び出されるメソッドです。
Awakeで初期化されたものも安全に使用できるのでAwakeで重要なものを初期化してStartでそれらを参照するといった使い方ができます。
Awakeと違い、スクリプトが無効の状態では呼び出しが行われません。

void Start(){}

Update

Updateは毎フレーム呼び出されるメソッドです。
ゲーム内の挙動や状況のチェックなど数多くの箇所で使用されます。
Start同様にスクリプトが無効の状態では呼び出しが行われません。

Time.deltaTimeを使用することで初回のUpdateからの経過時間を取得できます。

void Update(){}

LastUpdate

LastUpdateはUpdate後に毎フレーム呼び出されるメソッドです。
全てのオブジェクトのUpdate後に実行したい処理を記述します。
呼び出しタイミング以外はUpdateと同様の内容です。

void LastUpdate(){}

OnEnable

OnEnableはオブジェクトがアクティブになったタイミングで呼び出されるメソッドです。
有効無効を切り替える機能がある場合に使用します。

void OnEnable(){}

OnDisable

OnDisableはオブジェクトが非アクティブになったタイミングで呼び出されるメソッドです。
有効無効を切り替える機能がある場合に使用します。

void OnDisable(){}

OnDestroy

OnDestroyはオブジェクトが破棄されたタイミングで呼び出されるメソッドです。
一度でもアクティブになったことがある場合に呼び出されます。

void OnDestroy(){}

 

良く使用されるメソッドはこの辺りです。
MonoBehaiviourでこれらは定義した場合にのみ動作します。
不要な場合は省いても問題ありません。

 

外部パラメータの作り方

コンポーネントはInspector上でパラメータを調整できるようにすることができます。
例えばUIのImageコンポーネントではテクスチャーなどをパラメータとして設定できるようになっています。

こういったパラメータ化は自作のコンポーネントでも簡単に使用することができます。

パラメータの出し方

パラメータをInspector上に出すには2つの方法があります。

1つ目の方法はそのまま変数にpublicを指定するだけです。

public int Param1;

2つ目はSerializeFieldを指定する方法です。

[SerializeField]
private int Param2;

このどちらの方法でも変数がInspector上に表示されます。
変数を外部に公開したくない場合はSerializeFieldを指定する方法を使います。
※恐らくこ ちらの方がよく使用します

Unityではこのようにパラメータを外部で設定できるようにしてゲームを組み立てていきます。
パラメータは誰でも変更できるので下記のような流れにしていくことが理想的だと思います。

  1. プログラマがコンポーネントで実装する
  2. デザイナーが画面のレイアウトなどを整える
  3. プランナーが流れを設定していく

プログラマーはコンポーネントの実装からデザインや流れの実装をサポートしていく形になります。
昨今のゲームエンジンではプログラマーがゲームの挙動を全て実装するという従来の流れが変わってきています。

今後も開発環境は変化していくと思いますので状況に応じた開発スタイルに対応できるように知識を蓄えていきましょう!

モバイルバージョンを終了