ゲームを作っていると、スコアやHP、移動の速さなど、いろいろな「数値」や「文字」を覚えておく必要があります。それを入れておく箱が変数!今回は変数の書き方と、Inspectorから値を調整する方法をご紹介します。
この記事で学べること
- 変数とは何か
- 変数の宣言と代入の書き方
- 主なデータ型(int / float / string / bool)の使い分け
- public・private・[SerializeField]の違い
- Inspectorで変数の値を変更する方法
前提知識
- Start関数とUpdate関数を理解しよう:関数の実行タイミング
- インスペクターでオブジェクトを設定する:Inspectorの使い方
変数とは?データを入れる箱
変数の役割
変数とは、データを保存しておくための箱のようなものです。計算した結果や、ゲームの中で変わっていく値を覚えておけます。
- ゲームのスコア
- キャラクターの移動速度
- プレイヤーの名前
- ゲームオーバーかどうか
変数の例え
- 箱の名前:変数名(例:
score) - 箱の中身:保存されたデータ(例:
100) - 箱の種類:データ型(例:整数を入れる箱)
一度箱にデータを入れたら、後でそのデータを取り出して使ったり、別の値に入れ替えたりできます。
変数の宣言と代入
変数の書き方
C#で変数を作る(宣言する)には、次の形で書きます:
データ型 変数名 = 初期値;
具体例:
int score = 0; // 整数を保存する変数
float speed = 5.0f; // 小数を保存する変数
string playerName = "勇者"; // 文字列を保存する変数
bool isAlive = true; // true(はい)かfalse(いいえ)を保存する変数
変数の代入
宣言した変数に、後から値を入れる(代入する)こともできます:
int score; // 宣言だけ
score = 100; // 代入
score = score + 10; // 今の値に10を足して、また入れる(110になる)
score += 10; // 上と同じ意味の短い書き方(120になる)
「=」は「等しい」ではなく、右側の値を左側の箱に入れるという意味です。最初はここで混乱しやすいので注意しましょう。
主なデータ型
int:整数を扱う
int playerLevel = 1;
int enemyCount = 5;
- 用途:レベル、スコア、個数など
- 例:
playerLevel = playerLevel + 1;
float:小数を扱う
float moveSpeed = 5.0f;
float jumpHeight = 2.5f;
- 用途:速度、高さ、時間など
- 注意:数字の最後に
fをつける(つけ忘れるとエラーになります)
string:文字列を扱う
string playerName = "勇者";
string message = "ゲームスタート!";
- 用途:名前、メッセージ、テキストなど
- 文字列は「”」で囲む
- 「+」でつなげられる:
message = "スコア: " + score;
bool:はい・いいえを扱う
bool isGameOver = false;
bool canJump = true;
- 用途:状態の管理(オン/オフ、出来る/出来ない)
- 値:
true(はい)かfalse(いいえ)の2つだけ - boolは、次の6-5の記事で説明するif文と組み合わせて「ゲームオーバーならこうする」のように使います
Vector3:3つの数字をまとめて扱う
Unityでよく使う、X・Y・Zの3つの数字をまとめた型です。
Vector3 startPosition = new Vector3(0f, 1f, 0f);
- 用途:位置、移動する向き、大きさなど
- Transformの
positionもVector3です(6-8の記事で詳しく使います)
public・private・[SerializeField]
public:Inspectorに表示され、ほかのスクリプトからも使える
public float moveSpeed = 5.0f; // Inspectorに表示される
private:このスクリプトの中だけで使う
private int currentScore = 0; // Inspectorに表示されない
- 何も書かない場合も、privateと同じ扱いになります
[SerializeField]:privateのまま、Inspectorに表示する
[SerializeField] private float jumpPower = 10.0f; // Inspectorに表示される
- Inspectorで調整はしたいけど、ほかのスクリプトからは勝手に変えられたくない、というときに使います
- この講座では、Inspectorで調整したい変数は基本的に
[SerializeField] privateで書きます
| 書き方 | Inspectorに表示 | ほかのスクリプトから使える |
|---|---|---|
| public | される | 使える |
| private | されない | 使えない |
| [SerializeField] private | される | 使えない |
Inspectorで変数を変更する
変数の表示
スクリプトをゲームオブジェクトにアタッチすると、publicや[SerializeField]の変数がInspectorに自動で表示されます。moveSpeedは「Move Speed」のように、読みやすい形で表示されます。
Inspectorの値が優先される
スクリプトに書いた= 5.0fは、アタッチした瞬間の最初の値です。一度Inspectorで値を変えると、Inspectorの値の方が使われます。スクリプトの数字を変えたのに反映されない!というときは、Inspectorの値を確認しましょう(コンポーネントの「⋮」>Resetで、スクリプトの値に戻せます)。
実行中の変更
Playモード中でも値を変更できます。動きを見ながら速さを調整できるので便利です!ただし、5-2の記事で説明したとおり、再生を止めると元の値に戻るので注意しましょう。
実践サンプル:移動速度を変数で管理
キューブを前に進ませて、その速さをInspectorから調整してみましょう。
- Hierarchyで右クリック>3D Object>Cubeを作る
- Projectウィンドウで右クリック>Create>MonoBehaviour Script、名前を「VariableExample」にする
- 下のコードに書き換えて保存し、Cubeにアタッチする
- 再生して、Consoleとシーンビューを確認する
using UnityEngine;
public class VariableExample : MonoBehaviour
{
// Inspectorで調整出来る変数
[SerializeField] private float moveSpeed = 1.0f;
[SerializeField] private string objectName = "テストキューブ";
// スクリプトの中だけで使う変数
private Vector3 startPosition;
private float elapsedTime = 0f;
void Start()
{
startPosition = transform.position;
Debug.Log(objectName + "の最初の位置: " + startPosition);
}
void Update()
{
// 経過時間を足していく
elapsedTime += Time.deltaTime;
// 前(Z軸のプラス方向)に、1秒あたりmoveSpeedずつ進む
transform.Translate(Vector3.forward * moveSpeed * Time.deltaTime);
}
}
このサンプルのポイント:
moveSpeed:Inspectorで速さを調整出来る。再生中に変えると、すぐに速さが変わりますobjectName:ログに表示する名前startPosition:最初の位置を覚えておくelapsedTime:再生してからの時間。Inspectorには出ないので、確認したいときはDebug.Log(elapsedTime);を足してみましょう
注意点やヒント
変数名は、何のデータか分かる名前にしましょう
playerSpeed(良い)x(何の値か分からない)theSpeedOfThePlayerCharacter(長すぎる)
変数名は小文字から始めて、2つ目の単語から大文字にする(moveSpeed)のがC#の習慣です。
スライム数字にfを付け忘れて、赤い波線が出た・・・



