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

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

Godot 玉転がし 13 「グローバル変数でカウントしたいよね」... AutoLoad

コレクタブルを12個全部取ったら「WIN」と表示させる。そのためには、取った個数をカウントする変数を用意する必要がある。今回はこれをグローバル変数なるもので管理してみようと思う。理由は、なんでも、こっちの方がちょっとだけ短く記述できるからっていう。。。 f:id:ore2wakaru:20180317064855p:plain


シングルトンとグローバル変数

ずっと前、シーンをまたぐ変数の管理をどうしようかと悩んでいた時、ありがたいことに、シングルトンを使ってみればという内容のコメントを頂いた(ありがとう!)。だが、その当時は一体何のことかサッパリ分からなかったので、「神シーン常駐システム 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] 
f:id:ore2wakaru:20180317051655p:plain

  1. スクリプトエディタから、
  2. ニュースクリプトする。[File] > [New]

[2]
f:id:ore2wakaru:20180317052258p:plain

  1. Pathに名前を記入。"My_Global.gd"としたが、".gd"が付いていれば好きな名前でイイ。(もちろん、これはパスなのでフォルダを作ってたりしたら、それも含めて記述すること。)書いたら、[Create]
    これは、普通にGDScriptをノードに貼るときに出るやつなので、シングルトンはスクリプトのことなんだなと思ってイイかも。(でも、多分、本当は、シングルトンはクラスで、スクリプトもクラスなんだと思う。知らんけど。)

[3]
f:id:ore2wakaru:20180317053637p:plain

スクリプトの中身。もともと色々書いてあったのをバッサリ消して、

var my_score = 0

として、変数を設定。もちろん、前やったけど、extendsの行は消してはならぬ

[4]
f:id:ore2wakaru:20180317054521p:plain

スクリプトが出来たら、今度はメニューの[Project] > [Project Settings]から、[AutoLoad]タブ。Path:の欄の[..]の所をクリック。

[5]
f:id:ore2wakaru:20180317055107p:plain

ファイル選択窓が開くから、さっき作ったファイルを選択して[Open]

[6]
f:id:ore2wakaru:20180317055441p:plain

Path:Node Name:に入って来るから、[Add]押す。

[7]
f:id:ore2wakaru:20180317055927p:plain

で、設定完了。(何気にSingletonって書いてあるよねー。)


なんで、AutoLoad って言うのかな?

たぶん、自動で(Auto)ロード(Load)されるから。ぷっ。なんじゃ、そりゃ。

では、確認しよう。シーン再生(又はゲーム再生)をすると、シーンパネルのところに、1行新しい行が追加されるのに気付いただろうか。その部分の[Remote]をクリックすると、シーンツリーに何がぶら下がっているかがリアルタイムに表示される。

f:id:ore2wakaru:20180317061437p:plain

(シーンのルートと、シーンツリーのルートとの違いって、大丈夫だよね? だいじょぶだとして、)シーンツリーのルートに、「My_Global」がくっついてるよね。つまり、自動でロードされたってことだな。


足し算しよう

では、コレクタブルを取った時に"my_score"+1して足し算していこう。12になった時、「WIN」表示だ。

と思ったが、眠いので、次回。


再度、シングルトンに関するコメントくれた方、本当に感謝です。