Unity個人ゲーム開発でよくある詰まりポイントと解決策|トラブルシューティング集

初心者向けゲーム開発入門

はじめに:詰まることは当たり前、大切なのは「対処法を知っているか」

Unityでゲームを作っていると、必ず「動かない」「エラーが出る」「思った通りにならない」という場面に遭遇します。

これは初心者だけでなく、プロの開発者でも日常的に起きることです。大切なのは詰まったときに素早く対処できるかどうか。よくあるトラブルとその解決策を事前に知っておくだけで、開発がスムーズに進みます。

この記事では、Unity初心者が特によく詰まるポイントをカテゴリ別に整理し、具体的な解決策を解説します。


詰まったときの基本対処フロー

個別の問題に入る前に、詰まったときの基本的な対処手順を覚えておきましょう。

① エラーメッセージをConsoleで確認する
    ↓
② エラーメッセージをそのままコピーしてGoogle検索する
    ↓
③ Unity公式ドキュメントを確認する
    ↓
④ 30分以上解決しない場合は、teratailやUnityフォーラムで質問する
    ↓
⑤ 一旦別のタスクに移り、後で再挑戦する

最重要ポイントはConsoleのエラーメッセージを読む習慣をつけることです。エラーメッセージには原因と場所が書かれているため、そのままGoogle検索するだけで解決策が見つかることが多いです。


カテゴリ①:スクリプト・C#のトラブル

「NullReferenceException」が出る

症状: Consoleに NullReferenceException: Object reference not set to an instance of an object と表示される

原因: 変数に何も入っていない(nullの)状態でアクセスしようとしている

解決策:

最もよくある原因は、InspectorでのアサインIgnore(設定忘れ)です。

// ❌ よくある書き方(アサイン忘れでエラーになる)
public GameObject player;

void Start()
{
    player.SetActive(false); // playerがnullだとエラー
}
// ✅ 解決策①:Inspectorで必ずアサインする
// (スクリプトをアタッチしたオブジェクトのInspectorで、playerフィールドにオブジェクトをドラッグ&ドロップ)

// ✅ 解決策②:FindやGetComponentで自動取得する
void Start()
{
    player = GameObject.Find("Player");
    if (player == null)
    {
        Debug.LogError("Playerオブジェクトが見つかりません!");
    }
}

スクリプトをアタッチしても動かない

症状: スクリプトを書いてアタッチしたのに、ゲームを実行しても何も起きない

よくある原因と確認ポイント:

  1. クラス名とファイル名が一致しているか確認 ファイル名:PlayerController.cs クラス名:public class PlayerController(一致している必要あり)
  2. MonoBehaviourを継承しているか確認 public class PlayerController : MonoBehaviour // ← これが必要
  3. コンパイルエラーがないか確認 ConsoleにError(赤いアイコン)があると、すべてのスクリプトが動かなくなります。
  4. オブジェクトがActiveになっているか確認 HierarchyでオブジェクトのチェックボックスがONになっているか確認してください。

Update()が呼ばれているか確認したい

void Update()
{
    Debug.Log("Updateが呼ばれています"); // ← これで確認
}

Consoleに毎フレームログが出ていればUpdate()は正常に動いています。


カテゴリ②:物理・当たり判定のトラブル

キャラクターがジャンプしない・落ちない

症状: Rigidbody2Dをアタッチしたのに重力が効かない、またはジャンプしない

確認ポイント:

  1. Rigidbody2DのGravity Scaleを確認 InspectorでRigidbody2DのGravity Scaleが0になっていると重力が効きません。デフォルトは1です。
  2. Body TypeがKinematicになっていないか確認 Body TypeがKinematicだと物理演算が無効になります。Dynamicに設定してください。
  3. AddForceのForceMode確認 // ❌ ジャンプに向かないForceMode rb.AddForce(Vector2.up * jumpForce); // ✅ 瞬間的な力(ジャンプ)にはImpulseを使う rb.AddForce(Vector2.up * jumpForce, ForceMode2D.Impulse);

