"Godot Engine" GDScript 4 「クラスの概念が分かってない人がゲームエンジンに触るとこうなりますの例」
“extends” の件、結論から言うと、ここは「イジラナイ」って決めたんだけど、その理由を書いておこうと思う。俺が納得して先に進むのに必要なことだ。理由。2つある。
理由1. 意味ない
この1行 “extends XXXXX” は必要。"XXXXX" にはいい加減な文字も入ってきちゃうがエラーになる。という2点は前やったので分かっている。その後ネットで検索した結果、エラーにならない単語があるという事が判明。
それは、シーンにノードを追加する時に出てくるツリー構造と関係が深い。ツリー構造のルートである「Node」から、スクリプトを持つノード自身へとつながるこのライン上(エッジでつながった親子関係のライン)の単語ならエラーにならないとの事。
例えば、「CheckButton」ノードに貼り付けたスクリプトでは、
- “extends Node”
- “extends CanvasItem”
- “extends Control”
- “extends BaseButton”
- “extends Button”
- “extends CheckButton”
の6パターンが可能という事。
俺の予想では、「CheckButton」ノードに貼るスクリプトに、一番上の “extends Node” なんて書いたら、「CheckButton」ノードが本来使えるハズの関数が使用できなくなって、「Node」ノード用の関数に使用を限定されてしまうのではと思っていたのだが、そんな事もナイとの事。使える関数にも制限は掛からないし、何も変わらないって事だ。
んー、なら、変える意味ないよね。
また、ラインから外れているもの、例えば “extends CheckBox” はエラーになる。「CheckBox」と「CheckButton」は兄弟関係にあるので、一見よさそうに見えるけど、ツリー構造上のエッジで繋がれた親子関係にないのでダメだ。「CheckButton」ノードに “extends Label” とかやったら、本来「Label」ノードにしか使えない関数が使えるようになるんだとも思っていたが、そんなことはナイって事だ。エラーになってしまうんだからな。
んー、なら、変える意味ないよね。
つまり変える意味が無いんだ。これが1つ目の理由。
理由2. 一生使わない
“XXXXX” の部分には単語を入れる以外の方法もあるみたいだ。さっきの方法は意味ないんだから、おそらくこっちが本来の使い方だろう。"res://ore_file.gd" みたいにパス(ファイル名)を書き入れるのだ。
ちょっと面倒くさいのだが、「CheckButton」ノードに貼る場合を実際にやってみる。2段階で準備しないといけないのでメンドクサイのだが。
準備1. 「完全外部独立型スクリプトファイルの作成」
まず、テキストエディタでファイルを作成する。中身を以下のように書いて、拡張子を “.gd” とし、プロジェクトフォルダに入れる。"zzzz.gd" とした。
コピペ用
extends Node func ore_kansu(): print("Umi ha hiroi na- ookii na-")
ちょっと解説。
1行目: 上でやったように、「Node」~「CheckButton」までのライン上なら、何でもOK。
3行目: "ore_kansu()“ という関数を定義します。コロン ”:” 忘れずに。
4行目: 関数の中身。コンソール画面に、”Umi ha hiroi na- ookii na-”と表示しなさい。"print(“文字列”)“で、文字列を表示してくれということ。"print” の前には必ずインデント(TAB)を忘れずに。
プロジェクトフォルダに入れて2、3秒すると、Godot が認識するのでファイルシステムパネルに現れる。
準備2. 「ノードに貼り付けるスクリプトファイルの作成」
「CheckButton」ノードに実際に貼り付けるスクリプトには、このように書く。
コピペ用
extends "res://zzzz.gd" func _ready(): ore_kansu()
ちょっと解説。
1行目: " “ で挟んでさっき作ったファイルをパス名で書き入れる。このスクリプト中で、"zzzz.gd” ファイルの中で定義した関数(具体的には ”ore_kansu()” だな)を使えるようにしましたよ先輩、って言う事らしい。Godot が最初から準備した関数以外のものを自分で付け足した形だ。
ここで便利機能を紹介。ファイルのパスを “res://~~” と、いちいち手書きで書き込むのはめんどくさい。ファイルシステムパネルでファイルを選び右クリメニューから [Copy Path] すると、コピペ出来るようになる。
3行目: 前にも出てきたやつ。シーンにあるノードの再生準備が出来たら、次の行の処理をしなさいということ。
4行目: "ore_kansu()“ を呼び出す。
確認
準備は整った。どうなるのか確認をするため、シーンの再生をする。
中央下のパネル Output にごちゃ~と並んだ最後の行、”Umi ha hiroi na- ookii na-”と表示されている。"ore_kansu()“ がちゃんと呼び出されたということが分かる。
この使い方、簡単に言うと、シーンに置いたノードが使える関数を増やしたい時に使うって事だと思うけど。。。なるほど、"extend"(拡張する)。そうか、使える関数を拡張するって事だったんだ。さすが、俺、分かりやすい。
ただ、Godot が用意した関数だけでも覚えるのが大変だって言うのに。初心者をゲームエンジンから遠ざけるための罠か、はたまた、既得権益を守りたいという勢力の・・・、えーいめんどくさーい。
こんな手の込んだ使い方、一生しないだろうさ。これが2つ目の理由。
結論
以上理由により、最初にデフォで Godot が入れてくるヤツのまま「イジラナイ」、というのが結論。
スクリプトをはっ付ける時のテンプレの1行目に、意味不明なものがずっと居座るのは気持ちが悪いので調べてみたが、いやはや、結果だけみると、なんだかな。
今の所はこうしておこう。何か分かったら、それはそれで、またその時。
次回は、スクリプトのテンプレに出てきた順で、"func _ready():“ に関してを予定。早く、「スタート画面からゲーム画面」に画面を移動したい。