👻

Godot でゲーム開発がしてみたい

2023/10/11に公開1

ゲームを作ってみたい

最近いろんなものに興味を持つことができないでいる。これを打破するために、ゲーム開発をしてみたい。関連して色々なモノに興味を持てそうだ。

ゲームエンジン選定

ゲームを開発するにはゲームエンジンが必要だ。何がいいだろうか?
この記事を参照すると色々乗っている。最近 Steam でプレーした CassetBeast は Godot で
作られているらしい。しかも開発者は 2 人だったそうだ。Unity は最近動向が怪しいし、
Unreal は初手には複雑なようだ。昭和生まれのゲームプレーヤーにとっては 2 次元ゲーム
の方が愛着があるので、それを作りやすい Godot を選んでみようかな。直近でプレーした Dave the Diver も面白かったなぁ(これはGodotではないっぽい)。
https://gigazine.net/news/20230914-post-unity-game-engine/

Godot

Godot のオフィシャルは以下の URL だ。
https://godotengine.org/
アクセスしてみると LTS の 3.5.3 と Latest の 4.1.2 がダウンロードの候補として選べることがわかった。どちらがいいのだろうか。Node などを選ぶときは LTS を選んでいたから 3 系の方が…と考えていたが Youtube で簡単に調べたら完全な素人なら 4 系に飛び込むのがいいとあったので、4 系をインストールしてみよう。観たのは下の URL の動画だ。
https://www.youtube.com/watch?v=XE3GM6jviis

Requirement を確認すると Vlukan 1.0 に対応していることが推奨らしい、自分の PC が対応しているかわからない。一応 GPU は RTX3050ti を積んでいるけど大丈夫かな…?

Windows - Standard (x86_64)を DL してみた。寄付のお願いがポップアップしたけど、ごめんまだ寄付できない。使い勝手がよかったら後々寄付しようと思う。OpenSource の開発者は応援したいと思っている。

DL していて驚いたのはその軽量さだ。なんと圧縮ファイルで 50MB、回答しても 100MB 強しかない。インストーラーなのかと思いきや Instructions に以下のようにあり、これがゲームエンジンそのもので、依存関係は梱包されているらしい。すごい。

Extract and run. Godot is self-contained and does not require installation.

学習開始

なにはともあれ Learn から実施していく。ドキュメントを確認すると日本語約は無い状態に等しい。コントリビュートしてみたいなとも思いつつ、ただの和訳であれば翻訳ツールがどんどん便利になっているので不要だろうとも思った。DeepL で一括して翻訳したら、そこそこ読める(Godot がゴドーと訳されるのは少し可愛らしい間違いだが)。
Tutorial に関しては公式が動画にまとめてくれているらしい。でも、文書のほうが自分のペースとツールを適用しやすそうなのでまずは文書ベースで学習しよう。とりあえず Getting Started の章からこなすのがよさそうだ。

Getting Started

最初になるほど、と思ったのは日本語でいうコンシューマゲームは英語で Console Game と呼ばれることだ。そして、Godot で Console Game を作るにはプログラムスキルが強く求められる。加えて、移植に関しての開発スキルも必要だ。

さて、これ移行の文章は私がいいなと思ったことを記憶に定着させるためにアウトプットする、公式を参照したほうが確実でよいと思う。

  • Godot はアルゼンチンのゲームスタジオから生まれた
  • Godot は 2014 年にオープンソースとしてリリースされた
  • Godot を利用して作られたゲームは Ex-Zodic や Helms of Fury などがある。
  • (ゲーム以外の)アプリケーションにも godot は搭載されていて、オープンソースのピクセルアート描画プログラム Pixelorama やボクセル RPC 作成ソフト RPG in a box があげられる。
  • オフィシャルショーケースを確認すると事例がたくさんある。 https://www.youtube.com/playlist?list=PLeG_dAglpVo6EpaO9A1nkwJZOwrfiLdQ8
  • Godot にはコードエディター、アニメーションエディター、タイルマップエディター、シェーダーエディター、デバッガー、プロファイラーなどが含まれている。
  • 外部エディタでコーディングを実施するプラグインも整備されている。Emacs や VSCode が利用できる。
  • サポートされている主要言語は GDScript と C#である。
  • GDExtension を利用すると C 言語もしくは C++でゲームプレイに関する高速なアルゴリズムを記述することもできる。

