Unityにおける継承の仕組み – Colliderクラスを例に

Unityを使用した開発では、オブジェクト指向プログラミングの概念である「継承」が非常に重要な役割を果たします。継承を理解することで、コードの再利用性を高め、シンプルかつ効率的なプログラム設計が可能になります。本資料では、Unityの物理エンジンで使用されるColliderクラスを例に取り、継承の仕組みとその活用方法をわかりやすく解説します。Colliderクラスを通じて、基本クラスと派生クラスの関係、共通プロパティの使用方法、そして多態性の応用について学びましょう。

UnityEngine内での継承の実装

1. 継承の概要

継承は、あるクラスが別のクラスの性質(プロパティやメソッド)を引き継ぐ仕組みです。これにより、共通の機能を再利用しながら、特化したクラスを効率的に作成できます。Unityでは継承を利用することで、コードの柔軟性と再利用性を向上させます。

2. 基本クラスと派生クラス

  • 基本クラス(Base Class): 他のクラスが継承する元となるクラス。
  • 派生クラス(Derived Class): 基本クラスを継承して、追加機能や特化した機能を持つクラス。

Unityでは、以下のクラスが継承関係にあります:

  • 基本クラス: Collider
  • 派生クラス:
    • BoxCollider
    • SphereCollider
    • CapsuleCollider

3. Colliderクラスの役割

Colliderは、Unityの物理エンジンで物体の衝突判定を行うための基本クラスです。派生クラスであるBoxColliderSphereColliderなどが、特定の形状に特化した機能を提供します。

共通のプロパティ(Colliderクラスに定義されるもの)
  • isTrigger:コライダーをトリガーとして機能させるかどうかを指定。
  • enabled:コライダーを有効化または無効化。
  • bounds:コライダーの境界を取得。
  • ClosestPoint(Vector3 position):指定された位置に最も近い点を計算。

4. サンプルコード

基本クラスと派生クラスの活用

以下は、BoxColliderが基本クラスであるColliderのプロパティやメソッドを利用する例です。

using UnityEngine;

public class ColliderExample : MonoBehaviour
{
    void Start()
    {
        // BoxColliderコンポーネントを取得
        BoxCollider boxCollider = gameObject.AddComponent<BoxCollider>();

        // 基本クラスColliderのプロパティを使用
        boxCollider.isTrigger = true;  // トリガーとして設定
        boxCollider.enabled = true;   // コライダーを有効化

        // 基本クラスのメソッドを使用
        Vector3 closestPoint = boxCollider.ClosestPoint(new Vector3(1, 1, 1));
        Debug.Log($"Closest Point: {closestPoint}");

        // 派生クラス独自のプロパティ
        boxCollider.size = new Vector3(2, 2, 2);  // BoxColliderのサイズを設定
    }
}

5. 基本クラスと派生クラスの違い

クラス名説明
Colliderコライダーの共通機能を提供する基本クラス。isTriggerClosestPointなどを定義。
BoxCollider四角形のコライダーを提供する派生クラス。独自のプロパティとしてsizeが使用可能。
SphereCollider球形のコライダーを提供する派生クラス。独自のプロパティとしてradiusが使用可能。
CapsuleColliderカプセル形状のコライダーを提供する派生クラス。独自のプロパティとしてheightradiusが使用可能。

6. 多態性の活用

継承を使うことで、多態性(Polymorphism)を利用した統一的な操作が可能になります。

using UnityEngine;

public class ColliderPolymorphism : MonoBehaviour
{
    void Start()
    {
        Collider collider = gameObject.AddComponent<SphereCollider>();
        collider.isTrigger = true; // 基本クラスのプロパティ

        // ColliderがSphereColliderとして使われる
        if (collider is SphereCollider sphereCollider)
        {
            sphereCollider.radius = 1.5f; // 派生クラスのプロパティ
        }
    }
}

7. まとめ

  1. 基本クラス(Collider)は共通の動作やプロパティを提供。
  2. 派生クラス(BoxCollider, SphereColliderなど)は、それぞれ特化した追加の機能を持つ。
  3. 多態性を活用することで、基本クラスを利用した柔軟な設計が可能。

このように、Unityでは継承を活用することで効率的かつ再利用性の高いコードを実現できます。

シンプルな基本クラスに代入可能サンプル

基本クラスのCollider型で宣言されているところに派生クラスのアウトレット接続ができるサンプル

using UnityEngine;

public class ColliderAttackTest : MonoBehaviour
{
    public Collider someCollider;
}

参考:アウトレット接続された派生クラスの方を確認する

以下のスクリプトで、インスペクターにドラッグ&ドロップしたコライダーの派生クラスの型を日本語のメッセージでコンソールに表示できます。

using UnityEngine;

public class ColliderAttackTest : MonoBehaviour
{
    public Collider someCollider;

    void Start()
    {
        if (someCollider != null)
        {
            // コライダーの型を取得してコンソールに表示
            Debug.Log($"アタッチされたコライダーの型: {someCollider.GetType()}");
        }
        else
        {
            Debug.LogWarning("someColliderにコライダーが設定されていません。");
        }
    }
}

解説

someCollider.GetType():

アタッチされたコライダーがBoxColliderSphereColliderなど、どの派生クラスなのかを取得します。

使い方

  1. このスクリプトをGameObjectにアタッチしてください。
  2. インスペクターでsomeColliderフィールドにコライダーをドラッグ&ドロップしてください。
  3. ゲームを開始すると、アタッチしたコライダーの型がUnityコンソールに表示されます。

派生コライダーの型で判定をしたい場合

using UnityEngine;

public class ColliderAttackTest : MonoBehaviour
{
    public Collider someCollider;

    void Start()
    {
        if (someCollider != null)
        {
            // コライダーの型を取得して表示
            Debug.Log($"アタッチされたコライダーの型: {someCollider.GetType()}");

            // BoxColliderの場合の処理
            if (someCollider is BoxCollider)
            {
                Debug.Log("このコライダーはBoxColliderです。");
            }
            else
            {
                Debug.Log("このコライダーはBoxColliderではありません。");
            }
        }
        else
        {
            Debug.LogWarning("someColliderにコライダーが設定されていません。");
        }
    }
}