Unityにおけるクラス継承とメソッドのオーバーライド
この資料では、UnityにおけるMonoBehaviourを基盤としたクラスの継承とメソッドのオーバーライドの実装方法について解説します。具体的には、親クラスのメソッドを子クラスでオーバーライドし、親クラスの機能を保持しつつ拡張する方法を学びます。これにより、コードの再利用性と拡張性を高め、効率的な開発を実現します。
前提条件
- Unityの基本的な操作方法
- C#の基本的な知識
MonoBehaviourを使用したスクリプトの理解
サンプルコード
以下のサンプルコードは、BaseClassという親クラスと、それを継承したDerivedClassという子クラスで構成されています。Startメソッドをオーバーライドし、親クラスのメソッドを呼び出した上で独自の処理を追加しています。
// BaseClass.cs
using UnityEngine;
public class BaseClass : MonoBehaviour
{
protected virtual void Start()
{
Debug.Log("Base Start");
}
}
// DerivedClass.cs
using UnityEngine;
public class DerivedClass : BaseClass
{
protected override void Start()
{
// 親クラスのStartメソッドを呼び出す
base.Start();
Debug.Log("Derived Start");
}
}
詳細説明
BaseClass
BaseClassは、UnityのMonoBehaviourを継承しています。Startメソッドはprotected virtualとして宣言されており、これは子クラスでオーバーライド可能であることを意味します。Startメソッド内では、コンソールに"Base Start"とログを出力します。
public class BaseClass : MonoBehaviour
{
protected virtual void Start()
{
Debug.Log("Base Start");
}
}
DerivedClass
DerivedClassはBaseClassを継承しています。Startメソッドをprotected overrideとしてオーバーライドし、まずbase.Start()を呼び出すことで親クラスのStartメソッドを実行し、その後に独自の処理として"Derived Start"とログを出力します。
public class DerivedClass : BaseClass
{
protected override void Start()
{
// 親クラスのStartメソッドを呼び出す
base.Start();
Debug.Log("Derived Start");
}
}
クラス継承とUnityのライフサイクルメソッド
UnityのMonoBehaviourとライフサイクルメソッド
UnityのMonoBehaviourクラスには、Start、Update、OnCollisionEnterなどのライフサイクルメソッドが存在します。これらのメソッドは、Unityエンジンによって自動的に呼び出される特別なメソッドです。
継承とオーバーライドの関係
MonoBehaviourのStartメソッド:MonoBehaviour自体のStartメソッドはvirtualではありません。そのため、C#のオーバーライド機能を利用して直接オーバーライドすることはできません。
BaseClassのStartメソッド:BaseClassでは、新たにStartメソッドをprotected virtualとして定義しています。これにより、BaseClassを継承する他のクラス(例:DerivedClass)がこのメソッドをオーバーライド可能になります。
DerivedClassのStartメソッド:DerivedClassでは、BaseClassのStartメソッドをoverrideしています。この際、base.Start()を呼び出すことで、親クラスのStartメソッドも実行しています。
継承階層の流れ
MonoBehaviour→BaseClass→DerivedClassの継承階層において:MonoBehaviourはUnityエンジンによって管理される基底クラスです。BaseClassはMonoBehaviourを継承し、独自にStartメソッドをvirtualとして定義しています。DerivedClassはBaseClassを継承し、Startメソッドをoverrideしています。
重要なポイント:
BaseClassのStartメソッドは、MonoBehaviourのStartメソッドをオーバーライドしているわけではなく、独自に定義されたvirtualメソッドです。- これにより、
DerivedClassはBaseClassのStartメソッドをオーバーライドし、親クラスと子クラスの両方の処理を順番に実行することが可能になります。
シーンへのアタッチ方法
シーンにアタッチするのはDerivedClass のスクリプトです。これにより、DerivedClassのStartメソッドが呼び出され、その中で親クラスであるBaseClassのStartメソッドも実行されます。
手順
- スクリプトの作成
- プロジェクト内で
BaseClass.csとDerivedClass.csを作成し、上記のコードを記述します。
- プロジェクト内で
- ゲームオブジェクトの作成
- シーン内で任意のゲームオブジェクトを作成します。例として、
CubeやEmpty GameObjectを使用します。 - 作成したゲームオブジェクトを選択し、DerivedClassスクリプトをアタッチします。
- シーン内で任意のゲームオブジェクトを作成します。例として、
実行結果
ゲームを開始すると、コンソールには以下のメッセージが順番に表示されます。
Base Start
Derived Start
これは、DerivedClassのStartメソッドが最初に呼び出され、その中でbase.Start()によってBaseClassのStartメソッドが実行された後、DerivedClassの独自の処理が実行されていることを示しています。
使用例
クラスの継承とメソッドのオーバーライドは、以下のようなシナリオで有用です。
- 共通機能の継承:
- 複数のゲームオブジェクトが共通の動作や機能を持つ場合、親クラスで基本的な動作を定義し、子クラスで特定の動作を拡張できます。
- 例:
EnemyBaseクラスで基本的な敵の動作(移動、ダメージ処理)を定義し、FlyingEnemyやGroundEnemyなどの子クラスで特定の動作を追加。
- コードの再利用:
- 共通する処理を親クラスにまとめることで、コードの重複を避け、保守性を向上させます。
- 拡張性の向上:
- 新しい機能や動作を追加する際に、既存の親クラスを拡張するだけで済むため、柔軟な設計が可能になります。
まとめ
- クラスの継承:
BaseClassを親クラスとして、DerivedClassがその機能を継承します。
- メソッドのオーバーライド:
DerivedClassでStartメソッドをオーバーライドし、base.Start()を呼び出すことで親クラスの処理を維持しつつ、子クラス独自の処理を追加します。
- シーンへのアタッチ:
- 親クラスの機能を活用するために、子クラスのスクリプト(
DerivedClass)をシーン内のゲームオブジェクトにアタッチします。
- 親クラスの機能を活用するために、子クラスのスクリプト(
- 実行結果の確認:
- コンソールに表示されるログメッセージで、親クラスと子クラスのメソッドが順番に実行されていることを確認できます。
このパターンを活用することで、Unityプロジェクトにおけるコードの再利用性と拡張性を高め、効率的な開発が可能になります。





ディスカッション
コメント一覧
まだ、コメントがありません