
Scratch 変数のスコープ詳説

Scratch(スクラッチ)には、本格的なプログラミング言語と同様に、「変数」という考え方があります。変数は、文字や数字を入れておく箱のようなものです。

本格的なプログラミング言語で、privateやpublicといったスコープという概念があるように、Scratch(スクラッチ)の変数にもスコープがあります。
スコープとは、その変数が有効な範囲です。
本記事では、Scratch(スクラッチ)変数のスコープ3種類について、詳細に解説します。
Scratch(スクラッチ)変数のスコープには3種類ある

Scratch(スクラッチ)の変数には、3種類あります。
- クラウド変数
- すべてのスプライト用変数
- このスプライトのみ変数
それぞれのイメージは下図の通りです。

厳密に言うと、3つは並列ではなく、以下のような関係になります。
- クラウドに保存される変数
- クラウド変数
- ブラウザキャッシュに保存される変数
- すべてのスプライト用変数
- このスプライトのみ変数
もしくはこうですね
- すべてのスプライト用変数
- クラウド変数
- すべてのスプライト酔う変数
- このスプライトのみ変数
- このスプライトのみ変数
本記事では、説明を分かりやすくするために、クラウド変数、すべてのスプライト用変数、このスプライトのみ変数という3種類があるという整理で進めます。
ブラウザキャッシュとクラウド
ブラウザキャッシュとはどういうことかというと、Scratch(スクラッチ)のプロジェクトページにアクセスした単位ということです(厳密には少し違いますが)。
今からプロジェクトページにアクセスして、プレイして、一度ブラウザを閉じる(もしくはF5などでページを更新する)と、変数はリセットされます。
これに対してクラウドはScratch(スクラッチ)サーバーに保存されるイメージです。ブラウザを閉じてもリセットはされませんし、プロジェクトを共有して、他の人がプレイしたとしても、共有されます。
すべてのスプライト用変数
一番よく使うのがこの変数です。ネコとGoboで同じ変数を見ることができ、動作の制御などに使うことができます。
例えば、変数「ライフ」=0というのを、ゲーム終了の合図として、ネコ、Gobo、背景それぞれが修了の動作をします。
言わば、Scratch(スクラッチ)におけるpublic static 共通変数でしょうか。
つくり方は簡単で、このように、初期値のまま変数をつくるだけです。

このスプライトのみ変数
このスプライトのみ変数は、スプライトの中だけで共有する変数です。
下図のようにつくります。

ネコでつくった変数は、ネコでしか使わないということ。
言わば、Scratch(スクラッチ)におけるprivate変数でしょうか。
変数のスコープはなるべく狭く(必要以上に拡げない)がプログラミングの基本ですから、ネコでしか使わない変数は、「このスプライトのみ」でつくるのが、本当はセオリーです。
変数を作るときのデフォルトが「すべてのスプライト用」なので、実際にはそうなっていないことが多いですが。。
最大のメリットはクローン専用変数をつくれるところ
そして、「このスプライトのみ」にする最大のメリットは、クローンしたときに享受されます。
「このスプライトのみ」とした変数は、クローンしたときに、いっしょにクローンされます。
そして、クローンした後は、そのクローン専用の変数となります。
クローンしたときの変数の動きは、後ほど説明します。
他のスプライトから参照はできる
あまり知られていませんが、ネコでつくった「このスプライトのみ」変数を、他のスプライトや背景から参照することはできるんです。
あくまで参照のみあり、また後程説明するクローン専用の変数は参照できません。
こちらのブロックを使います。

例えば、変数の操作はネコのみに限定したいけど、他のスプライトや背景から参照はしたいという要件のときに使えます。
クラウド変数
ブラウザキャッシュとクラウドのところで少し触れましたが、ここまで説明してきた変数は、ブラウザを閉じたり、ページを更新したら、リセットされます。
一方で、クラウド変数は、Scratchクラウド上に保存されますので、ブラウザを閉じてもリセットされません。
また、プロジェクトを公開して、他の人にプレイしてもらう場合でも、変数はリセットされず共有されます。
下図のようにつくります。

クラウド変数の使いどころ
よくある使い方が、ゲームのハイスコアを保持するというもの。
スコアありの、ゲームをつくったとします。ハイスコアをクラウド変数に保持し、ハイスコアよりも、高いスコアだったら、ハイスコアを更新するというプログラムを書いておきます。
そうすると、世界中のプレーヤーがあなたのゲームをプレイして、ハイスコアを競うことができます。
注意)アプリ版ではつくることができない
クラウド変数をアプリ版Scratchで扱うことはできません。アプリ版はオフラインでの利用も前提としているからです。
クローンしたときの変数の動き
クローンしたときに変数がどうなるか。
クラウド変数やすべてのスプライト用変数は、スプライトやクローンの個体(インスタンス)に関わらない変数ですので、どのクローンから見ても同じ値を保持しています。
しかし、上でも触れたように、「このスプライトのみ」変数は、クローンしたら、各クローン専用の変数となります。

各クローン専用の変数となりますから、各クローンで変数の値を変えても、他のクローンには影響しません。
例えば、
1つ目のクローンでは、10を足し
2つ目のクローンでは、20を足し
3つ目のクローンでは、30を足してみます。
すべてのスプライト用変数Bは、共用ですから、
2+10+20+30 = 62となります。
一方で、このスプライトのみ変数は、
クローンAでは、3+10 = 13
クローンBでは、3+20 = 23
クローンCでは、3+30 = 33
となります。

クラウド変数、すべてのスプライト用変数、このスプライトのみ変数の順で、
言うようにプログラムしています。
このスプライトのみ変数は、クローン専用になったことがご理解いただけたと思います。
ちなみに、上記プログラムのコードはこちら。

他のスプライトや背景から参照できるのは、クローン元のみ
「このスプライトのみ」変数は、他のスプライトや背景から参照できることを、上で説明しました。
クローン専用の変数も参照できるかというと、答えはNOです。

おまけ)Scratch(スクラッチ)に定数はあるか
結論、Scratch(スクラッチ)に定数はありません。
変数で代用するしかありません。