今回はGodot Engineについて、導入~簡単なプロジェクト作成までを書き残していきます。
- 2Dに適したエンジンかつ3Dエンジンの仕組みも共存
→物理エンジンを使った2D制御が、簡便に実現可能 - オープンソース&MITライセンスで、完全無料で商用・非商標問わず使用可能
→エンジン自体の改編も可能なため、自作機能の導入なども対応できる - 日本語対応済み。→ 公式マニュアル
インストール~初回起動
公式サイトからダウンロード可能で、
GDScriptを使うStandard Versionと、C#を使用するMono Versionがあります。
今回はStandard Versionをインストールします。(基本的にはStandardがおすすめです)

Zipファイルがダウンロードされるので、エンジン本体を配置したい場所に移動して解凍します。
展開されたフォルダ内にあるアプリケーションファイルがエンジン本体で、クリックで起動できます。
*初回起動時は以下のようなメッセージが出力されますが、サンプルは後からでも開けるため、
一旦キャンセルで問題ありません。

Godot Engineを起動すると以下のような画面になりますので、
右側のメニューから[新規プロジェクト]をクリックしてプロジェクトを作成してみます。

プロジェクト名、保存ディレクトリ、レンダラーを入力して、[作成して編集]をクリックします。

*プロジェクト名を入力後、[フォルダーを作成]を押下するとプロジェクトパスの場所にプロジェクト名と同名の空ディレクトリが作成され、自動的にプロジェクトパスへ設定されます。
以下のような画面が出たら、プロジェクトの作成は完了です。

次回起動時以降は、以下のような形で同プロジェクトを開くことができます。

Godot Engineを始めるにあたって押さえておきたい基礎
オブジェクト構成基礎
Godot Engineで作成するゲームは、以下のような要素の組み合わせで構成していきます。
シーン:ゲームを構成する各要素を示す単位*。一つ以上のノードで構成される(=ノードの集合体)。
┗ ノード:ゲームの要素(=シーン)を構成する最小単位。
┗ シグナル:ノード間のやり取りをするための信号。ノードがイベント発生時に発信する。
(イベント:ボタン押下時、オブジェクトの接触時など)
上記三つの要素を階層状に管理する仕組みが、シーンツリーで、エディタ画面左側にあるものです。
左画像の位置(シーンドック)に、
シーンツリーが構成されていきます。(今は空っぽの状態)
Godot Engineの要素は上記三つの攻勢のため、
最初に表示されている「ルートノードを生成」というのは、
「階層構造の頂点となる最初の要素を作成しましょう。」
といった意味合いになります。

*:Godot Engineの[シーン]は、キャラクター、アイテム、マップ、UIといった各ゲーム要素のまとまりの単位として示されます。
(他エンジンの[シーン]よりも指し示す範囲が広いため他エンジン経験者は注意が必要です)
シーン:
- =ノードの組み合わせで構成されたゲームオブジェクトの単位
- シーンは他シーンからの継承や派生に対応。
- シーンには必ずルートが存在し、シーンからはインスタンスの生成が可能
- 性質としては[クラス]の概念に近いが、UnityのPrefabなどとは異なる概念
ノード:
- ノードはシーン構成要素の最小単位であり、それぞれ特定の目的を持つ。
→コンポーネントのような挙動や役割とは違う - ツリー構造の一部であり、親から[Node]クラスまでを継承する。
- フレーム毎に、後進のコールバックを受け取る
- 最小単位ではあるが、別のノードを子として追加することができる(階層構造)
有用なショートカット
- クラスリファレンス参照:F1/スクリプトエディタ関数名の上でCtrl+クリック
- 選択/移動/回転/スケール ツール:
左から、[Q,W,E,R]に対応
簡単なプロジェクトを作ってみる
ここからは、実際にプロジェクトを作成しながら各所の操作やポイントを抑えていきましょう。
(今回は、シンプルな当たり判定を使って、落下する箱が床へ着地するまでを作ってみます。)
まずは、上部メニューから[2D]を選択して2Dの編集画面を開きます。