当たり判定が機能しない

症状: オブジェクト同士が衝突してもOnCollisionEnter2DOnTriggerEnter2Dが呼ばれない

確認チェックリスト:

□ 両方のオブジェクトにCollider2Dがアタッチされているか
□ どちらか一方にRigidbody2Dがアタッチされているか
□ IsTriggerの設定が意図通りか
    - OnCollisionEnter2D → IsTriggerはOFF
    - OnTriggerEnter2D  → IsTriggerはON
□ LayerのCollision Matrixで衝突が有効になっているか
   (Edit → Project Settings → Physics 2D)
□ スクリプトが衝突する側のオブジェクトにアタッチされているか

オブジェクトがすり抜ける

症状: 速度が速いオブジェクト(弾など)が壁をすり抜ける

解決策:

Rigidbody2DのCollision DetectionをContinuousに変更します。

Inspector → Rigidbody2D → Collision Detection → Continuous

または弾の速度を下げるか、当たり判定のサイズを大きくすることで対応できます。


カテゴリ③:UI・Canvasのトラブル

UIのテキストや画像がゲーム画面に表示されない

症状: CanvasにTextやImageを追加したのに、Game Viewに何も表示されない

確認ポイント:

  1. CanvasのRender Modeを確認
    • Screen Space - Overlay(デフォルト):常に最前面に表示
    • World Space:3D空間内に配置(カメラに映るよう位置調整が必要)
    初心者はScreen Space - Overlayが最もシンプルです。
  2. UIオブジェクトのアルファ値を確認 Imageのカラーやテキストのカラーのアルファ(A)値が0になっていると透明になります。
  3. RectTransformの位置を確認 UIオブジェクトが画面外に配置されていないか、Scene Viewで確認してください。

TextMeshProが文字化けする(日本語が表示されない)

症状: TextMeshProで日本語を設定したのに、□(豆腐)が表示される

解決策:

日本語対応フォントアセットを作成する必要があります。

  1. 日本語対応フォント(例:Noto Sans JP)をProjectにインポート
  2. メニューからWindow → TextMeshPro → Font Asset Creatorを開く
  3. Source Font Fileに日本語フォントを設定
  4. Character SetをCustom Rangeにし、日本語の文字コード範囲を設定
  5. Generate Font Atlasをクリックしてフォントアセットを生成
  6. TextMeshProのFont AssetにこのアセットをアサインIG

ボタンをクリックしても反応しない

確認ポイント:

  1. EventSystemがシーンに存在するか確認 CanvasをUI → Canvasから作成した場合は自動で追加されますが、消してしまった場合は再追加が必要です(GameObject → UI → Event System)
  2. ボタンの上に他のUIが重なっていないか確認 透明なImageなどがボタンの前面にある場合、クリックをブロックします。
  3. OnClickイベントにメソッドが正しく登録されているか確認 Inspectorのボタンコンポーネント→On Click()にメソッドがアサインされているか確認してください。

カテゴリ④:シーン管理のトラブル

シーン遷移後にBGMや変数が消える

症状: SceneManager.LoadScene()でシーンを切り替えると、BGMや累積スコアがリセットされる

解決策: DontDestroyOnLoadを使います。

public class GameManager : MonoBehaviour
{
    public static GameManager instance;
    public int totalScore = 0;

    void Awake()
    {
        if (instance == null)
        {
            instance = this;
            DontDestroyOnLoad(gameObject); // シーン遷移後も消えない
        }
        else
        {
            Destroy(gameObject); // 重複を防ぐ
        }
    }
}

このシングルトンパターンを使うと、スコアやBGMManagerなどをシーンをまたいで持続させられます。

シーン遷移が重い・フリーズする

解決策: 非同期ロードを使います。

