無料・軽快な 2D / 3D 用のゲームエンジン Godot Engine 4 で、ノード(オブジェクト)に依存しない static 関数を定義して利用するために、システムファイルドックで GD スクリプトファイルを作成して、static 関数をそのファイルに定義して、さまざまなスクリプトからファイルに定義した静的関数を呼び出すための手順を紹介します。
※ GodotEngine 4.3 を使用しています。.NET 版ではありません。
※スクリプトは自己責任でご使用ください。
前回の記事
前回は、カスタムデータを設定した TileSets リソースで描いたタイルマップ上で、キャラと接触したタイルから、そのタイルに独自に追加したデータを取得する手順を紹介しました。
ノードに依存しない GD スクリプトファイルの作成
以前にノードに関連付けた GD スクリプトを作った際は、シーンドックの「アタッチする」ボタンを押しましたが、ノードに関連付けない場合は、ファイルシステムドックから作成できます。
ファイルシステムドックの配置先の要素(例では res:// )を右クリックして表示されるメニュー「新規作成」→「スクリプト」を選択します。
継承元のデフォルトは Node ですが、特に Node の情報も必要ないので右側のボタンを押して、継承元を選択して最も基本となる Object クラスを継承元に設定します。
ファイルパスに作成するファイル名を入力して「作成」ボタンを押すと、GD スクリプトファイルが作成されます。
継承元は、特に Node から変えなくても良いかもしれません。
また、特定のクラスを派生させたい場合は、そのクラスを選択して「継承」ボタンを押します。
※上部の検索ボックスを使用すると簡単にクラス名を探せます。
ファイルシステムドックに、新規作成したスクリプトファイルが表示されるのでダブルクリックしましょう。
Script ワークスペースに切り替わり、作成したスクリプトファイルの編集ができます。
クラス名を設定する
新規作成した GD スクリプトファイルの編集画面を開いたら、 class_name を用いて、「名前付きクラスの登録」を行います。
これは、外部から関数を呼び出す際に、どのクラスの関数かを指定するために必要です。
以下の例では Object を継承した、 SakuraCrowdUtil クラスを登録しました。
※1行目は継承元のクラスによって異なります。
extends Object
class_name SakuraCrowdUtil
これにより外部のスクリプトからクラス名を指定して静的関数を呼び出すことができます。
GDScript reference — Godot Engine (stable) documentation in English と Google 翻訳
class_name Defines the script as a globally accessible class with the specified name. See Registering named classes.
スクリプトを、指定された名前を持つグローバルにアクセス可能なクラスとして定義します。 「名前付きクラスの登録」を参照してください。
スクリプトファイルに static 関数を定義
次に静的関数を定義します。
静的関数は、self 変数を利用できませんが、引数で渡されたそれらのノード(オブジェクト)を、操作することができます。
static 関数は static func と、 func の前に static を付けることで定義できます。
テスト
外部の GD スクリプトから静的関数を呼び出すには、その静的関数を定義したファイルに記述したクラス名を用います。
func _ready():
SakuraCrowdUtil.print_all_property_name_and_value(self)
新規作成した GD スクリプトファイルに定義した静的関数を、他のスクリプトファイルからクラス名付きで正常に呼び出すことができました。
例で用いた、引数に指定したオブジェクトのプロパティ群を出力する自作関数 print_all_property_name_and_value については、以下の記事を参照してください。
GodotEngine 4.1 以降は自動読み込み(autoload)をしなくてもOK
以前は static 関数を利用する場合は、ヘルパー関数を呼び出すためのインスタンスが必要だったため、プロジェクト設定の自動読み込みにスクリプトファイルを設定する必要があったようですが、GodotEngine 4.1 からは静的関数 (static func) と静的変数 (static var) を利用できるので、自動読み込みの設定は必要なくなりました。
自動読み込みを使用する必要がある場合
GDScript supports the creation of
static
functions usingstatic func
. When combined withclass_name
, this makes it possible to create libraries of helper functions without having to create an instance to call them. The limitation of static functions is that they can’t reference member variables, non-static functions orself
.Since Godot 4.1, GDScript also supports
static
variables usingstatic var
. This means you can now share a variables across instances of a class without having to create a separate autoload.Still, autoloaded nodes can simplify your code for systems with a wide scope. If the autoload is managing its own information and not invading the data of other objects, then it’s a great way to create systems that handle broad-scoped tasks. For example, a quest or a dialogue system.
GDScript は、static func を使用した静的関数の作成をサポートしています。 class_name と組み合わせると、ヘルパー関数を呼び出すためのインスタンスを作成しなくても、ヘルパー関数のライブラリを作成できるようになります。静的関数の制限は、メンバー変数、非静的関数、または self を参照できないことです。自動読み込みと通常ノード — Godot Engine (4.x)の日本語のドキュメント
Godot 4.1 以降、GDScript は static var を使用した静的変数もサポートしています。これは、別のオートロードを作成することなく、クラスのインスタンス間で変数を共有できることを意味します。
それでも、自動ロードされたノードにより、幅広い範囲のシステムのコードを簡素化できます。オートロードが独自の情報を管理し、他のオブジェクトのデータに侵入しない場合、広範なタスクを処理するシステムを作成するための優れた方法となります。たとえば、クエストや対話システムなどです。
まとめ
今回は、無料・軽快な 2D / 3D 用のゲームエンジン Godot Engine 4 で、ノード(オブジェクト)に依存しない static 関数を定義して利用するために、システムファイルドックで GD スクリプトファイルを作成して、static 関数をそのファイルに定義して、さまざまなスクリプトからファイルに定義した静的関数を呼び出すための手順を紹介しました。
参照サイト Thank You!
- Godot Engine – Free and open source 2D and 3D game engine
- 自動読み込みと通常ノード — Godot Engine (4.x)の日本語のドキュメント
- GDScript reference — Godot Engine (stable) documentation in English
記事一覧 → Compota-Soft-Press
コメント