<操作Memo>
・マウスホイール:拡大縮小
・マウス中ボタン+ドラッグ:移動
まずは[2Dシーン]をクリックしてルートノードを生成します。
これから構築していくゲームの要素はすべてこのルートノードの子要素になることになります。

シーンなのにノード?と思われるかと思いますが、ここでは
「”プロジェクト”というシーンを構成する原点となるノード(ルートノード)を作成した」
とイメージしておくとわかりやすいかと思います。
ルートノードに子要素(ノード)を追加します。
左上の[+]ボタンか、Ctrl+Aで新規ノード作成ウィンドウを表示できます。

上部の検索ウィンドウを活用しながら、Rigidbody2Dを追加してみましょう。
*Rigidbodyの警告は後で対処しますので今は無視で大丈夫です。
次に、Rigidbody2Dを選択したうえで、同様の手順から[Sprite]を子要素として追加します。
スプライトノードに設定する画像を取り込んでみます。エクスプローラーなどから任意の画像を
[ファイルシステム]へドラッグアンドドロップします。(プロジェクトフォルダ直下に配置されます)

[Sprite]ノードを選択して、右側のインスペクター内の[Texture]へ取り込んだ画像を設定します。

シーンビューに設定した画像が表示されていることを確認できるかと思います。

ここで、Rigidbody2Dに表示されている警告アイコンをクリックしてメッセージを確認しましょう。
簡単に言うと、Rigidbodyだけでは重力などの影響は反映されますが、衝突判定となる[Collision]を追加しないと床や壁をすり抜けてしまいますよー、といった内容です。

警告文にしたがって、[Rigidbody2D]に[CollisionShape2D]を追加しましょう。

[CollisionShape2D]にも警告が出ますので、指示に従ってインスペクターから[Shape]を設定します。

追加後、シーンにShapeの形状が薄緑色で表示されていますので、形状を調整します。
ここまでで、一連のゲームオブジェクトの用意ができましたので、Rigidbody2Dをゲーム表示範囲の中心に移動します。
この時、シーン上の要素をドラッグアンドドロップで移動しようとすると、スプライトやCollisionShape2Dが選択されてしまい、うまくいきません。
そこで使用するのが、グループ化です。以下の説明の通りですが、選択中のノード以下の子要素を選択対象外とすることで、ノード単位でまとめて移動操作を可能にする機能です。

今回は[Rigidbody2D]をグループ化して移動し、任意の場所でシーン実行ボタン(F5)を押してみます。

以下のようなシーン保存ウィンドウが出るかと思いますので、今回はそのまま保存してみます。

以下のように、ゆっくりと設定した画像が落下するゲーム画面が表示されていれば成功です。

また、実行時に保存したシーンはファイルシステムドックを確認すると、以下のようにプロジェクトフォルダ直下に保存されていることを確認できます。

今のままでは物体が落下するだけですので、衝突の挙動を確認するために床を作っていきます。
床のように落下せず、かつ他オブジェクトと衝突してほしいものには、[StaticBody2D]を使用します。これまでの手順を参考に、以下のような構成でオブジェクトを作ってみましょう。
→Rigidbody2DがStaticBody2Dになることと、スプライト/CollosionShapeのサイズ以外は同様です。

再生すると、以下のように床に設置してオブジェクトが止まることを確認できるかと思います。

終わりに
今回は、今回はGodot Engineについて、導入~簡単なプロジェクト作成までを基本的な操作と合わせてまとめてきました。
Godotにはまだまだ多くの機能があり、その活用方法も様々ですが、今回扱ったノードの扱いや基本的な操作はどの機能でもベースとして存在する概念です。
より詳細な解説やチュートリアルは、 以下の公式ドキュメントでも触れることができますので、ぜひ一度触れてみてください。
(日本語版は若干更新が遅れる傾向があります。最新の情報を入手したい場合は英語版を参照するのがおすすめです。)
コメント