IEnumerator LoadSceneAsync(string sceneName)
{
    AsyncOperation operation = SceneManager.LoadSceneAsync(sceneName);
    while (!operation.isDone)
    {
        float progress = Mathf.Clamp01(operation.progress / 0.9f);
        // ローディングバーの更新などをここで行う
        yield return null;
    }
}

カテゴリ⑤:ビルド・パフォーマンスのトラブル

WebGLビルドでゲームが動かない

症状: Unity EditorではPLAYできるのに、WebGLビルドをブラウザで開くと動かない

よくある原因:

  1. PlayerPrefsが使えない(WebGLでは制限あり) → WebGLでのセーブにはIndexedDBやJavaScriptプラグインが必要です。
  2. ファイルパスの問題Resources.Load()でのアセット読み込みはWebGLでも動作しますが、絶対パスは使えません。
  3. HTTPSが必要 → ローカルのHTMLファイルを直接開いてもWebGLは動作しません。itch.ioやGitHub Pagesにアップロードして確認してください。

ゲームが重い・フレームレートが落ちる

確認・対処ポイント:

  1. Updateで毎フレームFindを呼んでいないか確認 // ❌ 重い(毎フレーム検索する) void Update() { GameObject.Find("Player").transform.position = ...; } // ✅ 軽い(Start()で1回だけ取得してキャッシュ) private Transform playerTransform; void Start() { playerTransform = GameObject.Find("Player").transform; } void Update() { playerTransform.position = ...; }
  2. Instantiateを毎フレーム呼んでいないか確認 弾やエフェクトを毎フレームInstantiateするのは重い処理です。Object Poolingパターンの活用を検討しましょう。
  3. Profilerで重い処理を特定する Unity EditorのProfilerウィンドウ(Window → Analysis → Profiler)を使うと、どの処理に時間がかかっているかを確認できます。

それでも解決しないときの調べ方

上記のトラブルシューティングで解決しない場合は、以下のリソースを活用しましょう。

検索するとき

  • エラーメッセージをそのままコピーしてGoogle検索する
  • 「Unity [エラーメッセージ] 解決」で日本語記事を探す
  • 見つからない場合は「Unity [error message] solved」で英語記事も探す

質問するとき

質問の際は以下の情報を含めると回答が早くなります。

1. Unityのバージョン(例:Unity 6.3 LTS)
2. やりたいこと
3. 現在の状態・エラーメッセージ
4. 試したこと
5. 関連するスクリプトのコード

おすすめの質問先:


まとめ

今回お伝えしたポイントをおさらいします。

  • 詰まったらまずConsoleのエラーメッセージをコピーしてGoogle検索
  • NullReferenceExceptionはInspectorのアサイン忘れが最多原因
  • 当たり判定は「Collider・Rigidbody・IsTrigger設定・Layer」の4つを確認
  • 日本語テキストはFont Asset Creatorで日本語対応フォントアセットを作成する
  • シーン間でデータを持続させるにはDontDestroyOnLoadを使う
  • WebGLビルドはitch.ioやGitHub Pagesに上げてブラウザで確認する
  • パフォーマンス問題はProfilerで重い処理を特定してから対処する
  • 30分解決しなければteratailやUnityフォーラムで質問する

これで「Unityで実装の進め方」シリーズ3本が完成しました。次は「デバッグ・テストプレイの進め方」について解説します。お楽しみに!


関連商品(PR)

Unity開発のトラブル解決・スキルアップに役立つ書籍をご紹介します。

Unity 6対応・入門の定番書

Unityの教科書 Unity 6完全対応版(Amazon)

よくあるトラブルへの対処法も含め、Unity開発の基礎を日本語でていねいに解説しています。

C#プログラミングの基礎を固める

スラスラ読めるC#ふりがなプログラミング(Amazon)

NullReferenceExceptionなどのエラーは、C#の基礎理解があると格段に解決しやすくなります。初心者向けにやさしく解説された一冊です。


参考にしたサイト

コメント

タイトルとURLをコピーしました