Unity_Lesson

コンポジションのプログラム例

コンポジションは、クラスが他のクラスのインスタンスをメンバーとして保持し、その機能を利用するデザインパターンです。以下に、コンポジションを使った簡単な例を示します。

using System;

public class Engine
{
    public int HorsePower { get; private set; }

    public Engine(int horsePower)
    {
        HorsePower = horsePower;
    }

    public void Start()
    {
        Console.WriteLine($"Engine with {HorsePower} HP started.");
    }
}

public class Car
{
    private Engine engine;

    public Car(int horsePower)
    {
        engine = new Engine(horsePower);
    }

    public void StartCar()
    {
        Console.WriteLine("Car is starting...");
        engine.Start();
    }
}

class Program
{
    static void Main()
    {
        Car myCar = new Car(250);
        myCar.StartCar();
    }
}

コンポジションのプログラム解説

  1. Engineクラス:
    • Engineクラスは、エンジンを表すクラスです。HorsePower(馬力)というプロパティと、Startメソッドを持っています。このクラスは他のクラスに独立して使われることも可能です。
  2. Carクラス:
    • Carクラスは、車を表すクラスです。このクラスはEngineクラスのインスタンスを内部で持っています。これはコンポジションの例です。
    • CarクラスのStartCarメソッドは、まず「車が始動する」と表示し、その後EngineStartメソッドを呼び出します。
  3. Programクラス(エントリーポイント):
    • Carクラスのインスタンスを作成し、StartCarメソッドを呼び出すと、車のエンジンが始動することを示すメッセージが表示されます。

コンポジションのポイント

Boundsを使ったプログラム例

次に、Boundsを使った簡単なプログラム例を示します。ここでは、2つのオブジェクトのBoundsが重なっているかどうかを判定します。

using UnityEngine;

public class BoundsExample : MonoBehaviour
{
    public GameObject objectA; // 最初のオブジェクト
    public GameObject objectB; // 2つ目のオブジェクト

    void Start()
    {
        // 各オブジェクトのColliderからBoundsを取得
        Bounds boundsA = objectA.GetComponent<Collider>().bounds;
        Bounds boundsB = objectB.GetComponent<Collider>().bounds;

        // Bounds同士の重なりをチェック
        if (boundsA.Intersects(boundsB))
        {
            Debug.Log("Bounds are intersecting!");
        }
        else
        {
            Debug.Log("Bounds are not intersecting.");
        }
    }
}

Boundsプログラム解説

  1. Boundsの取得:
    • objectAobjectBColliderコンポーネントからBoundsを取得します。Collider.boundsプロパティを使って、そのオブジェクトが占める空間の境界を表すBoundsが得られます。
  2. Boundsの重なり判定:
    • Bounds.Intersectsメソッドを使って、2つのBoundsが重なっているかどうかを判定します。重なっている場合は「Bounds are intersecting!」と表示され、そうでない場合は「Bounds are not intersecting.」と表示されます。

この例では、Boundsが2つのオブジェクトの空間的な範囲を表し、その範囲が重なっているかどうかを確認しています。これにより、オブジェクト同士の衝突を効率的に判定することができます。

コンポジションとBoundsの両方の概念が理解できるように、シンプルな例を示しました。これらの理解が進むと、さらに複雑なシステムの設計にも応用できるようになります。





GameObject同士の当たり判定などは、内部的にBoundsから座標情報を取得し、座標同士の重なり合いを見ている





Unityにおけるゲームオブジェクト同士の当たり判定は、内部的にBoundsを利用して行われています。以下のような流れで処理されます。

1. Boundsの取得

2. 当たり判定の処理

3. 衝突の検出

まとめ

このように、Boundsはゲームオブジェクトの当たり判定において非常に重要な役割を果たしています。





この例では、車 (Car) とエンジン (Engine) のクラスを使ってコンポジションを説明します。Unityのコンポーネントシステムを活用して、クラスの関係性やその動作を視覚的に理解できるようにします。

Unityでのコンポジションの授業例

1. Unityプロジェクトの準備

  1. 新しいUnityプロジェクトを作成します。
  2. Scriptsという名前のフォルダを作成し、そこでスクリプトを管理します。

2. Engineクラスの作成

まず、Engineクラスを作成し、車のエンジンとして機能するスクリプトを作ります。

using UnityEngine;

public class Engine
{
    public int horsePower;

    public Engine(int horsePower)
    {
        this.horsePower = horsePower;
    }

    public void Start()
    {
        Debug.Log($"Engine with {horsePower} HP started.");
    }
}

3. Carクラスの作成

次に、Carクラスを作成し、Engineクラスを内部で利用する形にします。これがコンポジションの例です。

using UnityEngine;

public class Car : MonoBehaviour
{
    private Engine engine;

    public int carHorsePower = 250;

    void Start()
    {
        engine = new Engine(carHorsePower);
        StartCar();
    }

    public void StartCar()
    {
        Debug.Log("Car is starting...");
        engine.Start();
    }
}

4. Unityのシーンにスクリプトを配置

  1. Unityのシーンに空のGameObjectを作成し、これを「Car」と名前付けします。
  2. Carスクリプトをこの「Car」オブジェクトにアタッチします。

5. コンポジションの動作を確認

  1. シーンを再生すると、コンソールに以下のメッセージが表示されます:
    • 「Car is starting…」
    • 「Engine with 250 HP started.」

    これで、CarクラスがEngineクラスを内部で保持し、エンジンを起動するためにその機能を使用していることがわかります。これがコンポジションの基本的な例です。

6. 授業での解説ポイント

7. 応用例としてのBounds使用

さらに、Boundsを使った簡単な応用例を示します。この例では、Carが他のオブジェクトと衝突するかどうかをチェックするプログラムを作成します。

using UnityEngine;

public class BoundsExample : MonoBehaviour
{
    public GameObject otherObject;

    void Update()
    {
        Bounds carBounds = GetComponent<Collider>().bounds;
        Bounds otherBounds = otherObject.GetComponent<Collider>().bounds;

        if (carBounds.Intersects(otherBounds))
        {
            Debug.Log("Collision detected between car and another object.");
        }
    }
}

まとめ

これらの例を使って、Unityでコンポジションの概念を視覚的かつ実践的に教えることができます。学生は、実際に動く例を通じて、コンポジションの重要性とその応用方法を理解できるでしょう。