実践ガイド

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

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

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

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

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


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

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

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

最重要ポイントはConsoleのエラーメッセージを読む習慣をつけることです。エラーメッセージやスタックトレースに、調査の手掛かりやコードの位置が含まれる場合があります。内容を確認し、該当箇所や公式資料を手掛かりに調べましょう。


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

「NullReferenceException」が出る

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

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

解決策:

原因の一つは、Inspectorで参照を設定し忘れていることです。どの変数がnullか、エラーの行も確認します。

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

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

// ✅ 解決策②:FindやGetComponentで自動取得する
// GameObject.Findは非アクティブなオブジェクトを見つけられません
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でコンパイルエラーを確認し、修正してください。実行時エラーなど、赤い表示の原因によって影響は異なります。
  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になっていないか確認 Kinematicは重力や力の影響を受けず、スクリプトで制御する用途向けです。重力やAddForceを使いたい場合はDynamicを検討してください。接触の設定はBody Typeによって異なります。
  3. AddForceのForceMode確認 rb.AddForce(Vector2.up * jumpForce, ForceMode2D.Impulse);

当たり判定が機能しない

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

確認チェックリスト:

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

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

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

解決策:

状況に応じてRigidbody2DのCollision DetectionをContinuousに変更し、対象環境で結果を確認します。2D衝突コールバックではBody Typeの組み合わせやFull Kinematic Contactsも確認し、Triggerは別の判定として扱います。

Inspector → Rigidbody2D → Collision Detection → Continuous

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


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

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

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

確認ポイント:

  1. CanvasのRender Modeを確認
    • Screen Space - Overlay:カメラを使わず画面上に描画されます。複数のCanvasが重なる場合は描画順も確認します。
    • 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に設定

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

確認ポイント:

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

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

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

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

解決策: DontDestroyOnLoadを使います。この例のGameManagerはHierarchyのルートに置きます。BGMも維持したい場合は、AudioSourceを永続化するオブジェクトかその子に置いてください。

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の保存を確認 → Web版でもPlayerPrefsを利用でき、ブラウザーのIndexedDBに最大1MB保存されます。ブラウザーの保存設定やデータ消去で失われる場合があるため、対象環境で保存・再読込を試してください。Unity公式リファレンス
  2. ファイルパスの問題 → Resources.Load()でのアセット読み込みはWebGLでも動作しますが、PC上の任意の絶対パスにブラウザからアクセスできる前提にはできません。保存には対象環境で使えるApplication.persistentDataPathなどを確認してください。
  3. 配信方法を確認 → 出力したHTMLをファイルとして直接開く代わりに、UnityのBuild And RunなどローカルWebサーバー経由で試します。公開先でも圧縮ファイルの配信設定などを確認してください。

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

確認・対処ポイント:

  1. Updateで毎フレームFindを呼んでいないか確認 必要な参照を事前にInspectorで設定するか、検索結果を保存して再利用する方法を検討します。検索に失敗する場合の処理も用意し、Profilerで実際の負荷を確かめましょう。
  2. Instantiateを毎フレーム呼んでいないか確認 弾やエフェクトの大量生成が影響する場合があります。Profilerで計測し、必要なら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つを確認
  • 日本語テキストは対応するフォントアセットやフォールバックを設定する
  • シーン間でデータを持続させるにはDontDestroyOnLoadを使う
  • WebGLビルドはitch.ioやGitHub Pagesに上げてブラウザで確認する
  • パフォーマンス問題はProfilerで重い処理を特定してから対処する
  • 30分解決しなければteratailやUnityフォーラムで質問する

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


関連商品(PR)

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

Unity 6対応・入門の定番書

『Unityの教科書 Unity 6完全対応版』:出版社の紹介 / Amazonの商品ページ(書名・版を確認)

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

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

『スラスラ読める Unity C#ふりがなプログラミング』(2019年刊):出版社の紹介 / Amazonの商品ページ(書名・版を確認)

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


参考にしたサイト

← 記事一覧・検索