Unityを始めてすぐにぶつかる壁が「スクリプト」ではないでしょうか。英語と記号だらけのコードを見て、そっとエディタを閉じたくなった——そんな経験がある方も大丈夫です。ゲームを動かすのに、C#のすべてを覚える必要はありません。
Unityでゲームのロジックを書くための言語が C#(シーシャープ) です。この記事では、スクリプトを書き始める上で「これだけは知っておきたい」という基礎中の基 礎——変数、データ型、関数、if文とfor文——に絞って、ひとつずつ解説します。
この記事でわかること
- 変数とデータ型(値を入れておく「箱」の使い方)
- 関数(処理をひとまとめにして再利用する方法)
- if文とfor文(分岐と繰り返しの基本)
public変数とInspectorの便利な関係
動作確認環境: Unity 6 (6000.x) / Input System
変数とデータ型
変数 とは、数値や文字列などのデータ(値)を入れておくための「箱」のようなものです。C#では、この箱に何を入れるかに応じて、 データ型 を明確に指定する必要があります。

Unityで特によく使われる基本的なデータ型を見ていきましょう。
| データ型 | 説明 | 例 |
|---|---|---|
int | 整数(-2, -1, 0, 1, 2...) | int playerScore = 100; |
float | 浮動小数点数(小数)。小数を書くときは末尾にfを付ける。 | float speed = 5.5f; |
bool | 真偽値(trueかfalseのどちらか) | bool isGameOver = false; |
string | 文字列。ダブルクォーテーションで囲む。 | string playerName = "Hero"; |
Vector3 | 3次元のベクトル(x, y, z座標)。位置や方向を表す。 | Vector3 startPosition = new Vector3(0, 1, 0); |
GameObject | Unityのゲームオブジェクトそのもの。 | public GameObject playerObject; |
変数の宣言と使い方
変数は [データ型] [変数名]; の形で宣言し、= を使って値を代入します。
using UnityEngine;
public class VariableExample : MonoBehaviour
{
// 変数の宣言
int health; // 体力(整数)
float moveSpeed; // 移動速度(小数)
bool isJumping; // ジャンプ中か?(真偽値)
void Start()
{
// 変数に値を代入
health = 100;
moveSpeed = 7.5f;
isJumping = false;
// 変数の値をコンソールに出力
Debug.Log("体力: " + health);
Debug.Log("移動速度: " + moveSpeed);
}
}
注意: 初心者がつまずきやすいポイントが2つあります。(1)
floatに小数を入れるときは、末尾に必ずfを付けること(5.5ではなく5.5f。付け忘れるとエラーになります。5のような整数ならfは無くても通ります)。(2)stringの値は必ずダブルクォーテーション"で囲むこと。エラーが出たら、まずこの2つを疑ってみてください。
public変数
変数の前にpublicキーワードを付けると、その変数はUnityエディタのInspectorウィンドウに表示され、プログラマーでなくても値を調整できるようになります。これはゲームバランスの調整などに非常に便利です。
using UnityEngine;
public class PlayerSettings : MonoBehaviour
{
// public変数はInspectorに表示さ れる
public string playerName = "Default Name";
public float jumpPower = 10f;
public int maxHealth = 200;
}
一歩進んだ書き方:
publicにした変数は、Inspectorに表示されるだけでなく、 他のどのスクリプトからも自由に書き換えられる ようになります。「Inspectorで調整したいだけ」のときは、[SerializeField] privateと書くのが実際の開発では定番です。// Inspectorには表示されるが、他のスクリプトからは触れない [SerializeField] private float jumpPower = 10f;最初のうちは「Inspectorに出したいだけなら
[SerializeField] private」と型で覚えてしまって大丈夫です。
関数(メソッド)
関数 (C#での正式な呼び名は メソッド )は、特定の処理をひとまとめにしたものです。関数を定義しておくことで、同じ処理を何度も呼び出して再利用できます。
C#の関数は以下のように定義します。
[戻り値の型] [関数名]([引数]) { ...処理... }
- 戻り値の型: 関数が処理を終えた後に返す値のデータ型。値を返さない場合は
voidを指定します。 - 関数名: 関数の名前。処理内容がわかるような名前を付けます。
- 引数: 関数に渡す情報。複数ある場合 はカンマで区切ります。不要な場合は空にします。
イメージとしては「材料(引数)を入れると、加工された結果(戻り値)が出てくる機械」です。

using UnityEngine;
public class FunctionExample : MonoBehaviour
{
void Start()
{
// 関数を呼び出す
SayHello();
// 引数を渡して関数を呼び出し、戻り値を受け取る
int result = Add(10, 5);
Debug.Log("10 + 5 = " + result);
}
// 引数も戻り値もない関数
void SayHello()
{
Debug.Log("こんにちは!");
}
// int型の引数を2つ受け取り、int型の値を返す関数
int Add(int a, int b)
{
int sum = a + b;
return sum; // returnキーワードで値を返す
}
}
UnityのStartやUpdateも、Unityエンジンによって特定のタイミングで呼び出される特殊な関数の一種です。
制御構文
プログラムの流れをコントロールするのが 制御構文 です。ここでは最も基本的なif文とfor文を紹介します。「ifは分かれ道、forはぐるぐる繰り返し」というイメージを持っておくと理解が早いです。

if文(条件分岐)
if文は、「もし〜ならば、...する」という条件に応じた処理の分岐を作ります。
int score = 85;
if (score >= 80)
{
Debug.Log("素晴らしい!");
}
else if (score >= 60)
{
Debug.Log("合格です。");
}
else
{
Debug.Log("もう少し頑張りましょう。");
}
for文(繰り返し)
for文は、同じ処理を指定した回数だけ繰り返します。
// 0から9まで、10回繰り返す
for (int i = 0; i < 10; i++)
{
Debug.Log("現在のカウント: " + i);
}
例えば、集めたコインの数だけ★を並べる、HPの数だけハートを描く、といった処理に使えます(このあとの実践で使います)。
実践:コイン集めのルールを1本のスクリプトにする
ここまでの部品——変数・関数・if・for——を全部使って、 「コインを集めてゲームクリア」 というルールを1本のスクリプトにまとめてみましょう。マリオ系のコイン、ソニックのリング、パズルゲームの星集め——ジャンルは違っても「集めて、数えて、達成したらクリア」の骨組みは同じです。

using UnityEngine;
using UnityEngine.InputSystem;
public class CoinGame : MonoBehaviour
{
[SerializeField] private int targetCount = 5; // クリアに必要なコイン数(Inspectorで調整)
private int coinCount = 0; // 現在のコイン数
private bool isCleared = false; // クリア済みか?
void Update()
{
// 今はスペースキーで「コインを拾った」ことにする
// (本物の当たり判定は、のちの記事で差し替えられるようになります)
if (Keyboard.current != null && Keyboard.current.spaceKey.wasPressedThisFrame)
{
AddCoin(1);
}
}
// コインを増やして、勝利判定までを担当する関数
void AddCoin(int amount)
{
if (isCleared) return; // クリア後は何もしない
coinCount = coinCount + amount;
// for文で、集めた枚数ぶんの★ゲージを作る
string gauge = "";
for (int i = 0; i < coinCount; i++)
{
gauge = gauge + "★";
}
Debug.Log("コイン: " + gauge + " (" + coinCount + "/" + targetCount + ")");
// if文で勝利判定
if (coinCount >= targetCount)
{
isCleared = true;
Debug.Log("ゲームクリア!");
}
}
}
空のGameObjectにアタッチして再生し、Gameビューを一度クリックしてから、スペースキーを5回押してみてください。キーは、Unity 6 で標準の Input System(Keyboard.current)で読んでいます。Consoleに★が1つずつ増えていき、5枚で「ゲームクリア!」と表示されます(Consoleが見えなければ、Window > General > Console で開きます)。
見てほしいのは、 この記事の道具が全部つながって「ゲームのルール」になっている ことです。変数coinCountが状態を覚え、関数AddCoinが処理をひとまとめにし、for文がゲージを描き、if文が勝敗を決める。今はスペースキーで代用している「拾う」の部分を本物の当たり判定に差し替えれば、そのまま実際のゲームに使えます。断片を暗記するより、この「1本のルール」の形で覚えるのが上達の近道です。
うまくいかないときは
| 症状 | 原因 | 直し方 |
|---|---|---|
CS0664(Literal of type double cannot be implicitly converted to type 'float') | float speed = 5.5; のように、小数のfを付け忘れた | 5.5f と書く |
if (coinCount = 5) で CS0029: Cannot implicitly convert type 'int' to 'bool' | 比べるつもりで、代入の=を書いた | 比べるときは==と書く |
CS1002: ; expected | 行の終わりの;を付け忘れた | エラーの出た行か、その1つ前の行の末尾に;を足す |
CS0103: The name '〜' does not exist in the current context | 変数名の打ち間違い。または宣言していない、宣言した{ }の外で使っている | 宣言と同じ綴りか、宣言した{ }の内側で使っているかを確かめる |
| スペースキーを押しても、Consoleに何も出ない | Gameビューにフォーカスが無く、キーが届いていない | Gameビューを一度クリックしてから押す |
おまけ:先に知っておくと良いこと
この記事の基礎を使い始めると、いずれ次のような「その先の話」に出会います。名前だけでも知っておくと、学習の道筋が見えやすくなります。
- たくさんのデータは「配列」や「List」でまとめる: 敵が10体いるとき、
enemy1、enemy2...と変数を10個作るのは大変です。複数のデータをひとつの変数でまとめて扱う 配列 や List という仕組みがあり、for文と組み合わせることで真価を発揮します。 - C#とUnityを繋いでいるのがMonoBehaviour: サンプルコードに毎回登場する
: MonoBehaviourの意味が分かると、StartやUpdateがなぜ自動で呼ばれるのかが理解できます。MonoBehaviourの記事 で解説しています。 - エラーと仲良くなるのが上達の近道: コードが動かないとき、闇雲に書き直すのではなく
Debug.Logとエラーメッセージから原因を特定するのがプロの 手順です。デバッグ手法の記事 が参考になります。
まとめ
今回は、Unityでスクリプトを書く上で最低限必要なC#の基礎を学びました。
- 変数: データを入れておく箱。
int,float,bool,stringなどが基本。 - 関数: 処理のまとまり。
voidは戻り値なし。 if文: 条件によって処理を分ける。for文: 処理を繰り返す。
これらの要素は、あらゆるスクリプトの基本となります。最初は難しく感じるかもしれませんが、実際にUnityで簡単なスクリプトを書きながら使っていくうちに、自然と身についていきます。まずはこれらの基本を道具として、ゲームに簡単な動きやルールを加えてみましょう。