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は、UnityMonoBehaviourを継承しています。Startメソッドはprotected virtualとして宣言されており、これは子クラスでオーバーライド可能であることを意味します。Startメソッド内では、コンソールに"Base Start"とログを出力します。

public class BaseClass : MonoBehaviour
{
    protected virtual void Start()
    {
        Debug.Log("Base Start");
    }
}

DerivedClass

DerivedClassBaseClassを継承しています。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クラスには、StartUpdateOnCollisionEnterなどのライフサイクルメソッドが存在します。これらのメソッドは、Unityエンジンによって自動的に呼び出される特別なメソッドです。

継承とオーバーライドの関係

  • MonoBehaviourStartメソッド:
    • MonoBehaviour自体のStartメソッドはvirtualではありません。そのため、C#のオーバーライド機能を利用して直接オーバーライドすることはできません。
  • BaseClassStartメソッド:
    • BaseClassでは、新たにStartメソッドをprotected virtualとして定義しています。これにより、BaseClassを継承する他のクラス(例:DerivedClass)がこのメソッドをオーバーライド可能になります。
  • DerivedClassStartメソッド:
    • DerivedClassでは、BaseClassStartメソッドをoverrideしています。この際、base.Start()を呼び出すことで、親クラスのStartメソッドも実行しています。

継承階層の流れ

  • MonoBehaviourBaseClassDerivedClass の継承階層において:
    • MonoBehaviourはUnityエンジンによって管理される基底クラスです。
    • BaseClassMonoBehaviourを継承し、独自にStartメソッドをvirtualとして定義しています。
    • DerivedClassBaseClassを継承し、Startメソッドをoverrideしています。

重要なポイント:

  • BaseClassStartメソッドは、MonoBehaviourStartメソッドをオーバーライドしているわけではなく、独自に定義されたvirtualメソッドです。
  • これにより、DerivedClassBaseClassStartメソッドをオーバーライドし、親クラスと子クラスの両方の処理を順番に実行することが可能になります。

シーンへのアタッチ方法

シーンにアタッチするのはDerivedClass のスクリプトです。これにより、DerivedClassStartメソッドが呼び出され、その中で親クラスであるBaseClassStartメソッドも実行されます。

手順

  1. スクリプトの作成
    • プロジェクト内でBaseClass.csDerivedClass.csを作成し、上記のコードを記述します。
  2. ゲームオブジェクトの作成
    • シーン内で任意のゲームオブジェクトを作成します。例として、CubeEmpty GameObjectを使用します。
    • 作成したゲームオブジェクトを選択し、DerivedClassスクリプトをアタッチします。

実行結果

ゲームを開始すると、コンソールには以下のメッセージが順番に表示されます。

Base Start
Derived Start

これは、DerivedClassStartメソッドが最初に呼び出され、その中でbase.Start()によってBaseClassStartメソッドが実行された後、DerivedClassの独自の処理が実行されていることを示しています。

使用例

クラスの継承とメソッドのオーバーライドは、以下のようなシナリオで有用です。

  • 共通機能の継承:
    • 複数のゲームオブジェクトが共通の動作や機能を持つ場合、親クラスで基本的な動作を定義し、子クラスで特定の動作を拡張できます。
    • :
      • EnemyBaseクラスで基本的な敵の動作(移動、ダメージ処理)を定義し、FlyingEnemyGroundEnemyなどの子クラスで特定の動作を追加。
  • コードの再利用:
    • 共通する処理を親クラスにまとめることで、コードの重複を避け、保守性を向上させます。
  • 拡張性の向上:
    • 新しい機能や動作を追加する際に、既存の親クラスを拡張するだけで済むため、柔軟な設計が可能になります。

まとめ

  • クラスの継承:
    • BaseClassを親クラスとして、DerivedClassがその機能を継承します。
  • メソッドのオーバーライド:
    • DerivedClassStartメソッドをオーバーライドし、base.Start()を呼び出すことで親クラスの処理を維持しつつ、子クラス独自の処理を追加します。
  • シーンへのアタッチ:
    • 親クラスの機能を活用するために、子クラスのスクリプト(DerivedClass)をシーン内のゲームオブジェクトにアタッチします。
  • 実行結果の確認:
    • コンソールに表示されるログメッセージで、親クラスと子クラスのメソッドが順番に実行されていることを確認できます。

このパターンを活用することで、Unityプロジェクトにおけるコードの再利用性と拡張性を高め、効率的な開発が可能になります。


C#,Unity,継承

Posted by hidepon