俺に解るように説明する "Godot Engine 3.x" 入門+

ゲームエンジン Godot Engine に関すること。入門とか使い方とかチュートリアルとか、あれとかこれとか。日本語解説。

"Godot Engine" エアホッケー Part7 ボタンを押したらどうなるの?...Button

再生ボタンを押して、スタート画面らしきものが出てくる所まで来た。そこに、ポチポチ押せるボタンを置いたのは、もちろん、押したらマウスで操作出来るマレットが出てきて、エアホッケーが出来るゲーム画面に遷り変われるように置いたわけだ。スタート画面から、ゲーム画面に、画面を切り替えたいのだ。

だが、そんな難しそうな処理に行く前に、ボタンを押すとどんな仕組みが働くのか、簡単に確認しておきたい。

f:id:ore2wakaru:20170811210310p:plain


信号発信 ---> 受信

ボタンを押すと、何が起こる? 結論から言うと、ボタンを押すと、このボタンから信号が出る。「私、クリックされました。」って信号が出る。出るだけ。(発信)

出るには出るが、出しっぱなしでは、何も起こらない。そう、何かするには、この信号を受ける側の準備が無いといけない。受信を合図にして、何かするような仕組みを持っている必要がある。(受信)


受信側の準備(前半)

受ける準備、こちらを先に行う。信号を受信する装置の設置をするのだが、装置とは、これは、スクリプトの事だ。

ということで、早速、ノードにスクリプトをくっつけよう。スクリプトをくっつけたいノードを選択して、スクリプト追加のアイコンをクリックするか、右クリメニューから [Attach Script] を選ぶ。

今回は、シーンのルートである「Node」ノードに付ける。

f:id:ore2wakaru:20170811212025p:plain

すると、こんな窓。

f:id:ore2wakaru:20170811213835p:plain

  1. "Language": スクリプト言語を選ぶ。ビジュアルスクリプトも選べるが、当初の目的通り、Godot 専用スクリプトの "GDScript" を選ぶ。
  2. "Inherits": ここは基本、最初に書いてあるままで変更しない。「Node」ノードにスクリプトを付けようとしたので、"Node" と入っている。「Label」ノードに付けようとすれば、"Label" となる。inherit(発:インリット、意:受け継ぐ)
  3. "Template": テンプレート。スクリプトを最初に開く時、何か書き加えておきますか?って聞いてる。書いてもらっても、コメントはどうせ消すし。"No Comments" で。
  4. "Built-in Script": スクリプトを独立したファイルにしますか?それともシーンに合体(内蔵)させますか? ということか(ちょっと謎)。別ファイルにしたいので、"OFF"。
  5. スクリプトファイルの名前なんだが、パス名で。"res://" というのはプロジェクトフォルダの事で、何度も出てくるのだが、なかなか慣れないぜ! 右横のフォルダアイコンを押して、分かりやすい名前に変えてOK。
    条件が整うと、「- Script Valid - Create new script file」と青色で出るので[作成] ボタンを押す。すると、スクリプトエディターが開く。

f:id:ore2wakaru:20170811221713p:plain

  1. 2D から Script に変わっている。メインのパネルの使用方法がスクリプトエディターになったという事。
  2. 編集しているファイル名がハイライトされて表示される。スクリプトファイルが複数あれば、ここにファイルが並ぶ事になる。

3.4.5.はスクリプトの中身。スクリプトに関しては、俺も勉強中の素人なので、どこかで詳しくまとめたいと思う。以下、俺の中で、たぶんそうなんだろうなーって思っていること。

  1. "extends Node": 上の "Inherits" で指定したノード名が "extends" の横に書かれる。どのノードにスクリプトを貼るかで決まると考えてよい。今回は "Node"。extend(発:イクスンド、意:拡張する)
  2. "func _ready():": 簡単に言うと、シーンが持っているノードが全部準備OKになったら(シーンツリーに全ノードが追加完了時)、次の行以下に書いてあることを実行する。func は function(発:ファンクション、意:数学用語の関数)の事と思う。
  3. "pass": 中身が空っぽの時にこう書く。"func _ready():" の次の行に入っているので、ゲームを実行するのにノードの準備が整ったら、・・・何もしない・・・、ということ。

と言う感じ。

これで一応、受信側の準備は、半分終了。何! スクリプトを貼るだけでいいのか? 簡単だった。中身は何もいじらなかったし。


送信側の準備

送信側の準備に入る。これ順番が大事。今回のように、ちゃんと受信側の準備(スクリプトを貼っておくこと)を先にしておくこと。じゃないと、怒られる。

f:id:ore2wakaru:20170812000313p:plain

  1. シーンパネルで「Button」ノードを選択。
  2. いつもはインスペクターパネルだけど、ノードパネルに。これで、信号(signal)の一覧が見えるようになる。結構いろんな場面で信号を出せるようになっているようだ。
  3. ボタンが押された時の信号設定は、この "Pressed()" という所。ダブルクリックで次に行く。

確認してくれとの窓が開くので、確認しよう。

f:id:ore2wakaru:20170812002812p:plain

  1. 信号を送る場所。受信用にスクリプトを付けた「Node」ノードが選択されていることを確認。
  2. 関数名が入っていることを確認。好きな名前に変えても良いけど。
  3. "関数を作成": ONになっていることを確認。

これで、[接続] をクリック。


受信側の準備(後半)

すると、さっき作ったスクリプトに自動で、関数が追加される。関数名は上で確認した関数名だ。これで、ボタンが押されると、この関数が呼び出されるようになったということ。

f:id:ore2wakaru:20170812003554p:plain

"pass" とは結局何もしない事(# 以下はコメント文)なので、何かしてほしい場合は、ここを変える。

"pass # replace with function body" と書いてあるところを消して、練習のため、以下のようにする。

f:id:ore2wakaru:20170812005507p:plain

コピペ用(インデントは忘れずに。TAB。)

get_node("Label").set_text("バイバイ Unity")

文字入力をしてると、入力支援を行ってくれるのがすごくイイ。(set_text の所は支援してくれないようだが)

簡単に何をするものか説明する。このスクリプトがくっついているノードの子ノードで名前が "Label" と言うのノードの "Text" プロパティーを「バイバイ Unity」にセットせよ。という内容。もし、ゲームのタイトルを入れていた「Label」ノードの名前を変えていたら、その名前を入力して欲しい。ノードのタイプではなく、付けた名前で指定するので注意。

これで、ボタンが押されたら、以下の事をせよ、というのが出来た。


再生してみる

さあ、シーンを再生して、

f:id:ore2wakaru:20170810221847p:plain

ボタンを押してみよう。

f:id:ore2wakaru:20170812010805p:plain

こうなれば、成功だ。



シーンパネルを確認。スクリプトが付いているマークと、信号が出るマークが表示されているハズ。

f:id:ore2wakaru:20170812012110p:plain

うむ。

今回、「ボタンが押される ---> 信号が出る ---> 受ける ---> 何かする」という流れが分かっただろうか。

途中、スクリプトが用意してあるノードを選択するのが確認ポイントかもな。

スクリプトのセーブは[Ctrl] + [Alt] + [S] 。([Ctrl] + [S]だとシーンのセーブになる。)ファイルシステムに表示されるようになっているハズ。

今後はどう頑張ってもスクリプトの知識が必要になってくるので、理解したところから、ちょっとずつまとめていきたい。