csharp game入門|C#でゲーム開発を始める初心者向けUnity完全ガイド
はじめに
「csharp game」と検索している方の多くは、C#を使ってゲームを作る方法や、Unityでゲーム開発を始める手順を知りたいのではないでしょうか。
C#は、変数や条件分岐といった基本文法が比較的わかりやすく、ゲーム開発だけでなく、業務システムやWebアプリなど幅広い分野で使われているプログラミング言語です。特にゲームエンジンのUnityでは、キャラクターの移動、敵の制御、当たり判定、スコア管理などをC#スクリプトで実装できます。
この記事では、C#やUnityに触れたことがない初心者に向けて、開発環境の準備、C#の基本文法、Unityでのスクリプト作成、簡単なゲームを完成させる流れまで順番に解説します。
1. csharp gameとは?C#でゲーム開発を始める前に知っておきたい基礎
1-1. 「csharp game」と検索する人が知りたいこと
「csharp game」という検索キーワードには、次のような目的が含まれています。
C#だけでゲームを作れるのか知りたい
UnityとC#の関係を理解したい
初心者向けのゲーム制作方法を探している
C#で2Dゲームや3Dゲームを開発したい
ゲーム開発を通してプログラミングを学びたい
結論からいうと、C#を使えば本格的なゲームを開発できます。ただし、C#のコードだけですべての機能を一から作るよりも、Unityのようなゲームエンジンと組み合わせる方法が一般的です。
Unityには、画面表示、物理演算、サウンド再生、アニメーション、UIなど、ゲームに必要な機能があらかじめ用意されています。開発者はC#を使って、それらの機能を組み合わせながらゲーム独自のルールを実装します。
1-2. C#がゲーム開発で使われる理由
C#がゲーム開発で広く使われている理由の一つは、コードの読みやすさです。
たとえば、プレイヤーの体力を表す変数は次のように書けます。
C#int playerHp = 100;
体力が0以下になったときにゲームオーバーにする処理も、次のように直感的に記述できます。
C#if (playerHp <= 0)
{
Debug.Log("ゲームオーバー");
}
C#には、クラス、継承、インターフェースなど、大規模なゲームのコードを整理するための機能もあります。最初は簡単な文法だけでゲームを作り、慣れてから高度な設計方法を学べる点もメリットです。
また、C#は型を明確に指定する言語なので、コードの間違いをゲーム実行前に発見しやすい特徴があります。Visual Studioなどの開発環境では、入力補完やエラー表示、デバッグも利用できます。
1-3. C#とUnityの関係
Unityは、2D・3Dゲームやインタラクティブコンテンツを制作できるゲームエンジンです。ゲーム内の動作やルールは、主にC#スクリプトを使って実装します。
UnityでC#スクリプトを作成すると、基本的にはMonoBehaviourというクラスを継承したコードが生成されます。MonoBehaviourは、スクリプトをゲームオブジェクトに追加し、StartやUpdateなどのイベント関数を利用するための基盤です。Unity マニュアル
C#using UnityEngine;
public class PlayerController : MonoBehaviour
{
void Start()
{
Debug.Log("ゲーム開始");
}
void Update()
{
Debug.Log("ゲーム実行中");
}
}
Unity Editorではキャラクターや背景を配置し、C#では「キーを押したら移動する」「敵に触れたらダメージを受ける」といった動作を作ります。
つまり、Unityがゲームの土台であり、C#がゲームを動かす命令を記述する言語だと考えるとわかりやすいでしょう。
1-4. C#ゲーム開発で作れるゲームの種類
UnityとC#を組み合わせれば、さまざまなジャンルのゲームを制作できます。
代表的な例として、次のようなゲームがあります。
2Dアクションゲーム
パズルゲーム
シューティングゲーム
RPG
3Dアクションゲーム
レースゲーム
シミュレーションゲーム
スマートフォン向けゲーム
ブラウザ向けゲーム
VR・ARコンテンツ
初心者は、複雑な3Dゲームよりも、2Dの避けゲームやアイテム収集ゲームから始めるのがおすすめです。必要な機能が少ないため、C#のコードとUnityの操作を同時に覚えられます。
2. C#でゲーム開発するならUnityがおすすめな理由
2-1. Unityとは何か
Unityは、ゲームやリアルタイム3Dコンテンツを開発するための統合環境です。
Unity Editorには、ゲーム画面を作るシーン編集機能、オブジェクトの設定画面、アニメーション、物理演算、音声、UI、ビルドなどの機能が含まれています。
Unityは、PC、スマートフォン、Web、XRなど複数のプラットフォームに対応しています。コンソール向けに開発する場合は、各プラットフォームの登録や開発資格など、Unityとは別の条件も必要です。Unity
2-2. Unityが初心者に向いている理由
Unityが初心者に向いている最大の理由は、画面上の操作とプログラミングを組み合わせられることです。
キャラクターや背景は、ファイルをドラッグ&ドロップして配置できます。位置や大きさ、重力、当たり判定なども、Inspectorウィンドウから設定可能です。
すべてをコードで記述する必要がないため、プログラミング経験が少ない人でもゲームの形を作りやすくなっています。
また、Unityには公式ドキュメントや学習コンテンツがあり、書籍、動画、個人ブログなどの情報も豊富です。エラーが発生したときに、似た事例を見つけやすい点も初心者に適しています。
2-3. UnityでC#を使うメリット
UnityでC#を使うと、ゲームオブジェクトごとに役割を分けて処理を作れます。
たとえば、次のような分担が可能です。
PlayerController:プレイヤーの操作EnemyController:敵の移動や攻撃ScoreManager:スコアの計算GameManager:ゲーム開始、クリア、ゲームオーバーの管理ItemController:アイテム取得時の処理
役割ごとにスクリプトを分ければ、問題が起きた場所を探しやすくなります。機能の追加や修正も行いやすくなるため、小規模なゲームからチーム開発まで対応できます。
2-4. Unity以外のC#ゲーム開発環境との違い
C#でゲームを作れる環境はUnityだけではありません。
MonoGameは、C#でゲームの処理を細かく実装したい人に適したフレームワークです。Unityより自由度が高い一方、画面表示やシーン管理などを自分で設計する場面が増えます。
GodotでもC#を利用できますが、プロジェクト構成や対応状況を確認したうえで環境を選ぶ必要があります。
Windows向けの簡単なゲームであれば、WPFやWindows Formsを使う方法もあります。ただし、一般的なゲームエンジンとは設計思想が異なります。
ゲーム開発の経験がなく、まず作品を完成させたい場合は、情報量と機能のバランスがよいUnityから始めるのが現実的です。
3. C#ゲーム開発に必要なものと環境構築
3-1. 必要なパソコンのスペック
Unityを使うには、WindowsまたはmacOSを搭載したパソコンが必要です。
快適さは制作するゲームによって異なりますが、初心者向けの2Dゲームであれば、次の構成を一つの目安にできます。
メモリ:8GB以上、できれば16GB以上
ストレージ:空き容量20GB以上
CPU:比較的新しいCore i5、Ryzen 5、Appleシリコンなど
GPU:2Dゲームでは内蔵GPUでも可能
OS:利用するUnityバージョンが対応しているもの
3Dゲーム、VR、リアルタイムライティングなどを扱う場合は、独立したGPUがあると快適です。
Unity本体に加えて、プロジェクト、素材、キャッシュ、ビルド用モジュールがストレージを使用します。容量に余裕がない場合は、不要なUnity Editorのバージョンやモジュールを削除しましょう。
3-2. Unity Hubのインストール方法
Unity Hubは、Unity Editorのインストール、プロジェクト作成、アカウント、ライセンス、Editorのバージョンをまとめて管理するアプリケーションです。Unity公式も、Unityを導入する主要な方法としてHubを案内しています。Unity マニュアル
基本的な手順は次のとおりです。
Unity公式サイトからUnity Hubをダウンロードする
ダウンロードしたインストーラーを起動する
画面の案内に従ってインストールする
Unity Hubを起動する
Unity IDでログインする
Unity IDを持っていない場合は、アカウントを作成します。メールアドレスやパスワードは、紛失しないように管理してください。
3-3. Unity Editorのインストール方法
Unity Hubをインストールしたら、ゲーム制作に使用するUnity Editorを追加します。
Unity Hubの「Installs」または「インストール」画面から、Editorの追加を選択してください。初心者は、短期間だけ提供される試験版ではなく、安定性を重視したLTS系のバージョンを選ぶと学習しやすくなります。
インストール時には、制作対象に応じてモジュールを選びます。
Windows向けゲームを作る場合はWindows用のビルドサポート、Android向けゲームを作る場合はAndroid Build Supportが必要です。Webブラウザ向けに公開する場合はWebGL Build Supportを追加します。
モジュールは後からUnity Hubで追加できるため、最初からすべてをインストールする必要はありません。
3-4. Visual Studioの設定方法
C#スクリプトの編集には、Visual Studio、Visual Studio Code、JetBrains Riderなどを使用できます。
WindowsにUnity Editorを新規インストールする場合、Visual Studio Communityとデバッグに必要な機能を導入できる構成が用意されています。Unity マニュアル
Visual Studioを使用する場合は、インストール時に「Unityによるゲーム開発」に相当するワークロードを選択します。
Unity側では、次の手順でコードエディターを確認できます。
Unity Editorの設定画面を開く
External Toolsを選択する
External Script Editorを確認する
Visual Studioを指定する
UnityのProjectウィンドウでC#スクリプトをダブルクリックし、Visual Studioが起動すれば基本設定は完了です。
3-5. 初心者がつまずきやすい環境構築の注意点
環境構築では、Editorのバージョンとプロジェクトの対応関係に注意してください。
古い教材と新しいUnityでは、ボタンの名前や画面構成、利用するパッケージが異なることがあります。教材と完全に同じ画面にならなくても、すぐにインストールをやり直す必要はありません。
また、プロジェクトの保存場所には、日本語、特殊記号、極端に長いパスをなるべく使わないほうが安全です。
たとえば、次のような短いフォルダーを用意すると管理しやすくなります。
C:\UnityProjects\FirstGame
Unity Editorを複数同時に起動したり、プロジェクトの読み込み中に強制終了したりすることも避けましょう。
4. UnityでC#ゲームを作る基本の流れ
4-1. Unityプロジェクトの作成
Unity Hubを起動し、「New project」から新しいプロジェクトを作成します。
2Dゲームを作る場合は2D向けテンプレート、3Dゲームを作る場合は3D向けテンプレートを選択します。
プロジェクト名は、半角英数字を使ったわかりやすい名前がおすすめです。
FirstCSharpGame
保存先を指定してプロジェクトを作成すると、Unity Editorが起動します。初回起動では、パッケージの読み込みに時間がかかる場合があります。
4-2. シーン・ゲームオブジェクト・コンポーネントの基本
Unityを理解するうえで重要なのが、シーン、ゲームオブジェクト、コンポーネントです。
シーンは、ゲームのステージや画面に相当します。タイトル画面、ゲーム画面、結果画面を別々のシーンとして作ることもできます。
ゲームオブジェクトは、シーン内に配置される要素です。プレイヤー、敵、カメラ、背景、ライトなどが該当します。
コンポーネントは、ゲームオブジェクトに機能を追加する部品です。
たとえば、プレイヤーには次のようなコンポーネントを追加します。
Transform:位置、回転、大きさ
Sprite Renderer:2D画像の表示
Rigidbody2D:2D物理演算
Collider2D:2Dの当たり判定
C#スクリプト:独自の移動やゲーム処理
ゲームオブジェクトに必要なコンポーネントを組み合わせることが、Unity開発の基本です。
4-3. C#スクリプトの作成とアタッチ
ProjectウィンドウのAssets内で右クリックし、C#スクリプトを作成します。ファイル名をPlayerControllerにした場合、クラス名も同じ名前にします。
C#using UnityEngine;
public class PlayerController : MonoBehaviour
{
void Start()
{
Debug.Log("PlayerControllerが開始されました");
}
}
コードを保存したらUnity Editorに戻ります。コンパイルが終わった後、スクリプトをHierarchy内のプレイヤーへドラッグ&ドロップします。
この操作を「スクリプトをアタッチする」と呼びます。
スクリプトファイル名とクラス名が一致していない場合、コンポーネントとして正常に追加できないため注意してください。
4-4. ゲームを実行して動作確認する方法
Unity Editor上部の再生ボタンを押すと、ゲームを実行できます。
実行中はGameウィンドウで動作を確認し、Consoleウィンドウでログやエラーを確認します。
C#Debug.Log("確認用メッセージ");
実行中にInspectorの数値を変更すると、その場で結果を試せます。ただし、通常は再生を停止すると実行中の変更が元に戻ります。
設定を残したい場合は、再生を停止してから変更してください。
4-5. ビルドしてゲームとして書き出す方法
ゲームが完成したら、Unity Editor以外でも起動できるようにビルドします。
現在のUnityでは、FileメニューのBuild Profilesから、対象プラットフォームや開発用・リリース用の設定を管理できます。Unity マニュアル
基本的な流れは次のとおりです。
ビルド設定画面を開く
使用するシーンを登録する
Windows、macOS、WebGL、Androidなどのプラットフォームを選ぶ
必要に応じてプラットフォームを切り替える
Buildを実行する
保存先を指定する
ビルドに必要なモジュールが入っていない場合は、Unity Hubから追加します。
5. 初心者が最初に覚えるべきC#の基本文法
5-1. 変数とデータ型
変数は、ゲームで使う値を保存する箱です。
C#int score = 0;
float speed = 5.0f;
string playerName = "Player";
bool isGameOver = false;
intは整数、floatは小数、stringは文字列、boolは真偽値を扱います。
Unityでは、Vector2やVector3もよく使います。
C#Vector2 moveDirection = new Vector2(1.0f, 0.0f);
Vector3 playerPosition = new Vector3(0.0f, 1.0f, 0.0f);
Vector2は主に2Dの方向や座標、Vector3は3Dの座標や方向を表します。
5-2. if文による条件分岐
if文は、条件によって処理を変えるために使います。
C#if (score >= 100)
{
Debug.Log("ゲームクリア");
}
else
{
Debug.Log("ゲーム続行");
}
プレイヤーの体力、残り時間、アイテムの取得数などを判定するときに使用します。
複数の条件を組み合わせることも可能です。
C#if (playerHp > 0 && timeRemaining > 0)
{
Debug.Log("プレイ可能");
}
&&は「両方の条件を満たす」、||は「どちらかの条件を満たす」という意味です。
5-3. for文・while文による繰り返し
for文は、決まった回数だけ処理を繰り返す場合に使います。
C#for (int i = 0; i < 5; i++)
{
Debug.Log(i);
}
敵を5体生成する、配列の要素を順番に確認するといった処理に利用できます。
while文は、条件を満たしている間、処理を繰り返します。
C#int count = 0;
while (count < 3)
{
Debug.Log(count);
count++;
}
条件が永遠にtrueのままだと処理が終わらないため、while文では条件を変化させる処理が必要です。
5-4. メソッドの作り方
メソッドは、複数の処理をまとめて名前を付けたものです。
C#void AddScore()
{
score += 10;
}
作成したメソッドは、名前を記述して呼び出します。
C#AddScore();
引数を使えば、外部から値を渡せます。
C#void AddScore(int point)
{
score += point;
}
C#AddScore(50);
戻り値を返すメソッドも作成できます。
C#int GetTotalScore(int baseScore, int bonus)
{
return baseScore + bonus;
}
5-5. クラスとオブジェクトの考え方
クラスは、データと処理をまとめた設計図です。
C#public class Character
{
public string characterName;
public int hp;
public void TakeDamage(int damage)
{
hp -= damage;
}
}
このクラスから作られた実体がオブジェクトです。
C#Character player = new Character();
player.characterName = "Hero";
player.hp = 100;
player.TakeDamage(20);
Unityでは、ゲームオブジェクトに追加したコンポーネントもオブジェクトとして扱います。クラスとオブジェクトの考え方を理解すると、プレイヤー、敵、アイテムなどを整理して設計できるようになります。
5-6. Unityでよく使うStart関数とUpdate関数
Startは、スクリプトが有効になり、最初のUpdateが実行される前に一度呼ばれます。初期値の設定やコンポーネントの取得に向いています。Unity マニュアル
C#void Start()
{
score = 0;
}
Updateは、有効なMonoBehaviourに対して基本的に毎フレーム呼ばれます。入力の確認や、毎フレーム変化させたい処理に使います。Unity マニュアル
C#void Update()
{
Debug.Log("毎フレーム実行");
}
物理演算を利用した移動には、一定間隔で呼ばれるFixedUpdateを使用することがあります。
6. Unityで使うC#スクリプトの基本
6-1. プレイヤーを移動させる方法
2Dゲームでプレイヤーを移動させる基本コードは次のとおりです。
C#using UnityEngine;
public class PlayerController : MonoBehaviour
{
[SerializeField] private float moveSpeed = 5.0f;
private Rigidbody2D rb;
private Vector2 moveInput;
void Start()
{
rb = GetComponent<Rigidbody2D>();
}
void Update()
{
float horizontal = Input.GetAxisRaw("Horizontal");
float vertical = Input.GetAxisRaw("Vertical");
moveInput = new Vector2(horizontal, vertical).normalized;
}
void FixedUpdate()
{
rb.linearVelocity = moveInput * moveSpeed;
}
}
プレイヤーにはRigidbody2Dを追加しておきます。
normalizedを使うのは、斜め移動だけ速度が速くなることを防ぐためです。moveSpeedにはSerializeFieldを付けているので、Inspectorから値を調整できます。
使用するUnityの設定やテンプレートによっては、従来のInput Managerではなく、新しいInput Systemを使用する構成になっています。入力関連のエラーが出る場合は、プロジェクトの入力設定を確認してください。
6-2. キー入力を取得する方法
特定のキーが押された瞬間を調べるには、Input.GetKeyDownを使えます。
C#void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
Debug.Log("スペースキーが押されました");
}
}
押している間を判定する場合はInput.GetKey、キーを離した瞬間を判定する場合はInput.GetKeyUpを使います。
C#if (Input.GetKey(KeyCode.LeftArrow))
{
transform.Translate(Vector3.left * 3.0f * Time.deltaTime);
}
移動量にTime.deltaTimeを掛けることで、フレームレートの違いによる速度差を抑えられます。
6-3. 当たり判定を実装する方法
2Dの物理的な衝突を検出する場合は、OnCollisionEnter2Dを使用します。
C#void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.CompareTag("Enemy"))
{
Debug.Log("敵に当たりました");
}
}
通り抜け可能な判定エリアを作る場合は、Collider2DのIs Triggerを有効にし、OnTriggerEnter2Dを使用します。
C#void OnTriggerEnter2D(Collider2D other)
{
if (other.CompareTag("Item"))
{
Debug.Log("アイテムを取得しました");
Destroy(other.gameObject);
}
}
判定にはオブジェクト名よりもTagを使うと、名前を変更したときの影響を減らせます。
6-4. スコアを管理する方法
小規模なゲームでは、GameManagerにスコアを管理させるとわかりやすくなります。
C#using UnityEngine;
public class GameManager : MonoBehaviour
{
public int Score { get; private set; }
public void AddScore(int point)
{
Score += point;
Debug.Log($"現在のスコア:{Score}");
}
}
アイテムを取得したときは、GameManagerのAddScoreを呼び出します。
C#[SerializeField] private GameManager gameManager;
void OnTriggerEnter2D(Collider2D other)
{
if (other.CompareTag("Item"))
{
gameManager.AddScore(10);
Destroy(other.gameObject);
}
}
InspectorでgameManager欄にGameManagerオブジェクトを設定してください。
6-5. UIにテキストを表示する方法
Unityでスコアや残り時間を表示する場合は、CanvasにTextMeshProのテキストを配置します。
C#using TMPro;
using UnityEngine;
public class GameManager : MonoBehaviour
{
[SerializeField] private TextMeshProUGUI scoreText;
private int score;
void Start()
{
UpdateScoreText();
}
public void AddScore(int point)
{
score += point;
UpdateScoreText();
}
private void UpdateScoreText()
{
scoreText.text = $"Score: {score}";
}
}
InspectorでscoreTextに、Canvas内のTextMeshProUGUIオブジェクトを設定します。
参照を設定し忘れるとNullReferenceExceptionが発生するため注意しましょう。
6-6. ゲームクリア・ゲームオーバーを作る方法
ゲームの状態を管理するために、isGameFinishedのような変数を用意します。
C#using UnityEngine;
public class GameManager : MonoBehaviour
{
private bool isGameFinished;
public void GameClear()
{
if (isGameFinished)
{
return;
}
isGameFinished = true;
Debug.Log("ゲームクリア");
Time.timeScale = 0.0f;
}
public void GameOver()
{
if (isGameFinished)
{
return;
}
isGameFinished = true;
Debug.Log("ゲームオーバー");
Time.timeScale = 0.0f;
}
}
Time.timeScaleを0にすると、時間に依存するゲーム内処理を停止できます。
ゲームを再開するときは、次のように1へ戻します。
C#Time.timeScale = 1.0f;
シーンを再読み込みする場合も、事前にTime.timeScaleを戻しておくと安全です。
7. C#で簡単なゲームを作る実践チュートリアル
7-1. 作成するゲームの概要
ここでは、制限時間内にアイテムを集める2Dゲームを作ります。
ゲームのルールは次のとおりです。
プレイヤーを上下左右に操作する
ステージ上のアイテムを取得する
アイテム1個につき10点を加算する
すべてのアイテムを取るとゲームクリア
制限時間が0になるとゲームオーバー
このゲームでは、移動、入力、当たり判定、スコア、UI、ゲーム状態など、C#ゲーム開発の基本を一通り学べます。
7-2. プレイヤーキャラクターを配置する
最初に2Dプロジェクトを作り、プレイヤー用のゲームオブジェクトを配置します。
プレイヤーには、次のコンポーネントを追加してください。
Sprite Renderer
Rigidbody2D
Circle Collider 2DまたはBox Collider 2D
PlayerController
見下ろし型ゲームで重力を使わない場合は、Rigidbody2DのGravity Scaleを0にします。回転させたくない場合は、ConstraintsでZ軸の回転を固定します。
PlayerControllerには、前章で作成した移動コードを設定します。
7-3. 敵や障害物を配置する
ステージの外周には、壁となるオブジェクトを配置します。壁にはBox Collider 2Dを追加します。
アイテム用オブジェクトには、Sprite RendererとCollider2Dを追加し、Is Triggerを有効にしてください。TagにはItemを設定します。
アイテムを複数配置する場合は、一つのアイテムをPrefabにすると効率的です。
Hierarchy内のアイテムをProjectウィンドウへドラッグするとPrefabを作成できます。Prefabを複製すれば、同じ設定を持つアイテムを簡単に増やせます。
7-4. プレイヤー操作をC#で実装する
プレイヤー移動とアイテム取得をまとめた例は次のとおりです。
C#using UnityEngine;
public class PlayerController : MonoBehaviour
{
[SerializeField] private float moveSpeed = 5.0f;
[SerializeField] private GameManager gameManager;
private Rigidbody2D rb;
private Vector2 moveInput;
void Start()
{
rb = GetComponent<Rigidbody2D>();
}
void Update()
{
float horizontal = Input.GetAxisRaw("Horizontal");
float vertical = Input.GetAxisRaw("Vertical");
moveInput = new Vector2(horizontal, vertical).normalized;
}
void FixedUpdate()
{
rb.linearVelocity = moveInput * moveSpeed;
}
void OnTriggerEnter2D(Collider2D other)
{
if (!other.CompareTag("Item"))
{
return;
}
gameManager.CollectItem();
Destroy(other.gameObject);
}
}
GameManagerはInspectorから設定します。設定し忘れを防ぎたい場合は、ゲーム開始時に参照が存在するか確認する方法もあります。
C#void Start()
{
rb = GetComponent<Rigidbody2D>();
if (gameManager == null)
{
Debug.LogError("GameManagerが設定されていません");
}
}
7-5. スコアと制限時間を実装する
スコア、制限時間、ゲームクリア、ゲームオーバーを管理するGameManagerを作成します。
C#using TMPro;
using UnityEngine;
public class GameManager : MonoBehaviour
{
[SerializeField] private TextMeshProUGUI scoreText;
[SerializeField] private TextMeshProUGUI timeText;
[SerializeField] private TextMeshProUGUI resultText;
[SerializeField] private float timeLimit = 30.0f;
[SerializeField] private int totalItemCount = 5;
private int score;
private int collectedItemCount;
private float timeRemaining;
private bool isGameFinished;
void Start()
{
Time.timeScale = 1.0f;
timeRemaining = timeLimit;
resultText.text = string.Empty;
UpdateScoreText();
UpdateTimeText();
}
void Update()
{
if (isGameFinished)
{
return;
}
timeRemaining -= Time.deltaTime;
if (timeRemaining <= 0.0f)
{
timeRemaining = 0.0f;
GameOver();
}
UpdateTimeText();
}
public void CollectItem()
{
if (isGameFinished)
{
return;
}
collectedItemCount++;
score += 10;
UpdateScoreText();
if (collectedItemCount >= totalItemCount)
{
GameClear();
}
}
private void UpdateScoreText()
{
scoreText.text = $"Score: {score}";
}
private void UpdateTimeText()
{
timeText.text = $"Time: {timeRemaining:F1}";
}
private void GameClear()
{
isGameFinished = true;
resultText.text = "GAME CLEAR";
Time.timeScale = 0.0f;
}
private void GameOver()
{
isGameFinished = true;
resultText.text = "GAME OVER";
Time.timeScale = 0.0f;
}
}
Canvasには、スコア、残り時間、結果を表示する3個のTextMeshProUGUIを配置します。それぞれをGameManagerのInspectorへ設定してください。
totalItemCountには、シーンに配置したアイテム数を入力します。
7-6. ゲーム完成後に確認すべきポイント
ゲームが完成したら、成功する操作だけでなく、失敗しそうな操作も試します。
確認したいポイントは次のとおりです。
プレイヤーが画面外へ出ないか
斜め移動だけ速くならないか
アイテム取得時にスコアが1回だけ加算されるか
制限時間がマイナス表示にならないか
すべてのアイテム取得後にゲームクリアになるか
ゲーム終了後にスコアが変化しないか
Consoleに赤いエラーが出ていないか
ビルドしたゲームでも同じように動くか
Unity Editor上で正常に動いても、ビルド後に画面サイズ、入力、ファイルパスなどの違いが出ることがあります。完成したら必ず実際にビルドして確認しましょう。
8. C#ゲーム開発で初心者がよくつまずくポイント
8-1. エラー文の読み方がわからない
エラーが表示されたら、まずConsoleの一番上にある赤いメッセージを確認します。
エラー文には、問題の種類、対象ファイル、行番号などが表示されます。
NullReferenceException
Assets/Scripts/PlayerController.cs:25
この例では、PlayerController.csの25行目付近で、参照されていないオブジェクトを使っている可能性があります。
エラー文をすべて理解する必要はありません。最初は次の順番で確認してください。
一番上の赤いエラーを開く
ファイル名と行番号を見る
直前に変更したコードを確認する
スペル、セミコロン、括弧を確認する
Inspectorの参照設定を確認する
一つの記述ミスから複数のエラーが発生することもあります。最初のエラーを修正すると、残りも消える場合があります。
8-2. スクリプトがUnityで反映されない
コードを変更してもUnityに反映されない場合は、まずファイルを保存したか確認します。
次に、Consoleにコンパイルエラーが出ていないか確認してください。プロジェクト内のどこか一つにC#のコンパイルエラーがあると、他のスクリプトの変更も正常に反映されないことがあります。
スクリプトファイル名とクラス名が一致していることも重要です。
C#// ファイル名:PlayerController.cs
public class PlayerController : MonoBehaviour
{
}
また、編集したスクリプトが目的のゲームオブジェクトにアタッチされているか確認しましょう。
8-3. オブジェクト参照エラーが出る
NullReferenceExceptionは、取得または設定されていない参照を使用したときに発生する代表的なエラーです。
次のコードでは、InspectorでscoreTextを設定しなければエラーになります。
C#[SerializeField] private TextMeshProUGUI scoreText;
void Start()
{
scoreText.text = "Score: 0";
}
対策は、Inspectorのフィールドに対象オブジェクトを設定することです。
GetComponentを使っている場合は、必要なコンポーネントが同じゲームオブジェクトに存在するか確認します。
C#private Rigidbody2D rb;
void Start()
{
rb = GetComponent<Rigidbody2D>();
if (rb == null)
{
Debug.LogError("Rigidbody2Dがありません");
}
}
8-4. 動きが重い・カクつく
動作が重い場合は、Update内で負荷の高い処理を毎フレーム実行していないか確認します。
たとえば、オブジェクトの検索、頻繁な生成と削除、大量のログ出力などは負荷の原因になります。
C#void Update()
{
GameObject player = GameObject.Find("Player");
}
毎フレーム検索するのではなく、Startなどで一度だけ取得して保存します。
C#private GameObject player;
void Start()
{
player = GameObject.Find("Player");
}
原因がわからない場合はUnity Profilerを使い、CPU、メモリ、描画など、どこに時間がかかっているか調べます。
8-5. コードが複雑になって管理できない
一つのスクリプトにすべての処理を書くと、ゲームが大きくなるにつれて修正が難しくなります。
プレイヤーの移動、スコア、敵の生成、UI、シーン切り替えを一つのクラスへ詰め込まないようにしましょう。
基本的には、役割ごとにスクリプトを分けます。
PlayerController.cs
EnemyController.cs
ItemController.cs
ScoreManager.cs
GameManager.cs
SceneLoader.cs
同じ処理を何度も書いている場合は、メソッドにまとめます。数値をコード内へ直接書く代わりに、変数や定数として名前を付けることも重要です。
C#private const int ItemScore = 10;
名前から目的がわかるコードを意識すると、後から見直したときに理解しやすくなります。
9. C#ゲーム開発を効率よく学ぶ方法
9-1. まず作るべき初心者向けゲーム
最初の作品には、ルールが単純で完成条件が明確なゲームを選びましょう。
おすすめは、次のような小規模ゲームです。
アイテム収集ゲーム
障害物を避けるゲーム
クリックゲーム
ブロック崩し
1画面のシューティングゲーム
簡単な迷路ゲーム
最初からオンラインRPGや広大な3Dゲームを作ろうとすると、通信、データ保存、AI、アニメーション、UIなど、必要な技術が急激に増えます。
まずは「移動できる」「勝敗が決まる」「最初から最後まで遊べる」という小さな完成を目指してください。
9-2. C#文法とUnity操作はどちらを先に学ぶべきか
C#文法をすべて覚えてからUnityを始める必要はありません。
最初に、変数、if文、メソッド、クラスの基本だけを学び、その後はUnityでゲームを作りながら必要な文法を追加していく方法がおすすめです。
学習の順番は、次のようにすると進めやすくなります。
Unity Editorの基本操作を覚える
C#の変数とif文を学ぶ
プレイヤーを移動させる
当たり判定を作る
スコアとUIを実装する
メソッドやクラスでコードを整理する
配列、リスト、継承などを学ぶ
文法だけを長期間学ぶよりも、コードがゲーム内でどのように動くかを確認したほうが理解しやすくなります。
9-3. 公式ドキュメント・学習サイト・動画教材の活用方法
学習教材には、それぞれ異なる役割があります。
動画教材は、Unity Editorの操作手順を目で確認するのに適しています。書籍や記事は、コードを自分のペースで読み返すのに便利です。
公式ドキュメントは、メソッドやコンポーネントの正確な仕様を確認するときに役立ちます。
たとえば、わからないメソッドが出てきたら、次の点を確認します。
何をするメソッドなのか
どのクラスに属しているか
引数には何を渡すのか
戻り値は何か
どのタイミングで呼ぶのか
教材のコードをそのまま写すだけでなく、速度、スコア、制限時間などの値を変更し、動作がどう変わるか試すことが大切です。
9-4. ポートフォリオとしてゲームを公開する方法
完成したゲームは、ポートフォリオとして公開できます。
PC向けゲームは、実行ファイルを配布できるサービスを利用する方法があります。WebGLでビルドすれば、対応するWebブラウザ上で遊べる形式として公開できます。
UnityのWebGLビルドは、Web技術を利用してブラウザ向けコンテンツを出力する仕組みです。Unity マニュアル
公開ページには、次の情報を記載すると作品の意図が伝わりやすくなります。
ゲームの概要
操作方法
制作期間
使用した技術
自分が担当した部分
工夫した点
苦労した点と解決方法
プレイ動画やスクリーンショット
ソースコードの公開先
就職用のポートフォリオでは、ゲームの規模だけでなく、最後まで完成させて説明できることも重要です。
9-5. 挫折しない学習ロードマップ
C#ゲーム開発は、段階を分けて学ぶと継続しやすくなります。
最初の段階では、Unityの画面構成とC#の基本文法を学びます。次に、移動、入力、当たり判定、UIを使ったミニゲームを作ります。
1作品目が完成したら、効果音、アニメーション、複数シーン、セーブ機能などを一つずつ追加してください。
学習中にエラーが出ることは失敗ではありません。エラーの原因を確認し、修正する作業そのものがゲーム開発の重要な練習です。
毎回新しいゲームを作る必要もありません。一度完成した作品を改善し、タイトル画面や難易度設定を追加するだけでも多くのことを学べます。
10. C#ゲーム開発に関するよくある質問
10-1. C#初心者でもUnityでゲームは作れる?
C#初心者でもUnityでゲームを作れます。
最初から複雑な文法をすべて理解する必要はありません。変数、if文、メソッド、Start、Updateなどを覚えれば、キャラクターを動かす簡単なゲームを制作できます。
ただし、教材のコードをコピーするだけでは応用力が身につきにくいため、数値や条件を変えて結果を確認しましょう。
10-2. C#とC++はどちらがゲーム開発に向いている?
どちらもゲーム開発に利用されていますが、使われる環境や目的が異なります。
C#はUnityとの組み合わせで使いやすく、文法も比較的読みやすいため、初心者がゲーム制作を始める場合に向いています。
C++は、高度なパフォーマンス制御やゲームエンジン内部の開発、大規模なタイトルなどで利用されます。一方で、メモリ管理を含む学習項目が多く、初心者には難しく感じられることがあります。
Unityでゲームを作りたいのであれば、まずC#を選ぶのが自然です。
10-3. Unityは無料で使える?
Unityには無料で利用できるUnity Personalがあります。
2026年時点の公式案内では、Unity Personalは過去12か月の収益および調達資金が20万米ドル未満の個人や小規模組織を対象としています。利用条件は変更される可能性があるため、公開や収益化を始める前に最新のライセンス条件を確認してください。Unity+1
学習や個人制作を始める段階では、通常はUnity Personalから検討できます。
10-4. スマホゲームやWebゲームも作れる?
UnityとC#を使って、AndroidやiOS向けのスマートフォンゲームを制作できます。WebGLを利用すれば、Webブラウザで動作するゲームも開発できます。
ただし、プラットフォームごとにビルド用モジュール、開発者登録、署名、ストア審査などが必要になる場合があります。
スマートフォン向けでは、タッチ操作、画面サイズ、端末性能、バッテリー消費も考慮する必要があります。
10-5. C#ゲーム開発で就職・副業は目指せる?
C#とUnityのスキルを身につければ、ゲーム会社、アプリ開発会社、XR関連企業、シミュレーション開発などへの就職を目指せます。
副業や受託開発では、ミニゲーム、展示コンテンツ、教育用アプリ、プロトタイプ制作などの案件が考えられます。
ただし、C#の文法を知っているだけでは十分ではありません。作品を完成させる力、Gitなどのバージョン管理、デバッグ、設計、チームでのコミュニケーションも求められます。
まずは小規模でも完成度の高いゲームを作り、ソースコード、プレイ動画、制作過程を整理して公開することが第一歩です。
まとめ
「csharp game」というテーマでゲーム開発を始めるなら、C#とUnityを組み合わせる方法がおすすめです。
Unityには、2D・3D表示、物理演算、アニメーション、UI、サウンド、ビルドなどの機能が用意されています。C#では、プレイヤー操作、敵の動作、当たり判定、スコア、ゲームクリアといった独自のルールを実装します。
初心者は、すべてのC#文法を覚えてからゲームを作ろうとする必要はありません。変数、if文、メソッド、クラス、Start、Updateなどを学びながら、アイテム収集ゲームや避けゲームを完成させてみましょう。
小さなゲームを一つ完成させたら、効果音、アニメーション、複数シーン、セーブ機能などを追加していきます。制作と改善を繰り返すことが、C#ゲーム開発を身につける最も確実な方法です。

