【Unity】変数とは?スクリプトで扱える数値や文字列を入れた箱

スクリプトの変数とは? Unity

こんにちは、ともくんのゲーム作り部屋にようこそ!

このページでは、

「Unityでゲーム作りしたいんだけど、変数が何なのか分からない!」

「変数の基本的な使い方を知りたい!」

というお悩みの方に向けた内容となっています。

Unityでゲーム作りをしていく際に、キャラクターなどを動かすのにスクリプトを作っていく必要があります。

このスクリプトを書く際に「変数」というものをたくさん使って、書いていくことになります。

変数というのは、数値や文字列などのデータが入っている箱のことで、この変数を使うことでスクリプトを非常に便利に書いていくことが出来るようになります。

そこでこのページでは、Unityのスクリプト(C#言語)を書く際に必要となってくる変数について、基本的な使い方をまとめていきます。

なお、このページでは、

Windows11
Unity Hub3.11.0
Unity6

のバージョンで解説しています。

この記事を書いた人

ゲーム作りを学び始めた一児のパパです。
このブログは、子供から「ゲームを作ってみたい!」と言われ、非プログラマーでゲーム作りをしたことない僕が、ゲーム作りの本を読んで独学でゲーム開発を学んでいるブログです。
同じように初めてゲーム作りをしている方と一緒に学んでいけるようなブログに出来たらいいなと思っています。
また、「このコードはおかしい」とか「もっと良い書き方があるよ!」などあれば、どんどん指摘して頂けると助かります。

変数とは?

まず、変数というものが何なのかについて、紹介していきます。

数値や文字列が入っている箱のようなもの

変数は、簡単に言うと数値や文字列といったデータを入れている箱のようなものになっています。

例えば、ゲーム作りをしていて、

  • プレイヤーのHPは100にしよう
  • 敵Aからのダメージを10にしよう

とした際に、それぞれに対して箱を作ってあげるのが変数のイメージです。

そして、この変数という箱は、自分で好きなだけ作ることができます。

変数でデータを管理できる

ただ、どうしてわざわざ変数を作る必要があるのでしょうか?

それは、変数でデータを管理して、それをいつでも出力することができるからです。

例えば、先ほどの例でいくと、プレイヤーのHPというのはダメージを受けたり回復したりすることで、常に変化していくものです。

変数を使うと、特定の条件が起きた際に、この変数の箱から足したり引いたりすることができます。

そして変数を作っておかないと、今のHPがいくつなのかを管理することが出来なくなって、表示できなくなってしまいます。

そのため、変数はデータを保持して管理することができるもので、プログラミングにとって、非常に大事な箱になっています。

変数の基本的な使い方

ここからは、実際に変数をどのように使うのか、基本的な使い方を紹介していきます。

変数の宣言

変数には、まず宣言というものが必要になります。

変数は宣言をしてから使用する

変数を使用する前に、必ずスクリプト内で変数の宣言をする必要があります。

変数の宣言は、

型名 変数名;

という書き方をします。

例えば、float型playerSpeedという変数名を使用したい場合は、

float playerSpeed;

と記述しておくことで、その後のコードで「playerSpeed」と書けば、そこに入っているデータを使用することができます。

型名でデータの種類を選択する

変数の宣言で必要となる型名とは、その変数のデータの種類を書きます。

例えば、その箱の中に「整数」を入れるのか、「小数」を入れるのか、もしくは「文字列」を入れるのかなどで、この型名を変えていく必要があります。

この型名には、様々なものが準備されていますが、主に使用するのは以下のような型名となっています。

型名データの内容
int整数
float浮動小数(小数の後ろに「f」を付ける)
double倍精度浮動小数
bool(true)もしくは(false)
string文字列(複数の文字)
char文字(1文字)

floatは有効桁数7桁の浮動小数、doubleは有効桁数16桁の浮動小数

この中でも特に良く使用するのは、

です。

なお、型は途中で変更することもでき、Parseメソッドを使うことで型を変えられます。

変数名はキャメルケースが一般的

変数を宣言する際は、型名の後ろにスペースを空けて変数名を記載します。

この変数名は、英数字を使って自分で自由に決められますが、ゲームを作っていく際にスクリプト内の様々な箇所で使っていくことになるので、分かりやすいものである方が良いです。

例えば、

  • プレイヤーの速度を決める変数であればplayerSpeed
  • プレイヤーの攻撃力を決める変数であればplayerAttckPower

などです。

また、変数名は一般的にはキャメルケースと呼ばれる記法で書きます。

キャメルケースとは、最初の文字を小文字にして、単語の区切りを大文字で書いていく方式です。

必ずしもキャメルケースである必要はありませんが、ルールを決めて変数名を書いていく方が分かりやすいでしょう。

変数のスコープ:変数を宣言する場所は要注意

変数の宣言は、ここまでの型名と変数名を書けばOKですが、宣言をする場所は注意しておく必要があります。

なぜなら、変数は宣言をした{}内で囲まれたブロックの中でしか使うことができないからです。

例えば、Unityでスクリプトファイルを作成すると、始めから「void Start()」「void Update()」というものが作られていると思います。

これらは、メソッドと呼ばれる処理ごとに分かれているもので、{}の記号によって仕切られています。

  • Startメソッド ⇒ 読み込まれた際に1回だけそのブロック内の処理を行う役割
  • Updateメソッド ⇒ フレームごとにそのブロック内の処理が何度も繰り返される役割

変数の宣言は、Startメソッド内でもメソッド外でもどちらにでも書くことができます。

しかし、Startメソッドのブロック内で変数を書いた場合、その変数はStartメソッドのブロック内でのみ使うことができ、{}で囲まれたブロックの外ではその変数を使用することが出来なくなります。

これを変数のスコープと呼び、変数の有効範囲を定めています。

そのため、Startメソッドでも、その下のUpdateメソッドでも、その変数を使用したいのであれば、メソッドのブロックよりも上(画像の①部分)に変数を宣言するようにしましょう。

なお、プログラムは上から順番に読み込んでくるため、変数を使用するよりも前(上)にその変数を宣言しておく必要があります。

変数の代入

変数は宣言をした後に、代入(だいにゅう)という作業を行います。

なお、ここからは分かりやすいように、先ほどのStartメソッド内で実際に処理をした後にDebug.Log関数を使って、変数がどのように変わっているのか、Unityのコンソールウィンドウに表示できるようにしたスクリプトで紹介しています。

変数にデータを入れること

変数は宣言をしただけでは、箱の中は空っぽの状態なので、データを入れる必要があります。

このデータを入れること代入(だいにゅう)と呼び、以下のように代入演算子の「=」を使って書いていきます。

変数名 = 代入する値;

なお勘違いしやすいですが、この「=」は算数の左辺と右辺が同じことを示しているのでは無く、「左の変数に右の値を入れる」ということを表しています。

例えば、プレイヤーの攻撃力の変数として、int型playerAttckPowerという変数を作り、攻撃力を10とする場合は、

using UnityEngine;

public class Test : MonoBehaviour
{
    int playerAttckPower;   // 変数を宣言している
	void Start()
    {
        playerAttckPower = 10;	// 変数に「10」を代入している
        Debug.Log(playerAttckPower);    // 結果を表示している
    }
}
コンソール画面の表示結果

10

と、変数の宣言の後に10の数値を代入してあげることで、変数にデータを入れることができています。

代入すると変数のデータは上書きされる

変数に代入することで、データを入れることができましたが、データがすでに入っている変数に代入すると、その変数のデータは上書きされることになります。

例えば、先ほどプレイヤーの攻撃力の変数であるint型playerAttckPowerを作り、10の値を代入しましたが、さらにその後に20を代入すると、コンソールウィンドウの結果には20が表示されます。

using UnityEngine;

public class Test : MonoBehaviour
{
    int playerAttckPower;   // 変数を宣言している
	void Start()
    {
        playerAttckPower = 10;  // 変数に「10」を代入している
        playerAttckPower = 20;	// 変数に「20」を代入している
        Debug.Log(playerAttckPower);    // playerAttckPower変数の結果を表示している
    }
}
コンソール画面の表示結果

20

これは、playerAttckPowerの変数に10が代入された後に、再度20が代入されたことで上書きされているからです。

通常、変数の代入をした後にすぐに代入することはありませんが、例えばゲーム上で特定のフィールド内に入ったら攻撃力を変更したいなどの場合に、再度代入してあげることで上書きすることができます。

変数に変数を代入できる

変数に対して、変数を代入することもできます。

変数を代入する場合も書き方は同じで、

変数名A = 変数名B;

と書くことで、変数に変数を代入することができます。

例えば、まずfloat型playerSpeed変数を作り、同じfloat型slowSpeed変数0.01を代入しておいて、playerSpeed変数にslowSpeed変数を代入すると、playerSpeed変数に0.01の値が入ります。

using UnityEngine;

public class Test : MonoBehaviour
{
    float playerSpeed;  // playerSpeed変数を宣言している
    float slowSpeed;    // slowSpeed変数を宣言している
	void Start()
    {
        slowSpeed = 0.01f;  // slowSpeed変数に「0.01」を代入している
        playerSpeed = slowSpeed;	// playerSpeedにslowSpeedを代入している
        Debug.Log(playerSpeed); // playerSpeed変数の結果を表示している
    }
}
コンソール画面の表示結果

0.01

実際はこのような使い方はしませんが、例えば砂フィールド用のスピード変数を決めておいて、砂のフィールドに触れたらプレイヤーのスピードを下げたいなどの際に、このように変数に変数を代入することができます。

なお、変数に変数を代入する場合は、どちらの変数も型の種類が同じかどうかを確認しておきましょう。

また、データをコピーするような形になるので、変数を代入しても元の変数のデータが空っぽになるわけではありません。

文字列の場合ダブルクォーテーション(“)が必要

ここまで、変数に数値を代入していきましたが、もちろん文字列を代入することもできます。

ただし、文字列を代入する場合は、その文字列をのダブルクォーテーションの記号で囲む必要があります。

変数名 = "文字列";

例えば、武器屋の人のセリフをstring型weaponShopSerifという変数名にして、いらっしゃいませ!という文字列を代入する場合、以下のようになります。

using UnityEngine;

public class Test : MonoBehaviour
{
    string weaponShopSerif; // weaponShopSerif変数を宣言している
	void Start()
    {
        weaponShopSerif = "いらっしゃいませ!";	// セリフを代入している
        Debug.Log(weaponShopSerif); // weaponShopSerif変数の結果を表示している
    }
}
コンソール画面の表示結果

いらっしゃいませ!

代入する文字列に対して、“”の記号で囲むことでコンピューター側は文字列と認識して、表示させることができます。

なお、char型は1つの文字の場合に使用できますが、その際はシングルクォーテーションの記号で囲みます。

変数の初期化

ここまでで、変数の宣言と代入を行うことができましたが、変数の初期化で同時に行うことができます。

変数の宣言と代入を同時に行うこと

変数の初期化とは、これまでの変数の宣言と代入を同時に行うことを指します。

具体的には、変数の初期化を行う際は、

型名 変数名 = 代入する値;

と書いてあげることで、変数の宣言と代入を同時に行うことができます。

例えば、先ほどのプレイヤーの攻撃力の変数として、int型playerAttckPowerという変数を作り、最初の攻撃力を10とする場合、

using UnityEngine;

public class Test : MonoBehaviour
{
	int playerAttckPower = 10;	// 変数に「10」を代入して初期化
	void Start()
	{
		Debug.Log(playerAttckPower);	// 結果を表示している
	}
}
コンソール画面の表示結果

10

と、先ほどよりも短く書くことができます。

頭にconstを付けると定数になる

変数の初期化をする際に、「const」と頭に付けてあげることで、定数になります。

定数とは、決められた値のことで、後から値を書き換えることができない変数を作ることができます。

定数にする際は、

const 型名 変数名 = 代入する値;

と書きます。

そして、変数を定数にした場合、その変数に別のデータを代入しようとすると、エラーが表示されて実行できません。

例えば、先ほどのint型playerAttckPowerという変数に、10の値を代入し定数で初期化して、その後に20の値を代入しようとすると、エラーになります。

using UnityEngine;

public class Test : MonoBehaviour
{
    const int playerAttckPower = 10;    // 変数に「10」を代入して初期化し定数にしている
	void Start()
    {
        playerAttckPower = 20;	// playerAttckPower変数は定数なのでエラー発生
        Debug.Log(playerAttckPower);
    }
}

そのため、書き換えたくない変数を作る場合は、定数にしておくと良いでしょう。

変数の基本的な計算

変数はデータを保持するだけでなく、計算としてそのデータを使用したりすることができます。

スクリプト上で計算することができる

スクリプト上では、数値を使って計算を行うことができます。

例えば、int型answerという変数を作成して、このanswerに計算式を入れることで、その計算結果がコンソールウィンドウに表示されます。

using UnityEngine;

public class Test : MonoBehaviour
{
    int answer; // 変数を宣言している
	void Start()
    {
        answer = 3 + 5;	// 計算式の結果を代入している
        Debug.Log(answer);  // answer変数の結果を表示
    }
}
コンソール画面の表示結果

8

このように変数は、計算した結果のデータを保持するということもできます。

なお、例では足し算を紹介しましたが、プログラムで使える演算子(算術演算子)には以下のようなものがあります。

算術演算子意味
+加算(足し算)
減算(引き算)
*乗算(掛け算)
/除算(割り算)
%剰余(割り算の余り)

変数同士での計算も可能

スクリプト上で計算が出来ることが分かりましたが、変数同士による計算を行うこともできます。

例えば、

して、それぞれ薬草を10個、剣を1つ、盾を2つ購入した場合の残りの所持金を計算した場合、

using UnityEngine;

public class Test : MonoBehaviour
{
    int playerMoney = 1000; // playerMoney変数を1000で初期化
    int herbsMoney = 30;    // herbsMoney変数を30で初期化
    int swordMoney = 100;   // swordMoney変数を100で初期化
    int shieldMoney = 150;  // shieldMoney変数を150で初期化
	void Start()
    {
        playerMoney = playerMoney - (herbsMoney * 10 + swordMoney * 1 + shieldMoney * 2);	// 変数同士での計算
        Debug.Log(playerMoney); // playerMoney変数の結果を表示
    }
}
コンソール画面の表示結果

300

と、変数同士で計算することができます。

なお、計算の順序は数学と同じで、加算・減算よりも乗算・除算の方が先に計算され、()を付けたらその中の式が最優先されて計算されることになります。

変数の一定の増減は省略して書ける

変数に一定の増減を加えたい場合は、式を一部省略して書くことができます。

例えば、プレイヤーのHPの変数をint型hp100と代入して、この変数hpにアイテムの効果として10を加えたい場合、通常は

using UnityEngine;

public class Test : MonoBehaviour
{
    int hp = 100;   // hp変数を100で初期化
	void Start()
    {
        hp = hp + 10;	// hpに10を加算する
        Debug.Log(hp);  // hp変数の結果を表示
    }
}
コンソール画面の表示結果

110

として書きます。

このスクリプトの6行目の「hp = hp + 10;」という部分は、「hp変数にhp変数を10加えた値を再度代入する」という回りくどい書き方になっていることから、「hp += 10;」と省略して簡単に書くことができます。

using UnityEngine;

public class Test : MonoBehaviour
{
	int hp = 100;	// hp変数を100で初期化
	void Start()
	{
		hp += 10;	// hpに10を加算する
		Debug.Log(hp);	// hp変数の結果を表示
	}
}
コンソール画面の表示結果

110

このように、先ほどと同じ結果となっているのが分かります。

なお、今回はサンプルとして加算を紹介していますが、「-=」で減算、「*=」で乗算、「/=」で除算、「%=」で剰余を行うこともできます。

インクリメント演算子とデクリメント演算子

先ほど省略して書くことができる方法を紹介しましたが、1だけ加算したり減算したりする場合はさらに別の書き方があります。

例えば、先ほどのhp変数に1だけ数値を加えたい場合、

hp += 1;

と書きますが、これを

hp++;

と書くことができます。

実際に、スクリプトで書いてみると、

using UnityEngine;

public class Test : MonoBehaviour
{
    int hp = 100;   // hp変数を100で初期化
	void Start()
    {
        hp++;	// hpに1を加算する
        Debug.Log(hp);  // hp変数の結果を表示
    }
}
コンソール画面の表示結果

101

となり、ちゃんと1だけ増加されているのが分かります。

この「++」という表記をインクリメント演算子と呼び、反対に1だけ減算する「–」という表記をデクリメント演算子と呼びます。

ゲーム制作をしていると、例えばダメージを受けるとライフを1だけ減らしたい、などのような使い方があり、かなり多く使用することがあるので覚えておきましょう。

まとめ

このページでは、Unityのスクリプトで使える変数について、どんな仕組みなのか、使い方や計算方法までを紹介していきましたが、いかがでしたでしょうか?

変数とは、数値や文字列などのデータが入っている箱のようなもので、この中でデータを保管してくれたり、出して計算したりすることができます。

変数は使う前に宣言をして、型名で種類を決める必要があります。

また、変数同士での計算や、省略して計算式を書く方法もあるので、ちゃんと覚えておくことで、効率的にスクリプトを書いていくことができます。

最後までお読みいただきまして、ありがとうございました!

コメント