自動読み込みと通常ノード

Godot には、プロジェクトのルートにあるノードを自動的に読み込む機能が用意されており、グローバルにアクセスできるようにすることで、シングルトンの役割を果たすことができます: シングルトン (自動読み込み)。これらの自動ロードされたノードは、SceneTree.change_scene_to_file を使用してコードからシーンを変更しても解放されません。

このガイドでは、オートロード機能をいつ使用するか、およびそれを回避するために使用できるテクニックを学習します。

オーディオが切断される問題

他のエンジンは、多くの機能をグローバルにアクセス可能なオブジェクトに編成するシングルトンであるマネージャークラスの作成を奨励します。 Godotは、ノードツリーとシグナルのおかげで、グローバルな状態を回避する多くの方法を提供します。

たとえば、開発者がプラットフォーム・ゲームを構築していて、効果音を鳴らすコインを収集したいとします。それに使えるノードがあります: AudioStreamPlayer です。しかし、すでにサウンドを再生している最中にAudioStreamPlayerを呼び出すと、新しいサウンドが最初のサウンドを中断します。

これに対する解決策は、グローバルな自動読み込みサウンド マネージャ クラスをコーディングすることです。サウンドエフェクトの新しいリクエストが入るたびに循環する AudioStreamPlayer ノードのプールを生成します。そして、そのクラスを Sound と命名し、Sound.play("coin_pickup.ogg") のような形で呼び出すことで、プロジェクトのどこからでも使用できます。この方法でとりあえずは問題は解決しますが、新たにより多くの問題が発生します。

  1. グローバルな状態: 1つのオブジェクトがすべてのオブジェクトのデータを担当するようになっています。Sound クラスにエラーがある場合、または利用可能なAudioStreamPlayerがない場合、それを呼び出すすべてのノードが中断する可能性があります。

  2. グローバルなアクセス: 任意のオブジェクトがどこからでも Sound.play(sound_path) を呼び出すことができるので、バグの原因を見つける簡単な方法はありません。

  3. グローバルなリソース割り当て: 最初から AudioStreamPlayer ノードのプールを使用すると、その個数が少なすぎてバグに直面したり、逆に必要以上に多くのメモリを使用したりする可能性があります。

注釈

グローバルアクセスに関する問題は、この例では、任意の場所の任意のコードが間違ったデータを Sound オートロードに渡す可能性があることです。その結果、バグを修正するために探索する範囲はプロジェクト全体に及びます。

シーン内にコードを保持する場合、オーディオに関係するスクリプトは1つまたは2つだけです。

これとは対照的に、各シーンが必要な数の AudioStreamPlayer ノードを自分で保持すれば、これらの問題はすべて解決します。

  1. 各シーンは、独自の状態情報を管理します。データに問題がある場合、その1つのシーンでのみ問題が発生します。

  2. 各シーンは、独自のノードのみにアクセスします。バグがある場合、どのノードに障害があるかを簡単に見つけることができます。

  3. 各シーンは、必要なリソースの量を正確に割り当てます。

共有機能またはデータの管理

自動読み込みを使用するもう1つの理由は、同じメソッドまたはデータを多数のシーンで再利用する場合です。

関数の場合、GDScriptの class_name キーワードを使用して、個々のシーンにその機能を提供する新しい型の Node を作成できます。

データに関しては、次のいずれかが可能です:

  1. データを共有するには、新しいタイプの Resource を作成します。

  2. たとえば、owner プロパティを使用してシーンのルートノードにアクセスするなど、各ノードがアクセスできるオブジェクトにデータを保存します。

自動読み込みを使用する必要がある場合

GDScriptは、 static func と書くことで、 static な関数を宣言することができます。また、 class_name と組み合わせることで、インスタンスを作成することなくヘルパー関数のライブラリを作成することが可能になります。なお、staticな関数には制約があり、メンバー変数やstaticではない関数、そして self を参照することができない点に注意してください。

Since Godot 4.1, GDScript also supports static variables using static var. This means you can now share variables across instances of a class without having to create a separate autoload.

それでも、自動ロードノードはスコープが広いシステムのコードを簡素化することができます。オートロードが自身の情報を管理し、他のオブジェクトのデータに干渉しない場合、広範囲のタスクを処理するシステムを作成する優れた方法となります。例えば、クエストシステムや対話システムなどがその例です。

注釈

自読み込みは正確にはシングルトンでは ありません 。自動で読み込まれたノードのコピーをインスタンス化することを妨げるものは何もありません。自動読み込みは、ただノードをシーンツリーのルートの子として自動的に読み込むツールです。この読み込みはゲームのノード構造や実行するシーンに関係なく実行されます。 たとえば、 F6 キーを押してみます。

その結果、例えば、自動読み込みされた Sound と呼ばれる自動読み込みノードを、get_node("/root/Sound") を呼び出すことによって、取得できます。