概要
UnityでC#スクリプトを作成すると、必ずpublic class MyScript : MonoBehaviourという記述を目にします。このMonoBehaviourとは一体何なのでしょうか?
MonoBehaviourは、UnityのAPIと自作のスクリプトを繋ぐ、非常に重要な「基底クラス」です。このクラスを継承(:の右側に記述すること)することで、作成したスクリプトはUnityのゲームオブジェクトにコンポーネントとして追加できるようになり、UpdateやStartといったライフサイクルイベントを受け取ったり、transformやgameObjectといった便利なプロパティにアクセスしたりできるようになります。
この記事では、Unityプログラミングの土台となるMonoBehaviourクラスの役割と、それが提供する主要な機能について詳しく見ていきましょう。
MonoBehaviourの役割
MonoBehaviourを継承する主なメリットは以下の通りです。
- コンポーネント化: 作成したスクリプトをゲームオブジェクトのコンポーネントとしてアタッチできるようになります。これにより、オブジェクトに振る舞いを追加できます。
- ライフサイクルイベントの受信:
Awake,Start,Updateなど、Unityが定義した特定のタイミングで自動的に呼び出されるイベント関数を使用できます。 - 主要プロパティへのアクセス: スクリプトがアタッチされているゲームオブジェクト自身や、そのTransformコンポーネントなどに簡単にアクセスできます。
- コルーチンの実行:
StartCoroutineメソッドを使って、時間のかかる処理を非同期に実行できます。
もしMonoBehaviourを継承しないただのC#クラス(POCO - Plain Old C# Object と呼ばれることもあります)を作成した場合、それはUnityのゲームオブジェクトにアタッチできず、ライフサイクルイベントも受け取れません。そうしたクラスは、データ保持専門のクラスや、計算処理専門のクラスとしてMonoBehaviourから呼び出し て使うことになります。
主要なプロパティとメソッド
MonoBehaviourを継承したスクリプト内では、多くの便利なプロパティやメソッドを直接呼び出すことができます。ここでは特に頻繁に使うものを紹介します。
transform
スクリプトがアタッチされているゲームオブジェクトのTransformコンポーネントへの参照を返します。オブジェクトの位置、回転、スケールを操作する際に頻繁に使用します。これはGetComponent<Transform>()のショートカットであり、非常によく使われるため特別に用意されています。
using UnityEngine;
public class PositionChanger : MonoBehaviour
{
void Start()
{
// transformプロパティを使って、オブジェクトのY座標を5に設定する
transform.position = new Vector3(0, 5, 0);
}
}
gameObject
スクリプトがアタッチされているゲームオブジェクト自身への参照を返します。オブジェクトを非アクティブにしたり、他のコンポーネントを取得したりする際の起点となります。
using UnityEngine;
public class ObjectController : MonoBehaviour
{
void Start()
{
// 5秒後にこのゲームオブジェクトを非アクティブにする
Invoke("DeactivateObject", 5f);
}
void DeactivateObject()
{
// gameObjectプロパティを使って、自身を非アクティブにする
gameObject.SetActive(false);
}
}
GetComponent<T>()
同じゲームオブジェクトにアタッチされている、指定した型Tのコンポーネントへの参照を取得します。Unityのコンポーネント指向設計において、他のコンポーネントと連携するための最も基本的なメソッドです。
using UnityEngine;
public class PlayerHealth : MonoBehaviour
{
private Rigidbody rb;
void Start()
{
// 同じGameObjectにアタッチされているRigidbodyコンポーネントを取得
rb = GetComponent<Rigidbody>();
if (rb != null)
{
// Rigidbodyが見つかったら、その質量を10に設定
rb.mass = 10f;
}
}
}
パフォーマンスのヒント: GetComponent<T>()は比較的負荷の高い処理です。Update()のような毎フレーム呼ばれる関数の中で呼び出すのは避け、Awake()やStart()で一度だけ呼び出して結果を変数に保存(キャッシュ)しておくのがベストプラクティスです。
Instantiate() と Destroy()
Instantiate(original):original(Prefabや既存のゲームオブジェクト)のクローンをシーンに生成します。敵や弾、エフェクトなどを動的に生成する際に使用します。Destroy(obj):objで指定したゲームオブジェクト、コンポーネント、またはアセットを破棄します。不要になったオブジェクトをシーンから削除する際に使用します。
using UnityEngine;
public class BulletSpawner : MonoBehaviour
{
public GameObject bulletPrefab;
void Update()
{
// スペースキーが押されたら
if (Input.GetKeyDown(KeyCode.Space))
{
// Prefabから弾を生成する
GameObject newBullet = Instantiate(bulletPrefab, transform.position, Quaternion.identity);
// 3秒後にその弾を破棄する
Destroy(newBullet, 3f);
}
}
}
まとめ
MonoBehaviourは、Unityにおけるスクリプティングの根幹をなすクラスです。このクラスを継承することで、私たちの書いたC#コードは初めてUnityの世界と対話し、ゲームオブジェクトに命を吹き込むことができます。
MonoBehaviourはUnityとスクリプトを繋ぐ架け橋。- 継承することで、コンポーネントとして振る舞い、ライフサイクルイベントを受け取れる。
transform,gameObject,GetComponent<T>()などの便利なプロパティやメソッドが使えるようになる。
Unityでの開発は、このMonoBehaviourをいかにうまく使いこなすかにかかっていると言っても過言ではありません。まずは今回紹介した基本的なプロパティやメソッドに慣れ親しむことから始めましょう。