Godot : GraphNodeとGraphEditの制約を知る
概説
Godotでは、ノードを使ったビジュアル・スクリプトも、プログラミングの選択肢として提供されています。
また、そのビジュアル・スクリプト風のインターフェースを、ほぼそのままゲームにも実装できるようにもなっており、そのためのクラスが2つ用意されています。それがGraphNode
とGraphEdit
です。
これらのクラスは、木構造っぽいインターフェースを素早く実装するための基本的な機能を提供しており、非常に便利です。ただ、実際にGraphNode
とGraphEdit
を1年ほど使ってみて、色々と不自由な点も見えてきたため、自分のプロジェクトでは採用しないことにしました。
この記事では、最初にこれらのクラスを使うべきケースと、そうでないケースを挙げ、続いてGraphNode
とGraphEdit
について個人的に不自由に感じた点などを述べていきたいと思います。
今後、これらのクラスを使おうと検討している人の判断材料になれば幸いです。
GraphNode
とGraphEdit
を使うべきか否か
結論から書きますが、どれくらい見た目や動作をカスタマイズしたいか次第で、これらのクラスを使うかどうかを検討するのが良いと思います。具体的には以下の通りです。
使うべき:
- 木構造・ノード型のインターフェースを、とにかく手早く実装したい
- Godotのビジュアル・スクリプトの見た目や機能に満足しており、カスタマイズは不要だと考えている
- 自分で同じ機能を実装するのは難しそう
使わない方が良いかも:
- 細部まで拘って、自分の思い通りの見た目や動きにしたい
- (特に)自由にスロットのデザインやレイアウトなどをしたい
GraphNode
とGraphEdit
には、意外と制約が多い
GraphNode
とGraphEdit
は素晴らしいクラスです。もしそれらを使えるのであれば、使うのがベストだと思います。
一方で、1年くらいGraphNode
とGraphEdit
を使ってみた結果、これらのクラスは提供してくれる機能と比較し、それなりに制約も多いと感じました。
また、自分が必要とする機能を実装するのがそこまで難しいわけではないため、似たような役割を持つクラスを自分で実装し、GraphNode
は採用しないことにしました。
ここからは、個人的にGraphNode
とGraphEdit
を使う中で、マイナスに感じた点を列挙します。
(1) 線のカスタマイズができない (3.x時点)
GraphNode
では、ノード同士を繋ぐ線の幅が2px
に固定されており、アンチエイリアスがかかったベジェ曲線として描画されます。Godot 3.x
時点では、カスタマイズできる要素は色だけです。
独自に実装すれば、アンチエイリアスを無効にしたり、配線を直線にしたり、ベジェ曲線の調整もできます[1]。
Control
子ノードを追加する必要がある
(2) GraphNode
の仕様として、スロットの数に応じてControl
ノードをadd_child()
で追加する必要があります。例えば、set_slot()
でスロットの数を8個に設定したとしても、それだけでは指定した数のスロットは有効化されません。必ず、子ノードとしてControl
を8個追加する必要があります。
スロットを追加するためだけにControl
ノードがどんどん増えていくのは、個人的には勿体なく感じました。また、追加されたControl
ノードは、対応するスロットのY軸上に自動配置されます。この仕様を利用して、子要素のレイアウトなどを簡単に行えると思いますので、メリットとして捉えることもできます。
(3) スロットのデザインやレイアウトが固定
GraphNode
は「左が入力スロット、右が出力スロット」というふうに、レイアウトがある程度固定されています。例えばMaxやPureData[2]のように上下にスロットをレイアウトすることはできません。
例:Maxでは上下にスロットがあります
またスロットの見た目はテクスチャ(画像)で指定します。スロットにだけシェーダーをかけたり、複数のテクスチャを組み合わせたりすることはできません。
自分で実装すればスロットのデザインの自由度も上がりますし、スロットの並び方を入力側と出力側とで変えたり、スロット自体にマウスオーバーを検知する機能を持たせたりするのも簡単です[3]。
GraphEdit
のカスタマイズができない
(4) GraphEdit
はGraphNode
を格納し描画するためのクラスで、GraphNode
を管理するための機能が一通り揃っています。他にもトラックパッドのピンチ操作での表示の拡大率変更などもできますし、マウス操作で複数のノードを一度に選択できたりできて、本当に便利です。
ただ、左上に表示される各種オプションの表示形式をはじめ、ほぼカスタマイズできません。テーマを変更することは可能ですが、自由度は低めです。
むすび
以上、カスタマイズに関する制約を書き連ねましたが、特にこだわりがない場合は、簡単にノードシステムを実装できるGraphNode
、GraphEdit
は良い候補となると思います。独自に作るよりも圧倒的に早く実装できますし、Godot自体でも使われているので堅牢です。また、素の状態で一通りの機能を提供してくれるので、どんなユーザーでも楽に扱えます[4]。
特に、GraphNode
を独自実装する場合、GraphEdit
が流用できないのはちょっと辛いかもしれません。GraphEdit
の諸機能は地味に便利なので、使わない場合のメリットもデメリットもあります。
Discussion