【Unity】オブジェクト指向の3要素をUnityで理解する:カプセル化、継承、ポリモーフィズム

オブジェクト指向プログラミング(OOP)の3要素である「カプセル化」、「継承」、「ポリモーフィズム」がどのようにこのUnityのサンプルに適用されているかを説明します。

サンプルコード

rendererComponentには、インスペクターでドラッグ&ドロップで登録します
登録されていないときは、自動的に取得できるように工夫されています

using UnityEngine;

public class ChangeColor : MonoBehaviour
{
    public Color color;  // この変数は、変更するための新しい色を保持します
    public Renderer rendererComponent;  // 汎用的なRenderer型を使用します

    void Start()
    {
        // Rendererコンポーネントがアタッチされていない場合、自動で取得します
        if (rendererComponent == null)
        {
            rendererComponent = GetComponent<Renderer>();
        }
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            rendererComponent.material.color = color;
        }
    }
}

1. カプセル化(Encapsulation)

カプセル化は、データとそれを操作するメソッドを一つのオブジェクトとしてまとめることを指します。このサンプルでは、ChangeColorクラスがカプセル化の例です。

public class ChangeColor : MonoBehaviour
{
    public Color color;  // データ(プロパティ)
    public Renderer rendererComponent;  // データ(プロパティ)

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            rendererComponent.material.color = color;  // データを操作するメソッド
        }
    }
}

ここで使われている「プロパティ」は、Unityのインスペクターで公開されるフィールドを指しています。具体的には、colorrendererComponentです。

publicキーワードを使っているため、Unityエディターのインスペクターでこれらのフィールドを設定することができます。プロパティという言葉は、C#において通常、ゲッターとセッターを持つメンバーを指しますが、Unityの文脈では、インスペクターで設定できる公開フィールドも広義に「プロパティ」と呼ばれることがあります。

public Color color;  // インスペクターで設定可能なフィールド
public Renderer rendererComponent;  // インスペクターで設定可能なフィールド
  • colorrendererComponentは、ChangeColorクラスの内部データです。
  • Updateメソッドは、このデータにアクセスして操作します。
  • データと操作が一つのクラスにまとめられているため、これがカプセル化の例となります。

2. 継承(Inheritance)

継承は、あるクラスが他のクラスのプロパティやメソッドを引き継ぐことを指します。このサンプルでは、ChangeColorクラスがMonoBehaviourクラスを継承しています。

public class ChangeColor : MonoBehaviour
{
    // MonoBehaviourクラスからメソッドやプロパティを継承しています
}
  • ChangeColorクラスは、MonoBehaviourクラスを継承しています。
  • これにより、ChangeColorクラスはMonoBehaviourのメソッド(例えばStartUpdate)やプロパティにアクセスできます。
  • MonoBehaviourを継承することで、ChangeColorはUnityのコンポーネントとして機能し、シーン内のオブジェクトにアタッチできます。

3. ポリモーフィズム(Polymorphism)

ポリモーフィズムは、異なるクラスが同じインターフェースや基本クラスを共有し、同じメソッドを異なる方法で実装できることを指します。このサンプルでは、Renderer型がポリモーフィズムの例です。

public class ChangeColor : MonoBehaviour
{
    public Renderer rendererComponent;  // Renderer型のプロパティ

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.Space))
        {
            rendererComponent.material.color = color;
        }
    }
}
  • Rendererは抽象クラスで、具体的な実装としてMeshRendererSpriteRendererなどのサブクラスがあります。
  • ChangeColorクラスでは、rendererComponentがどの具体的なタイプのRendererであるかに関わらず、Renderer型として操作します。
  • 実行時には、rendererComponentMeshRendererであってもSpriteRendererであっても、同じコードで動作します。これはポリモーフィズムの一例です。

まとめ

このサンプルコードを通じて、オブジェクト指向プログラミングの3要素を以下のように学ぶことができます。

  • カプセル化: データとそれを操作するメソッドを1つのクラスにまとめる。
  • 継承: クラスが他のクラスのプロパティやメソッドを引き継ぐ。
  • ポリモーフィズム: 同じ基本クラスやインターフェースを使って異なるクラスが同じメソッドを異なる方法で実装する。

これにより、オブジェクト指向プログラミングの基本概念が実際のコード例を通じて理解できるようになります。