Godot を理解するための重要な概念

Godot ではゲームはノード(nodes)のツリー(tree)でそれをシーン(scenes)にグループ化する。
(つまり tree->scenes->nodes の関係性だ)

この章の最後の文章が概念の関係をまとめているので最初に記述しておく。非常にわかりやすい。

ノード、シーン、シーンツリー、シグナルは、Godot の 4 つの中核概念で、常に操作することになる。
ノードはゲームの最小構成要素です。ノードを組み合わせてシーンを作り、それを組み合わせてシーンツリーにネストします。シグナルを使って、ノードを他のノードやシーンツリーの枝のイベントに反応させることができます。

シーン(Scenes)

Godot ではゲームを再利用可能なシーンに分解する。シーンはキャラクター、武器、UI のメニュー、1つの家(ゲーム内のオブジェクトということかな?)、レベル全体(パラメータセットもしくはレイヤーの一つとか?)など思いつくものならなんでもいい。
シーンはネストすることができる。例えば、キャラクターをレベルに入れて、その子としてシーンをドラッグ&ドロップすることができます。(やっぱりレベルはレイヤーの一つのようだ。後ろの文章の意味がよくわからないが…)

ノード(Nodes)

ノードは、ツリーに配置するゲームの最小ビルディングブロックのことだ。例え(プレイヤーを表現する)Player という名前の CharacterBody2D ノードは Camera2D、Sprite2D、CollisionShape2D と呼ばれる属性で構成されている。
(サンプルの画面の構造を見る限り、Node には様々な種類がある。プログラム的に言えば Node を継承した一つのクラスとして CharacterBody2D というクラスがあって、その要素が Camera2D、Sprite2D、CollisionShape2D だと言っているように見える)
ノードとシーンがエディタで同じように見えることに注意する必要がある。ノードのツリーをシーンとして保存すると、エディタでは内部構造が隠された一つのノードとして表示されます。
(プログラム的に言えばシーンもノードを継承している、ノードの一種という感じなのかな?)
Godot には基本ノードタイプの沢山のライブラリが用意されていて、2D、3DUI などをこれらの基本ノードタイプで実現できる。

ここからは私の解釈だが、node にどのようなタイプがあるか、そして異なる種類の node の関係性(つまりシーン)を理解することが開発速度を向上させると思う。

ツリー(The Scene tree)

ゲームのすべてのシーンは、シーンツリー(文字通りシーンのツリー)に集まっている。シーンがノードのツリーであるように、シーンツリーもノードのツリーだ。しかし、シーンはキャラクター、武器、ドア、またはユーザーインターフェイスを表すことができるので、シーンでゲームを考える方が簡単だ。
(最小単位は node だが、ゲームの構成要素を考えるときは scene をベースにしたほうがいいということかな?)

シグナル(Signals)

ノードは何らかのイベントが発生するとシグナルを発する。この機能により、コードでハードワイヤリングすることなく、ノードを通信させることができる。これにより、シーンの構成に柔軟性が生まれる。
(シーンとシーン間の通信/インタラクションは独立して考えられるようだ。というか独立して考えろという設計しそうな気がする。)

ここは私の解釈===
デザインパターンでいうところの Observer pattern が採用されている。観測される側の node(Subject と呼ばれる)が観測する側の node に対してイベントハンドラを登録、削除するインターフェースを提供し、通知を通してハンドラを実行(通知)する仕組みを標準的に備えるパターンだ。
解釈終わり===

例えば、ボタンは押されるとシグナルを発する。このシグナルに接続することで、ゲームの開始やメニューのオープンのように、このイベントに反応してコードを実行することができる。
他にも、2 つのオブジェクトが衝突したときや、キャラクターやモンスターが特定のエリアに入ったときなど、さまざまなシグナルが組み込まれています。また、ゲームに合わせて新しいシグナルを定義することもできる。

ノード、シーン、シーンツリー、シグナルは、Godot の 4 つの中核概念で、常に操作することになる。
ノードはゲームの最小構成要素だ。ノードを組み合わせてシーンを作り、それを組み合わせてシーンツリーにネストする。シグナルを使って、ノードを他のノードやシーンツリーの枝のイベントに反応させることができる。

今日はここまで

ひとまず今日はここまでにしておこう。抽象的な概念はなんとなーく理解できた。

GitHubで編集を提案

Discussion