"Godot Engine" エアホッケー Part7 ボタンを押したらどうなるの?...Button
再生ボタンを押して、スタート画面らしきものが出てくる所まで来た。そこに、ポチポチ押せるボタンを置いたのは、もちろん、押したらマウスで操作出来るマレットが出てきて、エアホッケーが出来るゲーム画面に遷り変われるように置いたわけだ。スタート画面から、ゲーム画面に、画面を切り替えたいのだ。
だが、そんな難しそうな処理に行く前に、ボタンを押すとどんな仕組みが働くのか、簡単に確認しておきたい。
信号発信 ---> 受信
ボタンを押すと、何が起こる? 結論から言うと、ボタンを押すと、このボタンから信号が出る。「私、クリックされました。」って信号が出る。出るだけ。(発信)
出るには出るが、出しっぱなしでは、何も起こらない。そう、何かするには、この信号を受ける側の準備が無いといけない。受信を合図にして、何かするような仕組みを持っている必要がある。(受信)
受信側の準備(前半)
受ける準備、こちらを先に行う。信号を受信する装置の設置をするのだが、装置とは、これは、スクリプトの事だ。
ということで、早速、ノードにスクリプトをくっつけよう。スクリプトをくっつけたいノードを選択して、スクリプト追加のアイコンをクリックするか、右クリメニューから [Attach Script] を選ぶ。
今回は、シーンのルートである「Node」ノードに付ける。
すると、こんな窓。
- "Language": スクリプト言語を選ぶ。ビジュアルスクリプトも選べるが、当初の目的通り、Godot 専用スクリプトの "GDScript" を選ぶ。
- "Inherits": ここは基本、最初に書いてあるままで変更しない。「Node」ノードにスクリプトを付けようとしたので、"Node" と入っている。「Label」ノードに付けようとすれば、"Label" となる。inherit(発:インヘリット、意:受け継ぐ)
- "Template": テンプレート。スクリプトを最初に開く時、何か書き加えておきますか?って聞いてる。書いてもらっても、コメントはどうせ消すし。"No Comments" で。
- "Built-in Script": スクリプトを独立したファイルにしますか?それともシーンに合体(内蔵)させますか? ということか(ちょっと謎)。別ファイルにしたいので、"OFF"。
- スクリプトファイルの名前なんだが、パス名で。"res://" というのはプロジェクトフォルダの事で、何度も出てくるのだが、なかなか慣れないぜ! 右横のフォルダアイコンを押して、分かりやすい名前に変えてOK。
条件が整うと、「- Script Valid - Create new script file」と青色で出るので[作成] ボタンを押す。すると、スクリプトエディターが開く。
- 2D から Script に変わっている。メインのパネルの使用方法がスクリプトエディターになったという事。
- 編集しているファイル名がハイライトされて表示される。スクリプトファイルが複数あれば、ここにファイルが並ぶ事になる。
3.4.5.はスクリプトの中身。スクリプトに関しては、俺も勉強中の素人なので、どこかで詳しくまとめたいと思う。以下、俺の中で、たぶんそうなんだろうなーって思っていること。
- "extends Node": 上の "Inherits" で指定したノード名が "extends" の横に書かれる。どのノードにスクリプトを貼るかで決まると考えてよい。今回は "Node"。extend(発:イクステンド、意:拡張する)
- "func _ready():": 簡単に言うと、シーンが持っているノードが全部準備OKになったら(シーンツリーに全ノードが追加完了時)、次の行以下に書いてあることを実行する。func は function(発:ファンクション、意:数学用語の関数)の事と思う。
- "pass": 中身が空っぽの時にこう書く。"func _ready():" の次の行に入っているので、ゲームを実行するのにノードの準備が整ったら、・・・何もしない・・・、ということ。
と言う感じ。
これで一応、受信側の準備は、半分終了。何! スクリプトを貼るだけでいいのか? 簡単だった。中身は何もいじらなかったし。
送信側の準備
送信側の準備に入る。これ順番が大事。今回のように、ちゃんと受信側の準備(スクリプトを貼っておくこと)を先にしておくこと。じゃないと、怒られる。
- シーンパネルで「Button」ノードを選択。
- いつもはインスペクターパネルだけど、ノードパネルに。これで、信号(signal)の一覧が見えるようになる。結構いろんな場面で信号を出せるようになっているようだ。
- ボタンが押された時の信号設定は、この "Pressed()" という所。ダブルクリックで次に行く。
確認してくれとの窓が開くので、確認しよう。
- 信号を送る場所。受信用にスクリプトを付けた「Node」ノードが選択されていることを確認。
- 関数名が入っていることを確認。好きな名前に変えても良いけど。
- "関数を作成": ONになっていることを確認。
これで、[接続] をクリック。
受信側の準備(後半)
すると、さっき作ったスクリプトに自動で、関数が追加される。関数名は上で確認した関数名だ。これで、ボタンが押されると、この関数が呼び出されるようになったということ。
"pass" とは結局何もしない事(# 以下はコメント文)なので、何かしてほしい場合は、ここを変える。
"pass # replace with function body" と書いてあるところを消して、練習のため、以下のようにする。
コピペ用(インデントは忘れずに。TAB。)
get_node("Label").set_text("バイバイ Unity")
文字入力をしてると、入力支援を行ってくれるのがすごくイイ。(set_text の所は支援してくれないようだが)
簡単に何をするものか説明する。このスクリプトがくっついているノードの子ノードで名前が "Label" と言うのノードの "Text" プロパティーを「バイバイ Unity」にセットせよ。という内容。もし、ゲームのタイトルを入れていた「Label」ノードの名前を変えていたら、その名前を入力して欲しい。ノードのタイプではなく、付けた名前で指定するので注意。
これで、ボタンが押されたら、以下の事をせよ、というのが出来た。
再生してみる
さあ、シーンを再生して、
ボタンを押してみよう。
こうなれば、成功だ。
シーンパネルを確認。スクリプトが付いているマークと、信号が出るマークが表示されているハズ。
うむ。
今回、「ボタンが押される ---> 信号が出る ---> 受ける ---> 何かする」という流れが分かっただろうか。
途中、スクリプトが用意してあるノードを選択するのが確認ポイントかもな。
スクリプトのセーブは[Ctrl] + [Alt] + [S] 。([Ctrl] + [S]だとシーンのセーブになる。)ファイルシステムに表示されるようになっているハズ。
今後はどう頑張ってもスクリプトの知識が必要になってくるので、理解したところから、ちょっとずつまとめていきたい。