Godot 玉転がし 13 「グローバル変数でカウントしたいよね」... AutoLoad
コレクタブルを12個全部取ったら「WIN」と表示させる。そのためには、取った個数をカウントする変数を用意する必要がある。今回はこれをグローバル変数なるもので管理してみようと思う。理由は、なんでも、こっちの方がちょっとだけ短く記述できるからっていう。。。
シングルトンとグローバル変数
ずっと前、シーンをまたぐ変数の管理をどうしようかと悩んでいた時、ありがたいことに、シングルトンを使ってみればという内容のコメントを頂いた(ありがとう!)。だが、その当時は一体何のことかサッパリ分からなかったので、「神シーン常駐システム 1/2 2/2」を構築して管理しようとしたわけだ。実際、これは完成し、めでたしメデタシなわけだった。
今回も、シングルトンなんか知らなくったって問題なくゲームを完成させられる。しかし、このシングルトンってやつ、設定はちょっと面倒だがやや便利なところもあるので、今回はこれを利用することにする。
で、シングルトンとは。俺の理解では、「1個しか作らないクラス」のこと(違うかも)。そして、ここに設定した変数の事をグローバル変数と言う。シングルトンのことは忘れても、グローバル変数のことは忘れてはいけない。
グローバル変数の便利さ加減
一番最初に書いたが、ちょっとだけ記述が短くできる。例えば、シーンのルートノードが"Spatial_GOD"という名前だとすると、得点管理は、
get_node("/root/Spatial_GOD").my_score += 1
のような感じになるが、同じことをグローバル変数でやると、
My_Global.my_score += 1
みたいに出来る。("My_Global"って所がシングルトン部分ね。)こんな風に、"get_node(うんたらかんたら~"の部分をすっきり書くことが出来る。な。ちょっとだけ短いだろ。
本来、変数にはアクセス出来る範囲(スコープ)がある。グローバル変数は、その名前にグローバルって付いてるぐらいだから、その範囲が広域で、どっからでもアクセス出来る変数ってことのようだ。でもでも結局さ、Godotの場合、get_node()
でどこでもアクセス出来ちゃうじゃん。だからこの意味での便利さはどうなんだって感じだ。
AutoLoad を活用です
設定しよう。簡単に言うと、スクリプトを作って(1~3)から[AutoLoad]に設定する(4~7)だけ。
[1]
[2]
- Pathに名前を記入。"My_Global.gd"としたが、".gd"が付いていれば好きな名前でイイ。(もちろん、これはパスなのでフォルダを作ってたりしたら、それも含めて記述すること。)書いたら、[Create]。
これは、普通にGDScriptをノードに貼るときに出るやつなので、シングルトンはスクリプトのことなんだなと思ってイイかも。(でも、多分、本当は、シングルトンはクラスで、スクリプトもクラスなんだと思う。知らんけど。)
[3]
スクリプトの中身。もともと色々書いてあったのをバッサリ消して、
var my_score = 0
として、変数を設定。もちろん、前やったけど、extends
の行は消してはならぬ。
[4]
スクリプトが出来たら、今度はメニューの[Project] > [Project Settings]から、[AutoLoad]タブ。Path:の欄の[..]の所をクリック。
[5]
ファイル選択窓が開くから、さっき作ったファイルを選択して[Open]。
[6]
Path:、Node Name:に入って来るから、[Add]押す。
[7]
で、設定完了。(何気にSingletonって書いてあるよねー。)
なんで、AutoLoad って言うのかな?
たぶん、自動で(Auto)ロード(Load)されるから。ぷっ。なんじゃ、そりゃ。
では、確認しよう。シーン再生(又はゲーム再生)をすると、シーンパネルのところに、1行新しい行が追加されるのに気付いただろうか。その部分の[Remote]をクリックすると、シーンツリーに何がぶら下がっているかがリアルタイムに表示される。
(シーンのルートと、シーンツリーのルートとの違いって、大丈夫だよね? だいじょぶだとして、)シーンツリーのルートに、「My_Global」がくっついてるよね。つまり、自動でロードされたってことだな。
足し算しよう
では、コレクタブルを取った時に"my_score"を+1して足し算していこう。12になった時、「WIN」表示だ。
と思ったが、眠いので、次回。
再度、シングルトンに関するコメントくれた方、本当に感謝です。