自動読み込みと通常ノード¶
Godot には、プロジェクトのルートにあるノードを自動的に読み込む機能が用意されており、グローバルにアクセスできるようにすることで、シングルトンの役割を果たすことができます: シングルトン(自動読み込み)。これらの自動ロードされたノードは、SceneTree.change_scene を使用してコードからシーンを変更しても解放されません。
このガイドでは、オートロード機能をいつ使用するか、およびそれを回避するために使用できるテクニックを学習します。
オーディオが切断される問題¶
他のエンジンは、多くの機能をグローバルにアクセス可能なオブジェクトに編成するシングルトンであるマネージャークラスの作成を奨励します。 Godotは、ノードツリーとシグナルのおかげで、グローバルな状態を回避する多くの方法を提供します。
たとえば、開発者がプラットフォーム・ゲームを構築していて、効果音を鳴らすコインを収集したいとします。それに使えるノードがあります: AudioStreamPlayer です。しかし、すでにサウンドを再生している最中にAudioStreamPlayerを呼び出すと、新しいサウンドが最初のサウンドを中断します。
これに対する解決策は、グローバルな自動読み込みサウンド マネージャ クラスをコーディングすることです。サウンドエフェクトの新しいリクエストが入るたびに循環する AudioStreamPlayer
ノードのプールを生成します。そして、そのクラスを Sound
と命名し、Sound.play("coin_pickup.ogg")
のような形で呼び出すことで、プロジェクトのどこからでも使用できます。この方法でとりあえずは問題は解決しますが、新たにより多くの問題が発生します。
グローバルな状態: 1つのオブジェクトがすべてのオブジェクトのデータを担当するようになっています。
Sound
クラスにエラーがある場合、または利用可能なAudioStreamPlayerがない場合、それを呼び出すすべてのノードが中断する可能性があります。グローバルなアクセス: 任意のオブジェクトがどこからでも
Sound.play(sound_path)
を呼び出すことができるので、バグの原因を見つける簡単な方法はありません。グローバルなリソース割り当て: 最初から
AudioStreamPlayer
ノードのプールを使用すると、その個数が少なすぎてバグに直面したり、逆に必要以上に多くのメモリを使用したりする可能性があります。
注釈
グローバルアクセスに関する問題は、この例では、任意のコードが間違ったデータを Sound
オートロードに渡す可能性があることです。その結果、バグを修正するために探索する範囲はプロジェクト全体に及びます。
シーン内にコードを保持する場合、オーディオに関係するスクリプトは1つまたは2つだけです。
これとは対照的に、各シーンが必要な数の AudioStreamPlayer
ノードを自分で保持すれば、これらの問題はすべて解決します。
各シーンは、独自の状態情報を管理します。データに問題がある場合、その1つのシーンでのみ問題が発生します。
各シーンは、独自のノードのみにアクセスします。バグがある場合、どのノードに障害があるかを簡単に見つけることができます。
各シーンは、必要なリソースの量を正確に割り当てます。
自動読み込みを使用する必要がある場合¶
自動読み込みノードを使用すると、場合によってはコードを簡略化できます:
静的データ: データベースなど、1つのクラス専用のデータが必要な場合は、自動読み込みが優れたツールになります。 Godotには、静的データを作成および管理するスクリプトAPIはありません。
静的関数: 値のみを返す関数のライブラリを作成します。
広いスコープを持つシステム: シングルトンが独自の情報を管理し、他のオブジェクトのデータに侵入しない場合は、広範なスコープのタスクを処理するシステムを作成する優れた方法です。たとえば、クエストや対話システムなどです。
Godot 3.1より前までは、便宜上、別の用途がありました。自動読み込みには、GDScriptで名前が生成されたグローバル変数があり、プロジェクト内の任意のスクリプトファイルから呼び出すことができます。しかし、今では、代わりに class_name
キーワードを使用して、プロジェクト全体の型のオートコンプリートを取得できます。
注釈
自読み込みは正確にはシングルトンではありません。自動で読み込まれたノードのコピーをインスタンス化することを妨げるものは何もありません。これは、ゲームのノード構造や実行するシーンに関係なく、ノードをシーンツリーのルートの子として自動的に読み込むツールです。 例: F6 キーを押します。
その結果、例えば、自動読み込みされた Sound
と呼ばれる自動読み込みノードを、get_node("/root/Sound")
を呼び出すことによって、取得できます。