【Unity】Unityで体感するオブジェクト指向プログラミングの基礎

2024年6月4日

この記事では、Unityを使ってオブジェクト指向プログラミング(OOP)の基本を学びます。具体的には、Cubeオブジェクトに色を変えるスクリプトをアタッチし、スペースキーを押すことで色が変わる仕組みを解説します。クラスとインスタンスの概念を実際の例で理解しやすく説明し、OOPに対する苦手意識を克服できるようサポートします。初心者でも安心して取り組めるステップバイステップのガイドを提供します。

サンプルシーン

キャプチャは、Unityバージョン6Previewになりますが、バージョン依存性がないサンプルのため、意識する必要がありません

using UnityEngine;  // Unityエンジンの機能を使用するための指示

// ChangeColorクラスは、ゲームオブジェクトの色を変更するためのスクリプトです
public class ChangeColor : MonoBehaviour
{
    // PublicフィールドはUnityエディタから設定可能です
    public Color color;  // この変数は、変更するための新しい色を保持します

    // Rendererコンポーネントを参照する変数です
    public Renderer rendererComponent;

    // Updateメソッドは毎フレーム呼び出されます
    void Update()
    {
        // スペースキーが押された瞬間を検出します
        if (Input.GetKeyDown(KeyCode.Space))
        {
            // Rendererコンポーネントのマテリアルの色を指定された色に変更します
            rendererComponent.material.color = color;
        }
    }
}

このスクリーンショットはUnityエディタの画面を示しています。ここでは、CubeオブジェクトにChangeColorスクリプトがアタッチされ、設定されています。詳細な説明を以下に示します。

Unityエディタの各セクションの説明

  1. Sceneビュー(左上):
    • ここでは、Cubeオブジェクトが選択されています。
    • Cubeオブジェクトが3D空間に配置されている様子が表示されています。
  2. Gameビュー(右上):
    • ここにはゲームが実行されたときの表示が示されます。
    • 現在、カメラから見た視点が表示されています。
  3. Hierarchyビュー(右側):
    • シーン内の全てのゲームオブジェクトがリストされています。
    • SampleSceneというシーンがあり、その中にMain CameraDirectional LightGlobal VolumeCubeが含まれています。
    • Cubeオブジェクトが選択されています。
  4. Inspectorビュー(右側中央):
    • 選択されたCubeオブジェクトの詳細情報が表示されています。
    • ここでは、TransformMesh FilterMesh RendererBox Collider、およびChangeColor (Script)コンポーネントが表示されています。

ChangeColor (Script)コンポーネントの詳細

  • Script:
    • ChangeColorスクリプトがアタッチされています。これは、ユーザーが作成したスクリプトで、Cubeオブジェクトの色を変更する機能を持っています。
  • Color:
    • 色のプロパティが公開されており、ここでは赤色に設定されています。この色は、スペースキーが押されたときにCubeオブジェクトに適用されます。
  • Render Component:
    • Cube (Mesh Renderer)が設定されています。これにより、スクリプトがCubeのレンダラーにアクセスして色を変更することができます。

動作の確認

  1. スクリプトの動作:
    • ChangeColorスクリプトは、Cubeオブジェクトにアタッチされているため、ゲームが実行されるときに動作します。
    • Updateメソッドが毎フレーム呼び出され、スペースキーが押されたかどうかを確認します。
    • スペースキーが押されると、Cubeオブジェクトの色が赤色に変更されます。
  2. 実行手順:
    • Unityエディタの上部にある「再生」ボタンをクリックしてゲームを実行します。
    • ゲームが実行されている間、スペースキーを押すと、Cubeオブジェクトの色が赤色に変わることを確認できます。

これにより、Unityでオブジェクトにスクリプトをアタッチして動作させる方法と、その効果を視覚的に確認する手順が理解できると思います。

用語:プロパティ(属性)

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

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

このコードは、UnityのC#スクリプトで、特定のキーを押すとオブジェクトの色を変更するためのものです。以下にコードの各部分の詳細な説明を示します。

using UnityEngine;

これはUnityエンジンの機能を使用するための指示です。UnityEngine名前空間には、ゲームオブジェクト、コンポーネント、その他のゲーム作成に必要なクラスが含まれています。

public class ChangeColor : MonoBehaviour

ChangeColorというクラスを定義しています。このクラスはMonoBehaviourを継承しており、これによりUnityのゲームオブジェクトのスクリプトとして機能します。

public Color color;

これは公開フィールドで、Unityエディタからこのスクリプトがアタッチされているオブジェクトの色を指定できます。

public Renderer rendererComponent;

これも公開フィールドで、このスクリプトがアタッチされているオブジェクトのRendererコンポーネントを指定します。Rendererはオブジェクトの見た目(メッシュ、マテリアル、色など)を制御するために使用されます。

void Update()

Updateメソッドは、Unityのライフサイクルメソッドの一つで、毎フレーム呼び出されます。ゲームのロジックや入力処理など、フレームごとに更新する必要がある処理を行う場所です。

if (Input.GetKeyDown(KeyCode.Space))

この条件文は、プレイヤーがスペースキーを押した瞬間にtrueを返します。Input.GetKeyDownメソッドはキーが押されたフレームだけtrueを返します。

rendererComponent.material.color = color;

プレイヤーがスペースキーを押したときに実行されるコードです。rendererComponentのマテリアルの色をcolorフィールドに設定された色に変更します。

全体の流れ

  1. スクリプトがアタッチされたオブジェクトに対して、色とRendererコンポーネントを指定します。
  2. ゲームが実行されると、Updateメソッドが毎フレーム呼び出されます。
  3. プレイヤーがスペースキーを押すと、指定された色にオブジェクトの色が変更されます。

