Godot4 ノードに依存しないstatic関数のスクリプトの作成と使用

無料・軽快な 2D / 3D 用のゲームエンジン Godot Engine 4 で、ノード(オブジェクト)に依存しない static 関数を定義して利用するために、システムファイルドックで GD スクリプトファイルを作成して、static 関数をそのファイルに定義して、さまざまなスクリプトからファイルに定義した静的関数呼び出すための手順を紹介します。

※ GodotEngine 4.3 を使用しています。.NET 版ではありません。
※スクリプトは自己責任でご使用ください。

前回の記事

前回は、カスタムデータを設定した TileSets リソースで描いたタイルマップ上で、キャラと接触したタイルから、そのタイルに独自に追加したデータを取得する手順を紹介しました。

ノードに依存しない GD スクリプトファイルの作成

以前にノードに関連付けた GD スクリプトを作った際は、シーンドックの「アタッチする」ボタンを押しましたが、ノードに関連付けない場合は、ファイルシステムドックから作成できます。

ファイルシステムドックの配置先の要素(例では res:// )を右クリックして表示されるメニュー「新規作成」→「スクリプト」を選択します。

Godot4 スクリプトファイルの新規作成

継承元のデフォルトは Node ですが、特に Node の情報も必要ないので右側のボタンを押して、継承元を選択して最も基本となる Object クラスを継承元に設定します。

ファイルパスに作成するファイル名を入力して「作成」ボタンを押すと、GD スクリプトファイルが作成されます。

Godot4 スクリプトファイルの新規作成2

継承元は、特に Node から変えなくても良いかもしれません。
また、特定のクラスを派生させたい場合は、そのクラスを選択して「継承」ボタンを押します。
※上部の検索ボックスを使用すると簡単にクラス名を探せます。

Godot4 スクリプトファイルの新規作成3

ファイルシステムドックに、新規作成したスクリプトファイルが表示されるのでダブルクリックしましょう。
Script ワークスペースに切り替わり、作成したスクリプトファイルの編集ができます。

Godot4 スクリプトファイルの新規作成後の編集

クラス名を設定する

新規作成した GD スクリプトファイルの編集画面を開いたら、 class_name を用いて、「名前付きクラスの登録」を行います。
これは、外部から関数を呼び出す際に、どのクラスの関数かを指定するために必要です。

Godot4 新規作成したGDスクリプトファイルに名前付きクラスとして登録するためにクラス名を指定します..

以下の例では Object を継承した、 SakuraCrowdUtil クラスを登録しました。
※1行目は継承元のクラスによって異なります。

extends Object
class_name SakuraCrowdUtil

これにより外部のスクリプトからクラス名を指定して静的関数を呼び出すことができます。

class_nameDefines the script as a globally accessible class with the specified name. See Registering named classes.

スクリプトを、指定された名前を持つグローバルにアクセス可能なクラスとして定義します。 「名前付きクラスの登録」を参照してください。
GDScript reference — Godot Engine (stable) documentation in English と Google 翻訳

スクリプトファイルに static 関数を定義

次に静的関数を定義します。
静的関数は、self 変数を利用できませんが、引数で渡されたそれらのノード(オブジェクト)を、操作することができます。

static 関数は static func と、 func の前に static を付けることで定義できます。

Godot4 新規作成したGDスクリプトファイルにstatic関数を定義します.

テスト

外部の GD スクリプトから静的関数を呼び出すには、その静的関数を定義したファイルに記述したクラス名を用います。

func _ready():
	SakuraCrowdUtil.print_all_property_name_and_value(self)

新規作成した GD スクリプトファイルに定義した静的関数を、他のスクリプトファイルからクラス名付きで正常に呼び出すことができました。

Godot4 定義した静的関数を他のスクリプトファイルから呼び出して実行した結果.

例で用いた、引数に指定したオブジェクトのプロパティ群を出力する自作関数 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 using static func. When combined with class_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 or self.

Since Godot 4.1, GDScript also supports static variables using static 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 4.1 以降、GDScript は static var を使用した静的変数もサポートしています。これは、別のオートロードを作成することなく、クラスのインスタンス間で変数を共有できることを意味します。

それでも、自動ロードされたノードにより、幅広い範囲のシステムのコードを簡素化できます。オートロードが独自の情報を管理し、他のオブジェクトのデータに侵入しない場合、広範なタスクを処理するシステムを作成するための優れた方法となります。たとえば、クエストや対話システムなどです。
自動読み込みと通常ノード — Godot Engine (4.x)の日本語のドキュメント

まとめ

今回は、無料・軽快な 2D / 3D 用のゲームエンジン Godot Engine 4 で、ノード(オブジェクト)に依存しない static 関数を定義して利用するために、システムファイルドックで GD スクリプトファイルを作成して、static 関数をそのファイルに定義して、さまざまなスクリプトからファイルに定義した静的関数呼び出すための手順を紹介しました。

参照サイト Thank You!

記事一覧 → Compota-Soft-Press

コメント

Ads Blocker Image Powered by Code Help Pro

お願い - Ads Blocker Detected

このサイトは広告を掲載して運営しています。

ポップアップを閉じて閲覧できますが、よろしければ

このサイト内の広告を非表示にする拡張機能をオフにしていただけませんか?

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

We have detected that you are using extensions to block ads. Please support us by disabling these ads blocker.

タイトルとURLをコピーしました