今回は、Godot Engineのプログラム部分についての検証となります。
Godot Engine でのプログラミングは基本 GDScript と呼ばれる内蔵のスクリプト言語を使用します。
それ以外でも C言語や、C#なんかも使えるようですが、今回は GDScript の検証のみにします。
前回作成したサンプルをベースにして作業していきますが、最終的には画面上に配置された四角形をカーソルキーで上下左右に動くように改造していきます。
最初に事前準備として前回作成したサンプルを少し修正します。
最初に四角形が床から落ちないように、床の側面に壁を作成します。
StaticBody で 壁 という名前のノードを追加し、そこに CollisionShape と CSGBox を四隅の壁分追加します。
壁のサイズや位置は、画面の Transform プロパティを参考にしてください。
前回の記事では四角は RigitBody で作りましたが、今回は重力や外からの力ではなくカーソルキーを使って自身で動かします。
その場合は KinematicBody の方が適しているので、オブジェクトの型をKinameticBodyに変更します。
検索ボックスに kinema と入力し、絞り込まれた一覧から KinematicBody を選択します。
これで事前準備は完了になりますので、いよいよスクリプトを作成していきます。
ダイアログが表示されます。
基本はデフォルトのままで良いと思いますので、そのまま作成をクリックします。
今回は、四角ノードにスクリプトをアタッチしたので、標準のスクリプトファイル名は 四角.gdという名前になります。
修正したスクリプトの全体は以下のようになります。
これだけでは、分からないことも多いと思うので、各行ごとに(自分の調べた範囲で)解説していきます。
GDScript は、1ファイル1クラスみたいな構成のようです。 なので、このファイルはアタッチしている 四角 ノードの型である KinameticBody を継承しています。
クラス内で共通に使用される変数を定義しています。
今回は、 gravity と、 camera という変数を定義しました。
変数 gravity は重力です。
RigidBody から KinematicBody に変更した事により、宙に浮いていたとしても、勝手に落ちたりすることはなくなります。
そのため、自身で落ちる実装を行う必要があるので、環境設定からプロジェクトの既定の重力を取得して変数に格納しています。
変数 camera はカメラノードのインスタンスになります。
何故ここでカメラを取得しているのかは後述することにします。
尚、 onready というのは、スクリプトがアタッチされているノードが子ノードを含め、完全に読み込まれた際に実行される事を意味しています。
_physics_process はシステムで定義されている関数で、指定された間隔毎に呼び出されます。
間隔の指定はプロジェクトの設定で出来ますが、デフォルトでは60fpsになっているようです。
似たようなシステム定義されている関数に _process というものがあります。
こちらは指定された間隔ではなく、各フレーム毎に呼ばれるという事で似ていますが、若干ニュアンスが違うようです。
通常は物理計算を行うような処理では _physics_process を使用し、物理計算を行わない処理やUI系の処理は _process に記載するようです。
引数 delta には、前回 _physics_process が呼ばれてからの経過時間が入っています。
通常は一定の間隔ですが、遅延が発生すると delta が大きくなるので、例えばキャラなどを一定の速度で動かすためには delta を反映させた処理を行う必要があります。
四角 ノードが1フレームで動く方向と距離を表す変数 velocity を定義しています。
関数 is_on_floor() は、ブーリアン型の戻り値を持つメンバ関数で、ノードが地面と接している場合、True 接していない場合 False を返します。
ノードが地面に接していない場合のみ先程取得した重力値を反映させて下に落ちるようにします。
それ以外の場合、0(動いていない状態)に設定しています。
キー入力は Input.is_action_pressed で取得します。
プロジェクトのデフォルト値で ui_up ui_down ui_left ui_right にそれぞれ前後左右のカーソルキーが割り当てられていますので、今回はそれをそのまま使用します。
それぞれのキーが押されていた場合、その移動するように、変数 velocity にベクトルを加算減算しています。
ここでのポイントとして、単純に空間座標のXZ軸に沿って動くのではなく、カメラを基準とし、例えば上キーが押された場合、カメラから垂直に遠ざかるようにしています。
camera.global_transform.basis.x でグローバル座標に変換されたカメラのX方向ベクトルを習得しています。
それを正規化し、好みの倍率を掛けています。
こちらは、おまけみたいなものです。
rotate_y を使用することで、一定の速度で四角形が回転するようにしています。
move_and_slide メンバ関数を使用して、四角形を velocity 分移動します。
これで、実際に四角形が動いてくれます。
この記事を作成するにあたり、以下のサイトを参考にさせていただきました。ありうがとうございます。