このスクリプトは、インタラクティブな要素を持つシンプルな色変更のデモに役立ちます。

実行結果

すでにオブジェクト指向を使っていることに気づいていますか?

このスクリプトはオブジェクト指向プログラミング(OOP)の概念を活用しています。オブジェクト指向の視点からこのスクリプトの説明を加えます。

オブジェクト指向プログラミングの説明

オブジェクト指向プログラミング(OOP)は、プログラムを「オブジェクト」と呼ばれる独立した単位で構成する方法です。オブジェクトはデータ(プロパティ)とそれに対する操作(メソッド)を持ちます。OOPの主な概念には、クラス、オブジェクト、プロパティ、メソッド、継承、ポリモーフィズムがあります。

クラスとオブジェクト

  • クラス: クラスはオブジェクトの設計図です。特定のデータとそのデータに対する操作を定義します。
  • オブジェクト: オブジェクトはクラスから作成された具体的なインスタンス(実体)です。

このスクリプトにおけるOOPの適用

using UnityEngine;  // Unityエンジンの機能を使用するための指示

// ChangeColorクラスは、ゲームオブジェクトの色を変更するための設計図です
public class ChangeColor : MonoBehaviour  // MonoBehaviourを継承しているため、Unityのゲームオブジェクトとして機能します
{
    // クラスのプロパティ(データ)
    public Color color;  // このプロパティは、新しい色を保持します

    // クラスのプロパティ(データ)
    public Renderer rendererComponent;  // このプロパティは、オブジェクトの表示を制御するRendererコンポーネントを参照します

    // クラスのメソッド(操作)
    void Update()  // Updateメソッドは、毎フレーム呼び出される操作です
    {
        // スペースキーが押されたかどうかをチェックします
        if (Input.GetKeyDown(KeyCode.Space))
        {
            // オブジェクトの色を変更する操作
            rendererComponent.material.color = color;
        }
    }
}

ポイントの説明

  1. クラス(Class):
    • ChangeColorクラスは、色を変更する機能を持つオブジェクトの設計図です。
  2. プロパティ(Property):
    • public Color colorpublic Renderer rendererComponentは、このクラスのプロパティです。これらはオブジェクトが持つデータです。
  3. メソッド(Method):
    • Update()メソッドは、このクラスの操作を定義します。このメソッドは毎フレーム呼び出され、スペースキーが押されたかどうかをチェックして色を変更する操作を行います。

OOPのメリット

  • 再利用性: クラスを再利用して、同じ機能を持つ複数のオブジェクトを簡単に作成できます。
  • 拡張性: クラスを変更することで、全てのインスタンスに影響を与えます。
  • 保守性: コードが整理され、読みやすく、バグの修正や機能の追加が容易です。

このように、OOPの概念を理解すると、スクリプトの構造と動作をより深く理解することができます。

クラスとインスタンス(実体)

オブジェクト指向の観点から、Unityにおけるスクリプトのアタッチとインスタンスの作成について説明します。

インスタンスとスクリプトのアタッチ

Unityでは、スクリプトをゲームオブジェクトにアタッチすることで、そのスクリプトのインスタンスが作成されます。ここでは、具体的な手順とその意味を説明します。

1. スクリプトの作成

まず、以下のようなスクリプトを作成します。

using UnityEngine;

public class ChangeColor : MonoBehaviour
{
    public Color color;
    public Renderer rendererComponent;

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

2. スクリプトをゲームオブジェクトにアタッチ

Unityエディタで以下の手順を行います。

  1. ゲームオブジェクトの作成:
    • Hierarchyビューで右クリックし、3D Object -> Cubeを選択して新しいCubeゲームオブジェクトを作成します。
  2. スクリプトのアタッチ:
    • Projectビューで先ほど作成したChangeColorスクリプトを見つけます。
    • そのスクリプトをドラッグして、Hierarchyビューの"Cube"オブジェクトにドロップします。
    • または、"ColorChanger"オブジェクトを選択し、Inspectorビューで"Add Component"ボタンをクリックし、"ChangeColor"と入力してスクリプトを選択します。
  3. プロパティの設定:
    • ColorChangerオブジェクトを選択し、InspectorビューでChangeColorスクリプトのプロパティを設定します。
    • Colorフィールドには任意の色を設定し、Renderer Componentフィールドには作成したCubeオブジェクトをドラッグして設定します。(MeshRendererコンポーネントがアウトレット接続されます)

3. スクリプトのインスタンスの作成

この操作によって、ChangeColorクラスのインスタンスがColorChangerオブジェクトに関連付けられます。具体的には次のようなことが起こります。

  • クラスのインスタンス化:
    • CubeオブジェクトにChangeColorクラスのインスタンスが作成され、実行時にUnityが自動的に管理します。
  • プロパティの設定:
    • Inspectorビューで設定したcolorrendererComponentの値が、インスタンスのプロパティに適用されます。
  • メソッドの呼び出し:
    • Updateメソッドが毎フレーム呼び出され、スペースキーが押された場合に色を変更する処理が実行されます。

まとめ

スクリプトをゲームオブジェクトにアタッチすることで、そのクラスのインスタンスが作成されます。このインスタンスはゲームオブジェクトと紐づけられ、設定されたプロパティやメソッドが実行時に動作します。これにより、オブジェクト指向の概念が実際のゲーム開発にどのように適用されるかを理解できます。

これを通じて、スクリプトのインスタンスがどのように作成され、どのように動作するかを理解しましょう。

素朴な疑問:Renderer型にMesh Renderer型がなぜ代入できるの?

C#は型を一致するのがルールじゃないの?

3要素(カプセル化、継承、ポリモーフィズム)はどこ?

C#,Unity

Posted by hidepon