クラス (Classes)

クラスは、データと関数を組み合わせたものです。Godot API(アプリケーションプログラミングインターフェース)には、多くの事前定義されたクラスがあります。これらのクラスは、公式ドキュメントの API セクションで説明されています。

クラスを使用する場合、通常はその新しいインスタンスを作成します。このクラスの新しいインスタンスは、固有の参照を持つオブジェクトです。例えば、Godot のシーン内のノードは、クラスのインスタンスです。

新しいシーンを作成するときは、Node2D のような既存のクラスを拡張します。そのため、コードの最初の行では、どのクラスが拡張されているかを指定します。

クラスのデータは、プロパティと呼ばれる変数に格納されます。そして、関数はメソッドと呼ばれます。クラスを拡張すると、そのプロパティとメソッドにアクセスできるようになります。また、自分のプロパティやメソッドを追加して、機能を拡張することも可能です。

一部のメソッドは、自分で定義したもので置き換えることができます。例えば、_ready や _process 関数のようなものです。これらは仮想メソッドと呼ばれ、名前の先頭にアンダースコアが付いています。これまでのコード例のほとんどで、拡張された Node2D クラス内で _ready 関数を置き換えてきました。

シーンを保存すると、それを他のシーンで再利用するための新しいインスタンスを作成できます。この時点で、名前のない新しいクラスを作成したことになります。クラスに名前を付けるには、class_name キーワードを使用して、Godot のエディター内で新しい型として登録します。

新しいクラスを拡張し命名する例:
class_name Motorcycle extends Node2D

# プロパティを追加
export(String) var make = "Kawasaki"
export(int) var cc = 900
export(Color, RGB) var color = ColorN("Ninja Green")
var fuel = 0.0
var speed = 0.0

# 仮想メソッドをオーバーライド
func _ready():
add_fuel(17.3)

func _process(delta):
if fuel > 0.0:
speed += delta
fuel -= delta
print(speed, "km/h")

# 新しいメソッドを追加
func add_fuel(litres):
fuel += litres


OOP クラスを使用してプログラムを書くことをオブジェクト指向プログラミング(Object Oriented Programming, OOP)と言います。これは、大規模プロジェクトの機能を関連する機能の管理可能なチャンク(モジュール)に整理するのに役立ちます(カプセル化)。

モジュールの構成方法(コードアーキテクチャ)は、いくつかのよく知られたデザインパターンとして説明されています。Godot でもこれらが使用されており、以下はその例です:

  • シングルトンパターン — Autoload スクリプトを使用してグローバルデータやグローバル関数を格納
  • オブザーバーパターン — シグナルを使用して観測者(接続されたスクリプト)に通知
  • ファクトリーパターン — Autoload シーンを使用して事前定義されたノードを格納し、それらのインスタンスを生成する関数を提供


継承 (Inheritance) Godot では、Node 階層のようにクラスの継承が広く使用されています。一番基本的なクラスである Object から始まり、そこから Node クラスが拡張されます。そして Node はさらに拡張され、Node2DSpatial、および Control クラスが作成されます。

エディターでは、新しいノードをシーンに追加する際にクラス階層を確認できます。また、インスペクターパネルでは、任意のノードのクラスチェーンを確認できます。


コンポジション (Composition) もう一つの OOP の概念は、コンポジション です。これは、あるクラスが他のクラスのインスタンスで構成されている場合を指します。ゲーム内のシーンを、さまざまなノードのインスタンスを追加して構成するのが一例です。このシーンにも class_name 値を設定できますが、ほとんどの場合、省略されます。


結論 (Conclusion) GDScript プログラミングの基本は以上です。これらのチュートリアルを、知識を再確認するための参考資料としてぜひ活用してください。
最終更新日: 2024/12/27 02:41

コメント