技術資料:UnityのColliderクラスの疑似継承構造

1. はじめに

UnityのColliderクラスは、物理演算に使用される基底クラスであり、BoxColliderSphereColliderなどの派生クラスにより様々な形状の衝突判定が実現されています。本資料では、Colliderクラスの継承構造を疑似的に再現したサンプルコードを提供し、その動作と設計思想を解説します。


2. Colliderクラスと派生クラスの疑似実装

基底クラス:Collider

Colliderは抽象クラスとして設計され、共通のプロパティとメソッドを提供します。

public abstract class Collider
{
    public Vector3 center { get; set; }
    public bool enabled { get; set; }

    // 共通の動作を定義
    public virtual void OnCollision()
    {
        Console.WriteLine("Collider: 衝突が検知されました。");
    }
}
  • 共通プロパティ:
    • center: コライダーの中心座標。
    • enabled: コライダーの有効/無効状態。
  • 共通メソッド:
    • OnCollision: 衝突時の動作を定義(派生クラスでオーバーライド可能)。

派生クラスの設計

各派生クラスはColliderを継承し、それぞれ特有のプロパティと動作を持ちます。

1. BoxCollider

public class BoxCollider : Collider
{
    public Vector3 size { get; set; }

    public override void OnCollision()
    {
        Console.WriteLine("BoxCollider: 箱型のコライダーに衝突しました。");
    }
}
  • 特有プロパティ: size(箱の大きさ)。

2. SphereCollider

public class SphereCollider : Collider
{
    public float radius { get; set; }

    public override void OnCollision()
    {
        Console.WriteLine("SphereCollider: 球型のコライダーに衝突しました。");
    }
}
  • 特有プロパティ: radius(球の半径)。

3. CapsuleCollider

public class CapsuleCollider : Collider
{
    public float radius { get; set; }
    public float height { get; set; }

    public override void OnCollision()
    {
        Console.WriteLine("CapsuleCollider: カプセル型のコライダーに衝突しました。");
    }
}
  • 特有プロパティ: radius(半径)、height(高さ)。

3. 使用例

以下のコードで各コライダーをインスタンス化し、動的なポリモーフィズムを確認できます。

class Program
{
    static void Main(string[] args)
    {
        Collider box = new BoxCollider { center = new Vector3(0, 0, 0), enabled = true };
        Collider sphere = new SphereCollider { center = new Vector3(1, 1, 1), enabled = true };
        Collider capsule = new CapsuleCollider { center = new Vector3(-1, -1, -1), enabled = true };

        box.OnCollision();     // BoxColliderの動作
        sphere.OnCollision();  // SphereColliderの動作
        capsule.OnCollision(); // CapsuleColliderの動作
    }
}

// 疑似的なVector3クラス
public struct Vector3
{
    public float x, y, z;

    public Vector3(float x, float y, float z)
    {
        this.x = x;
        this.y = y;
        this.z = z;
    }

    public override string ToString() => $"({x}, {y}, {z})";
}

4. 実行結果

以下のようなメッセージがコンソールに出力されます。

BoxCollider: 箱型のコライダーに衝突しました。
SphereCollider: 球型のコライダーに衝突しました。
CapsuleCollider: カプセル型のコライダーに衝突しました。

5. ポイント

抽象クラスの利用:

Colliderを抽象化することで共通のインターフェースを提供します。

ポリモーフィズム:

基底クラス型で派生クラスを扱うことで、動的な動作を実現しています。

拡張性:

新たな形状のコライダーを追加する際も、Colliderを継承するだけで容易に実装可能です。


6. 応用例

この構造を応用することで、以下のような拡張が可能です。

  • カスタムコライダーの追加(例: 三角形コライダー)。
  • 衝突イベントに基づく独自の動作(例: 特定のエフェクトを生成)。

7. まとめ

本資料では、UnityのColliderクラスの疑似継承構造を解説しました。このような設計は、現実の開発プロジェクトでも役立つ基盤となります。抽象クラスの設計やポリモーフィズムの活用方法を学ぶことで、より柔軟で保守性の高いコードを実現できます。

C#,Unity,継承

Posted by hidepon