はじめに:詰まることは当たり前、大切なのは「対処法を知っているか」
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オブジェクトが見つかりません!");
}
}
スクリプトをアタッチしても動かない
症状: スクリプトを書いてアタッチしたのに、ゲームを実行しても何も起きない
よくある原因と確認ポイント:
- クラス名とファイル名が一致しているか確認
ファイル名:PlayerController.cs クラス名:public class PlayerController(一致している必要あり) - MonoBehaviourを継承しているか確認
public class PlayerController : MonoBehaviour // ← これが必要 - コンパイルエラーがないか確認 ConsoleにError(赤いアイコン)があると、すべてのスクリプトが動かなくなります。
- オブジェクトがActiveになっているか確認 HierarchyでオブジェクトのチェックボックスがONになっているか確認してください。
Update()が呼ばれているか確認したい
void Update()
{
Debug.Log("Updateが呼ばれています"); // ← これで確認
}
Consoleに毎フレームログが出ていればUpdate()は正常に動いています。
カテゴリ②:物理・当たり判定のトラブル
キャラクターがジャンプしない・落ちない
症状: Rigidbody2Dをアタッチしたのに重力が効かない、またはジャンプしない
確認ポイント:
- Rigidbody2DのGravity Scaleを確認 InspectorでRigidbody2DのGravity Scaleが0になっていると重力が効きません。デフォルトは1です。
- Body TypeがKinematicになっていないか確認 Body TypeがKinematicだと物理演算が無効になります。
Dynamicに設定してください。 - AddForceのForceMode確認
// ❌ ジャンプに向かないForceMode rb.AddForce(Vector2.up * jumpForce); // ✅ 瞬間的な力(ジャンプ)にはImpulseを使う rb.AddForce(Vector2.up * jumpForce, ForceMode2D.Impulse);
当たり判定が機能しない
症状: オブジェクト同士が衝突してもOnCollisionEnter2DやOnTriggerEnter2Dが呼ばれない
確認チェックリスト:
□ 両方のオブジェクトに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に何も表示されない
確認ポイント:
- CanvasのRender Modeを確認
Screen Space - Overlay(デフォルト):常に最前面に表示World Space:3D空間内に配置(カメラに映るよう位置調整が必要)
Screen Space - Overlayが最もシンプルです。 - UIオブジェクトのアルファ値を確認 Imageのカラーやテキストのカラーのアルファ(A)値が0になっていると透明になります。
- RectTransformの位置を確認 UIオブジェクトが画面外に配置されていないか、Scene Viewで確認してください。
TextMeshProが文字化けする(日本語が表示されない)
症状: TextMeshProで日本語を設定したのに、□(豆腐)が表示される
解決策:
日本語対応フォントアセットを作成する必要があります。
- 日本語対応フォント(例:Noto Sans JP)をProjectにインポート
- メニューから
Window → TextMeshPro → Font Asset Creatorを開く - Source Font Fileに日本語フォントを設定
- Character Setを
Custom Rangeにし、日本語の文字コード範囲を設定 Generate Font Atlasをクリックしてフォントアセットを生成- TextMeshProのFont AssetにこのアセットをアサインIG
ボタンをクリックしても反応しない
確認ポイント:
- EventSystemがシーンに存在するか確認 CanvasをUI → Canvasから作成した場合は自動で追加されますが、消してしまった場合は再追加が必要です(GameObject → UI → Event System)
- ボタンの上に他のUIが重なっていないか確認 透明なImageなどがボタンの前面にある場合、クリックをブロックします。
- 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ビルドをブラウザで開くと動かない
よくある原因:
- PlayerPrefsが使えない(WebGLでは制限あり) → WebGLでのセーブにはIndexedDBやJavaScriptプラグインが必要です。
- ファイルパスの問題 →
Resources.Load()でのアセット読み込みはWebGLでも動作しますが、絶対パスは使えません。 - HTTPSが必要 → ローカルのHTMLファイルを直接開いてもWebGLは動作しません。itch.ioやGitHub Pagesにアップロードして確認してください。
ゲームが重い・フレームレートが落ちる
確認・対処ポイント:
- 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 = ...; } - Instantiateを毎フレーム呼んでいないか確認 弾やエフェクトを毎フレームInstantiateするのは重い処理です。Object Poolingパターンの活用を検討しましょう。
- Profilerで重い処理を特定する Unity EditorのProfilerウィンドウ(Window → Analysis → Profiler)を使うと、どの処理に時間がかかっているかを確認できます。
それでも解決しないときの調べ方
上記のトラブルシューティングで解決しない場合は、以下のリソースを活用しましょう。
検索するとき
- エラーメッセージをそのままコピーしてGoogle検索する
- 「Unity [エラーメッセージ] 解決」で日本語記事を探す
- 見つからない場合は「Unity [error message] solved」で英語記事も探す
質問するとき
質問の際は以下の情報を含めると回答が早くなります。
1. Unityのバージョン(例:Unity 6.3 LTS)
2. やりたいこと
3. 現在の状態・エラーメッセージ
4. 試したこと
5. 関連するスクリプトのコード
おすすめの質問先:
- teratail:日本語のプログラミングQ&Aサービス
- Unity Forums:公式フォーラム(英語)
- Unityユーザーグループ(X/Twitter):ハッシュタグ「#Unity」で質問
まとめ
今回お伝えしたポイントをおさらいします。
- 詰まったらまず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#プログラミングの基礎を固める
NullReferenceExceptionなどのエラーは、C#の基礎理解があると格段に解決しやすくなります。初心者向けにやさしく解説された一冊です。


コメント