さっき決めたブログ

[Godot Engine 003]スクリプト(GDScript)を作成する

今回は、Godot Engineのプログラム部分についての検証となります。
Godot Engine でのプログラミングは基本 GDScript と呼ばれる内蔵のスクリプト言語を使用します。

それ以外でも C言語や、C#なんかも使えるようですが、今回は GDScript の検証のみにします。

前回作成したサンプルをベースにして作業していきますが、最終的には画面上に配置された四角形をカーソルキーで上下左右に動くように改造していきます。

事前準備

最初に事前準備として前回作成したサンプルを少し修正します。

最初に四角形が床から落ちないように、床の側面に壁を作成します。

StaticBody で  壁  という名前のノードを追加し、そこに CollisionShape と CSGBox を四隅の壁分追加します。
壁のサイズや位置は、画面の Transform プロパティを参考にしてください。

壁の作成

四角形の型を変更します。

 四角  ノードを右クリックし、出てきたポップアップメニューより  型を変更  を選びます。

型の変更

前回の記事では四角は  RigitBody  で作りましたが、今回は重力や外からの力ではなくカーソルキーを使って自身で動かします。
その場合は KinematicBody  の方が適しているので、オブジェクトの型をKinameticBodyに変更します。
検索ボックスに  kinema  と入力し、絞り込まれた一覧から  KinematicBody  を選択します。

KinematicBody

これで事前準備は完了になりますので、いよいよスクリプトを作成していきます。

スクリプトを作成する

スクリプトファイルの作成

四角ノードを右クリックし、スクリプトをアタッチを選択します。

スクリプトをアタッチ

ダイアログが表示されます。
基本はデフォルトのままで良いと思いますので、そのまま作成をクリックします。

今回は、四角ノードにスクリプトをアタッチしたので、標準のスクリプトファイル名は 四角.gdという名前になります。

作成ボタンを押す

スクリプトが表示されます。

デフォルトのテンプレートが表示されていますので、こちらを変更していきます。

スクリプトが表示される

スクリプトを記述する

修正したスクリプトの全体は以下のようになります。
これだけでは、分からないことも多いと思うので、各行ごとに(自分の調べた範囲で)解説していきます。

1行目

GDScript は、1ファイル1クラスみたいな構成のようです。 なので、このファイルはアタッチしている  四角  ノードの型である  KinameticBody  を継承しています。

3~6行目

クラス内で共通に使用される変数を定義しています。
今回は、 gravity  と、 camera  という変数を定義しました。

変数  gravity  は重力です。  RigidBody  から  KinematicBody  に変更した事により、宙に浮いていたとしても、勝手に落ちたりすることはなくなります。
そのため、自身で落ちる実装を行う必要があるので、環境設定からプロジェクトの既定の重力を取得して変数に格納しています。

変数  camera  はカメラノードのインスタンスになります。
何故ここでカメラを取得しているのかは後述することにします。

尚、 onready  というのは、スクリプトがアタッチされているノードが子ノードを含め、完全に読み込まれた際に実行される事を意味しています。

8行目

 _physics_process  はシステムで定義されている関数で、指定された間隔毎に呼び出されます。
間隔の指定はプロジェクトの設定で出来ますが、デフォルトでは60fpsになっているようです。

似たようなシステム定義されている関数に  _process  というものがあります。
こちらは指定された間隔ではなく、各フレーム毎に呼ばれるという事で似ていますが、若干ニュアンスが違うようです。
通常は物理計算を行うような処理では  _physics_process  を使用し、物理計算を行わない処理やUI系の処理は  _process  に記載するようです。

引数  delta  には、前回  _physics_process  が呼ばれてからの経過時間が入っています。
通常は一定の間隔ですが、遅延が発生すると  delta  が大きくなるので、例えばキャラなどを一定の速度で動かすためには  delta  を反映させた処理を行う必要があります。

9~14行目

 四角  ノードが1フレームで動く方向と距離を表す変数  velocity  を定義しています。

関数  is_on_floor()  は、ブーリアン型の戻り値を持つメンバ関数で、ノードが地面と接している場合、True 接していない場合 False を返します。
ノードが地面に接していない場合のみ先程取得した重力値を反映させて下に落ちるようにします。
それ以外の場合、0(動いていない状態)に設定しています。

16~23行目

キー入力は  Input.is_action_pressed  で取得します。
プロジェクトのデフォルト値で  ui_up   ui_down   ui_left   ui_right  にそれぞれ前後左右のカーソルキーが割り当てられていますので、今回はそれをそのまま使用します。

それぞれのキーが押されていた場合、その移動するように、変数  velocity  にベクトルを加算減算しています。

ここでのポイントとして、単純に空間座標のXZ軸に沿って動くのではなく、カメラを基準とし、例えば上キーが押された場合、カメラから垂直に遠ざかるようにしています。
  camera.global_transform.basis.x  でグローバル座標に変換されたカメラのX方向ベクトルを習得しています。
それを正規化し、好みの倍率を掛けています。

25行目

こちらは、おまけみたいなものです。
  rotate_y  を使用することで、一定の速度で四角形が回転するようにしています。

27行目

 move_and_slide  メンバ関数を使用して、四角形を  velocity  分移動します。
これで、実際に四角形が動いてくれます。

実行結果

実行すると、前回同様に四角形が上から落ちてきます。
しかしながら、坂道を滑り落ちる事はありません。

カーソルキーを押してみると前後左右に動くことが分かるかと思います。

実行結果

参考にしたサイト

この記事を作成するにあたり、以下のサイトを参考にさせていただきました。ありうがとうございます。

GodotAPI
https://docs.godotengine.org/ja/stable/classes/index.html
Qiita - Godot Engine 入門
https://qiita.com/tomon9086/items/6da6cab0393d392e760d

サンプルダウンロード

今回作成したサンプルはGitHubに登録してあります。
https://github.com/karasu-jp-com/godot_test002

投稿者プロフィール

KARASU
うーん いろいろ考え中。。。

コメント

コメント取得中...

関連記事

TOPへ