🧐

Godot : GraphNodeとGraphEditの制約を知る

2022/05/21に公開

概説

Godotでは、ノードを使ったビジュアル・スクリプトも、プログラミングの選択肢として提供されています。

また、そのビジュアル・スクリプト風のインターフェースを、ほぼそのままゲームにも実装できるようにもなっており、そのためのクラスが2つ用意されています。それがGraphNodeGraphEditです。

これらのクラスは、木構造っぽいインターフェースを素早く実装するための基本的な機能を提供しており、非常に便利です。ただ、実際にGraphNodeGraphEditを1年ほど使ってみて、色々と不自由な点も見えてきたため、自分のプロジェクトでは採用しないことにしました。

この記事では、最初にこれらのクラスを使うべきケースと、そうでないケースを挙げ、続いてGraphNodeGraphEditについて個人的に不自由に感じた点などを述べていきたいと思います。

今後、これらのクラスを使おうと検討している人の判断材料になれば幸いです。

GraphNodeGraphEditを使うべきか否か

結論から書きますが、どれくらい見た目や動作をカスタマイズしたいか次第で、これらのクラスを使うかどうかを検討するのが良いと思います。具体的には以下の通りです。

使うべき:

  • 木構造・ノード型のインターフェースを、とにかく手早く実装したい
  • Godotのビジュアル・スクリプトの見た目や機能に満足しており、カスタマイズは不要だと考えている
  • 自分で同じ機能を実装するのは難しそう

使わない方が良いかも:

  • 細部まで拘って、自分の思い通りの見た目や動きにしたい
  • (特に)自由にスロットのデザインやレイアウトなどをしたい

GraphNodeGraphEditには、意外と制約が多い

GraphNodeGraphEditは素晴らしいクラスです。もしそれらを使えるのであれば、使うのがベストだと思います。

一方で、1年くらいGraphNodeGraphEditを使ってみた結果、これらのクラスは提供してくれる機能と比較し、それなりに制約も多いと感じました。

また、自分が必要とする機能を実装するのがそこまで難しいわけではないため、似たような役割を持つクラスを自分で実装し、GraphNodeは採用しないことにしました。

ここからは、個人的にGraphNodeGraphEditを使う中で、マイナスに感じた点を列挙します。

(1) 線のカスタマイズができない (3.x時点)

GraphNodeでは、ノード同士を繋ぐ線の幅が2pxに固定されており、アンチエイリアスがかかったベジェ曲線として描画されます。Godot 3.x時点では、カスタマイズできる要素はだけです。

独自に実装すれば、アンチエイリアスを無効にしたり、配線を直線にしたり、ベジェ曲線の調整もできます[1]

(2) Control子ノードを追加する必要がある

GraphNodeの仕様として、スロットの数に応じてControlノードをadd_child()で追加する必要があります。例えば、set_slot()でスロットの数を8個に設定したとしても、それだけでは指定した数のスロットは有効化されません。必ず、子ノードとしてControlを8個追加する必要があります。

スロットを追加するためだけにControlノードがどんどん増えていくのは、個人的には勿体なく感じました。また、追加されたControlノードは、対応するスロットのY軸上に自動配置されます。この仕様を利用して、子要素のレイアウトなどを簡単に行えると思いますので、メリットとして捉えることもできます。

(3) スロットのデザインやレイアウトが固定

GraphNodeは「左が入力スロット、右が出力スロット」というふうに、レイアウトがある程度固定されています。例えばMaxやPureData[2]のように上下にスロットをレイアウトすることはできません。


例:Maxでは上下にスロットがあります

またスロットの見た目はテクスチャ(画像)で指定します。スロットにだけシェーダーをかけたり、複数のテクスチャを組み合わせたりすることはできません。

自分で実装すればスロットのデザインの自由度も上がりますし、スロットの並び方を入力側と出力側とで変えたり、スロット自体にマウスオーバーを検知する機能を持たせたりするのも簡単です[3]

(4) GraphEditのカスタマイズができない

GraphEditGraphNodeを格納し描画するためのクラスで、GraphNodeを管理するための機能が一通り揃っています。他にもトラックパッドのピンチ操作での表示の拡大率変更などもできますし、マウス操作で複数のノードを一度に選択できたりできて、本当に便利です。

ただ、左上に表示される各種オプションの表示形式をはじめ、ほぼカスタマイズできません。テーマを変更することは可能ですが、自由度は低めです。

むすび

以上、カスタマイズに関する制約を書き連ねましたが、特にこだわりがない場合は、簡単にノードシステムを実装できるGraphNodeGraphEditは良い候補となると思います。独自に作るよりも圧倒的に早く実装できますし、Godot自体でも使われているので堅牢です。また、素の状態で一通りの機能を提供してくれるので、どんなユーザーでも楽に扱えます[4]

特に、GraphNodeを独自実装する場合、GraphEditが流用できないのはちょっと辛いかもしれません。GraphEditの諸機能は地味に便利なので、使わない場合のメリットもデメリットもあります。

脚注
  1. 線幅とアンチエイリアスのON/OFFはGodot 4.0で設定できるようになるようです(α版で確認済)。 ↩︎

  2. ふたつともノード型のビジュアルプログラミング言語です。 ↩︎

  3. 換言するとGraphNodeの制約の大部分は、スロット関連に集約されると思います。スロットを自由にカスタマイズしたい人は、自分で実装した方が良いと思いました。 ↩︎

  4. ノード同士を繋げた後のそれぞれの情報の流れ方など、ロジックの部分は自分で実装する必要がありますが…。 ↩︎

Discussion