floatには「f」!これは誰でも最初に通る道だよ。エラーメッセージに「use an ‘F’ suffix」って出ていたら、それが合図だね
よくあるエラーと対処法
エラー:The name ‘変数名’ does not exist in the current context
- 原因:変数を宣言していない、名前のつづりが違う、または使える範囲(スコープ)の外で使っている
- 対処法:つづり(大文字・小文字も)を確認する。Startの中で宣言した変数はUpdateでは使えないので、両方で使うならクラスの先頭(関数の外)で宣言する
エラー:Literal of type double cannot be implicitly converted to type ‘float’; use an ‘F’ suffix
- 原因:floatの変数に、
5.0のようにfを付けない小数を入れようとした - 対処法:
5.0fのように、数字の最後にfを付ける
エラー:Cannot implicitly convert type ‘float’ to ‘int’
- 原因:int(整数)の変数に、小数を入れようとした
- 対処法:変数をfloatにする。どうしても整数にしたい場合は
(int)1.5fのように書く(小数点以下は切り捨て)
エラー:Inspectorに変数が表示されない
- 原因:変数がprivateで[SerializeField]がついていない、またはスクリプトにエラーがあって読み込めていない
- 対処法:[SerializeField]を付ける。Consoleに赤いエラーが出ていないか確認する
まとめ
- 変数:データを保存するための箱。「=」は右の値を左に入れる意味
- データ型:int(整数)、float(小数、fを付ける)、string(文字列)、bool(はい・いいえ)、Vector3(3つの数字)
- [SerializeField] private:Inspectorで調整出来て、ほかからは変えられない。この講座の基本の書き方
- Inspectorで変えた値の方が、スクリプトに書いた初期値より優先される
次のステップ
変数でデータを管理できるようになったので、次は「〜なら〇〇する」「〇回くり返す」を書く方法を学びましょう:
コメント
コメント一覧 (6件)
[…] 変数でデータを保存しよう:変数の使い方 […]
[…] 変数でデータを保存しよう […]
[…] 変数でデータを保存しよう […]
[…] 変数でデータを保存しよう […]
[…] 変数でデータを保存しよう […]
[…] 変数でデータを保存しよう […]