やっほー!ゴッリラだよ!
今日からさっそく!GameMakerLanguage(GML)の解説を始めていくね!
今回は変数について話していくよ!
GameMakerStudioをまだダウンロードしていない方はこちらから!
★目次
1. 「変数」って?
変数とは、何らかの値をメモリー上に保存するのに使われていて
呼び出しやすい用に名前が与えられているんだ!
現実の世界だと数学の円周率π(パイ)が3.14…の値を保持した
変数になるよ!
いちいち 3.14…って書くよりπって言ったほうが
簡単だし、わかりやすいよね!
変数は値に名前を付けることでプログラムをわかりやすく
書けるように手伝ってくれる便利なデータ管理法なんだ!
GMLでπを宣言するとこうなるよ! π = 3.14
データを保存する箱を想像するとわかりやすいよ!

変数にはルールがあって使える文字は
・アルファベット
・数字
・”_”
のみで、先頭の文字はアルファベット以外認められないよ!

2. 「変数」の宣言方法
GMLで変数を宣言するときは、名前、=、値の順に書くよ!
いくつか例を見ながら理解していこう!
<例1>
5の値を持った[hp]という変数、gorillaという文字列を持った
[name]という名前の変数を宣言しているよ!
文字を変数に保持させたい場合は、文字を” ”で囲むのがルールだよ!
数字はそのままの状態で大丈夫だよ

変数はその名の通り、常に一定の値を保持しているわけではなく
値を簡単に変更することができるんだ!
<例2>

例2ではまず、19の値を保持した[age]という変数が宣言されているよ!
age = age+1では
変数[age]に代入されている値に対して1を足した
結果である新しい値20(19+1)を変数[age]に
再代入しているよ!
age = age – 1では
変数[age]に代入されている値に対して-1を引いた結果である
新しい値19(20-1)を変数[age]に再代入しているよ!
age = age*3では
変数[age]に代入されている値に対して3を掛けた結果である
新しい値57(19*3)を変数[age]に再代入しているよ!
age = age/19では
変数[age]に代入されている値に対して19で割った結果である
3(57/19)を変数[age]に再代入しているよ!
3. 「変数」の種類
GMLの変数には4つのカテゴリーが存在しているんだ!
それぞれスコープ(呼び出すことのできる範囲)が違うから注意が必要だよ!
・インスタンス変数(Instance variables)
・ローカル変数(local variables)
・グローバル変数(global variables)
・組み込み変数(built in variables)
プログラミングでのスコープ(scope, 可視範囲)とは、ある変数名や関数名といった名前を参照できる範囲のこと
・Instance Variables
インスタンス変数はオブジェクトのインスタンス内で
宣言された変数のことで、インスタンスを通してのみ
呼び出すことのできる変数のことだよ!

例えば、プレイヤーオブジェクトで宣言したhp変数を別のオブジェクト内で呼び出したい場合
先頭にオブジェクト名、またはインスタンス名を付けることで
呼び出すことができるよ!

これは別のオブジェクトからプレイヤーのインスタンス変数を呼び出す例だよ!
object_player_hpにはプレイヤーオブジェクトのhp変数の値である
3が代入されているよ!
instance_player_hpにはプレイヤーインスタンスのhp変数の値が
代入されているんだ、この場合3が代入されるけど、
もしプレイヤーがダメージを受けていてhpが減っていた場合や
レベルアップしてhpが増えていた場合別の値が代入されるよ!

・Local Variables
ローカル変数は、特定のイベントのために一時的に宣言できる
変数のことでそのイベントが終わったら、自動的に削除されるよ!
一度しか使わないような変数はローカル変数として宣言することで
メモリーを節約することができるんだ!
宣言するときは、変数名の前に var と入れるだけだよ!
ローカル変数がどんな時に使われるかというと
例えば、バナナとリンゴという8と5の値を持った変数が
既に宣言されているとして二つの変数の値を入れ替えたい時
ローカル変数が役に立つよ!

この例では、最初にフルーツオブジェクトのインスタンス生成していて!
次にtempというローカル変数を宣言して
フルーツオブジェクトのインスタンス変数であるbananaを代入しているよ!
なぜ直接二つの値を入れ替えないの?…と思った方もいると思うんだ!
その場合どうなるのか実際に見てみよう!

最初のコードでは、変数バナナに変数リンゴの値を代入しているね!
ここは問題ないけれど、次の行で問題が起きるんだ(´・ω・`)
3行目では、変数リンゴに変数バナナの値を代入しているよね?
でも、変数バナナの値は最初の行で変更されてしまっていて
元々の値は失われてしまっているんだ!(・口・)
なので、変数バナナに新しい値をを代入する前にtempに保存
しておく必要があるということだよ!
値が交換された後はtempにもう使い道はないよね?
だからローカル変数として宣言しているんだ!

・Global Variables
グローバル変数は、上記の2つの変数と違って
どこからでも呼び出すことのできる変数のことだよ!
ゲームが起動している間は、変数を宣言したインスタンスが消えても
失われることがないよ!
沢山のインスタンス、スクリプトで呼び出す変数などを
グローバル変数化しておくことによってインスタンス名なしで
呼び出せるようになるよ!
だからと言って何でもかんでもグローバル変数化するのは
後にバグの原因になりやすいので、本当にグローバル化
したほうが良い変数だけにしよう!
グローバル変数を宣言する時は、global.変数名 という風に書くよ!

・Built in Variables
Built in Variablesは、元々GameMakerによってオブジェクト、
部屋に組み込まれている変数のことだよ!
ほとんどの変数はインスタンス変数
いくつかはグローバル変数として扱われるよ!

組み込み変数は緑色で表示されて
同じ名前の変数を宣言することができないので注意が必要だよ!
x,yのように明確な組み込み変数もあれば、わかりづらい変数も
あると思うので、何かあれば公式ページで確認してみてね!
まとめ
変数を宣言する前に、まずは変数名が組み込み変数と被っていないか
確認してインスタンス、ローカル、グローバル
どのカテゴリーの変数として宣言するのがベストか考えよう!
初めの内は良くわからないと思うので全てインスタンス変数として
宣言するのがおすすめだよ!
最後まで読んでくれてありがとう!
少しでも皆の力になれたことを祈っているよ!

質問、おかしな点があればコメント、ツイッターで教えてね!