【Unity】Unityで体感するオブジェクト指向プログラミングの基礎
この記事では、Unityを使ってオブジェクト指向プログラミング(OOP)の基本を学びます。具体的には、Cubeオブジェクトに色を変えるスクリプトをアタッチし、スペースキーを押すことで色が変わる仕組みを解説します。クラスとインスタンスの概念を実際の例で理解しやすく説明し、OOPに対する苦手意識を克服できるようサポートします。初心者でも安心して取り組めるステップバイステップのガイドを提供します。
- 1. サンプルシーン
- 1.1. Unityエディタの各セクションの説明
- 1.2.
ChangeColor (Script)
コンポーネントの詳細 - 1.3. 動作の確認
- 1.4. using UnityEngine;
- 1.5. public class ChangeColor : MonoBehaviour
- 1.6. public Color color;
- 1.7. public Renderer rendererComponent;
- 1.8. void Update()
- 1.9. if (Input.GetKeyDown(KeyCode.Space))
- 1.10. rendererComponent.material.color = color;
- 1.11. 全体の流れ
- 2. 実行結果
- 3. すでにオブジェクト指向を使っていることに気づいていますか?
- 4. クラスとインスタンス(実体)
- 5. 素朴な疑問:Renderer型にMesh Renderer型がなぜ代入できるの?
- 6. 3要素(カプセル化、継承、ポリモーフィズム)はどこ?
サンプルシーン
キャプチャは、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エディタの各セクションの説明
- Sceneビュー(左上):
- ここでは、
Cube
オブジェクトが選択されています。 Cube
オブジェクトが3D空間に配置されている様子が表示されています。
- ここでは、
- Gameビュー(右上):
- ここにはゲームが実行されたときの表示が示されます。
- 現在、カメラから見た視点が表示されています。
- Hierarchyビュー(右側):
- シーン内の全てのゲームオブジェクトがリストされています。
SampleScene
というシーンがあり、その中にMain Camera
、Directional Light
、Global Volume
、Cube
が含まれています。Cube
オブジェクトが選択されています。
- Inspectorビュー(右側中央):
- 選択された
Cube
オブジェクトの詳細情報が表示されています。 - ここでは、
Transform
、Mesh Filter
、Mesh Renderer
、Box Collider
、およびChangeColor (Script)
コンポーネントが表示されています。
- 選択された
ChangeColor (Script)
コンポーネントの詳細
- Script:
ChangeColor
スクリプトがアタッチされています。これは、ユーザーが作成したスクリプトで、Cube
オブジェクトの色を変更する機能を持っています。
- Color:
- 色のプロパティが公開されており、ここでは赤色に設定されています。この色は、スペースキーが押されたときに
Cube
オブジェクトに適用されます。
- 色のプロパティが公開されており、ここでは赤色に設定されています。この色は、スペースキーが押されたときに
- Render Component:
Cube (Mesh Renderer)
が設定されています。これにより、スクリプトがCube
のレンダラーにアクセスして色を変更することができます。
動作の確認
- スクリプトの動作:
ChangeColor
スクリプトは、Cube
オブジェクトにアタッチされているため、ゲームが実行されるときに動作します。Update
メソッドが毎フレーム呼び出され、スペースキーが押されたかどうかを確認します。- スペースキーが押されると、
Cube
オブジェクトの色が赤色に変更されます。
- 実行手順:
- 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
フィールドに設定された色に変更します。
全体の流れ
- スクリプトがアタッチされたオブジェクトに対して、色と
Renderer
コンポーネントを指定します。 - ゲームが実行されると、
Update
メソッドが毎フレーム呼び出されます。 - プレイヤーがスペースキーを押すと、指定された色にオブジェクトの色が変更されます。
このスクリプトは、インタラクティブな要素を持つシンプルな色変更のデモに役立ちます。
実行結果
すでにオブジェクト指向を使っていることに気づいていますか?
このスクリプトはオブジェクト指向プログラミング(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;
}
}
}
ポイントの説明
- クラス(Class):
ChangeColor
クラスは、色を変更する機能を持つオブジェクトの設計図です。
- プロパティ(Property):
public Color color
とpublic Renderer rendererComponent
は、このクラスのプロパティです。これらはオブジェクトが持つデータです。
- メソッド(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エディタで以下の手順を行います。
- ゲームオブジェクトの作成:
- Hierarchyビューで右クリックし、3D Object -> Cubeを選択して新しいCubeゲームオブジェクトを作成します。
- スクリプトのアタッチ:
- Projectビューで先ほど作成した
ChangeColor
スクリプトを見つけます。 - そのスクリプトをドラッグして、Hierarchyビューの"Cube"オブジェクトにドロップします。
- または、"ColorChanger"オブジェクトを選択し、Inspectorビューで"Add Component"ボタンをクリックし、"ChangeColor"と入力してスクリプトを選択します。
- Projectビューで先ほど作成した
- プロパティの設定:
ColorChanger
オブジェクトを選択し、InspectorビューでChangeColor
スクリプトのプロパティを設定します。Color
フィールドには任意の色を設定し、Renderer Component
フィールドには作成したCubeオブジェクトをドラッグして設定します。(MeshRendererコンポーネントがアウトレット接続されます)
3. スクリプトのインスタンスの作成
この操作によって、ChangeColor
クラスのインスタンスがColorChanger
オブジェクトに関連付けられます。具体的には次のようなことが起こります。
- クラスのインスタンス化:
Cube
オブジェクトにChangeColor
クラスのインスタンスが作成され、実行時にUnityが自動的に管理します。
- プロパティの設定:
- Inspectorビューで設定した
color
やrendererComponent
の値が、インスタンスのプロパティに適用されます。
- Inspectorビューで設定した
- メソッドの呼び出し:
Update
メソッドが毎フレーム呼び出され、スペースキーが押された場合に色を変更する処理が実行されます。
まとめ
スクリプトをゲームオブジェクトにアタッチすることで、そのクラスのインスタンスが作成されます。このインスタンスはゲームオブジェクトと紐づけられ、設定されたプロパティやメソッドが実行時に動作します。これにより、オブジェクト指向の概念が実際のゲーム開発にどのように適用されるかを理解できます。
これを通じて、スクリプトのインスタンスがどのように作成され、どのように動作するかを理解しましょう。
素朴な疑問:Renderer型にMesh Renderer型がなぜ代入できるの?
C#は型を一致するのがルールじゃないの?
ディスカッション
コメント一覧
まだ、コメントがありません