【Unity】コンパイルエラーの直し方|よく出る6つとセーフモードの使い方

再生ボタンを押したのにゲームが始まらず、画面の下に「All compiler errors have to be fixed before you can enter playmode!」と出る。Unityを始めたばかりの人が、ほぼ必ず一度は出会う場面です。

これはスクリプトのどこかにC#として読めない書き間違いがあり、Unityがコードを組み立て(コンパイル)できていないという合図です。この記事を読むと、Consoleでエラーの場所を突き止める手順、よく出るエラー番号6つの直し方、起動時に出る「Enter Safe Mode?」の扱い方まで、一通り自分で対処できるようになります。

画面のメニュー名は、2026年10月時点のUnity 6.3 LTSのマニュアルに合わせています。Unity 6系なら、ほかのバージョンでもほぼ同じ手順で進められます。

スポンサーリンク

Unityのコンパイルエラーとは?Playできない理由

Unityでは、C#のスクリプトを保存するたびに、裏でコンパイルが走ります。人間が書いたコードを、Unityが実行できる形に変換する作業ですね。

このとき1か所でも文法の間違いや、存在しない名前の呼び出しがあると、変換そのものが止まります。1ファイルだけの問題でも、プロジェクト全体のスクリプトが「古いまま」扱いになるので、Playモードに入れません。冒頭の英語のメッセージは「コンパイルエラーを全部直してからでないと再生できませんよ」という意味です。

似た言葉に「実行時エラー」があります。こちらは再生中に起きるもので、代表は NullReferenceException です。再生はできるけれど途中で赤いエラーが出る、というのが実行時エラー。そもそも再生できないのがコンパイルエラー。この違いを押さえておくと、検索するときの言葉選びで迷わなくなります。

コンパイルエラーが1つでも残っていると、Playもビルドもできません。逆に言えば、Consoleの赤いエラーを上から順に消していけば、必ず元に戻ります。

コンパイルエラーはどこ?Consoleで場所を確かめる

エラーの中身は、Consoleウィンドウにすべて出ています。開き方はメニューの Window > General > Console。Windowsなら Ctrl + Shift + C でも開きます。

Consoleの右上には、白(ログ)・黄色(警告)・赤(エラー)の3つのボタンと、それぞれの件数が並んでいます。コンパイルエラーは赤です。黄色の警告はPlayを止めないので、まずは赤だけを見れば十分です。

エラー文の読み方

たとえば、こんな1行が出ていたとします。

Assets/Scripts/PlayerMove.cs(14,31): error CS1002: ; expected

区切りごとに意味があります。

  • Assets/Scripts/PlayerMove.cs:問題のあるファイル
  • (14,31):14行目の31文字目あたり
  • CS1002:エラーの種類を表す番号
  • ; expected:「セミコロンがあるはずなのに無い」という説明

この行をダブルクリックすると、Visual StudioやVS Codeなどのエディタが開き、該当の行にカーソルが飛びます。いきなり英文を読み込まなくても、まず飛んでみて、その行の前後を眺めるのが近道です。

エラーは上から1つずつ直す

赤いエラーが20件、30件と並ぶと焦りますよね。でも、その多くは1つ目の間違いに引きずられて出ている「巻き添え」であることが多いです。カッコを1つ閉じ忘れただけで、その下の行が全部おかしく見える、というのはよくある話。

なので、直すのは一番上のエラーから。1つ直したら保存して、Unityに戻ってコンパイルが終わるのを待ちます。件数がまとめて減ることも珍しくありません。

もう1つ覚えておきたいのは、ConsoleのClearボタンを押してもコンパイルエラーは消えないという点です。マニュアルにも、Clearはコンパイルエラーを残すと書かれています。消えないのは故障ではなく、まだ直っていないからなんです。

よく出るコンパイルエラー6つと直し方

ここからは、初心者のうちに出会いやすいエラー番号を6つ取り上げます。英語のメッセージはUnityのConsoleにそのまま出る文面です。番号で検索すると、Microsoftの公式リファレンスにも日本語の説明があります。

CS1002「; expected」:セミコロンの付け忘れ

C#では、文の終わりに「;」が必要です。いちばん多いのがこれ。

// エラーになる例
float speed = 5f
transform.Translate(0, 0, speed * Time.deltaTime);

// 直した例(1行目の最後に ; を付けた)
float speed = 5f;
transform.Translate(0, 0, speed * Time.deltaTime);

少し注意したいのは、エラーの行番号が「付け忘れた行の次の行」を指すことがある点です。表示された行に問題が見当たらなければ、1行上を見てください。

CS1513「} expected」:カッコの閉じ忘れ

「}」が足りないときに出ます。ifやforを書き足したあと、閉じカッコを入れ忘れたケースがほとんどです。エラーの位置はファイルの最後を指すことが多く、どこで閉じ忘れたかは教えてくれません。

探すときは、エディタで「{」にカーソルを置いてみてください。対応する「}」がハイライトされるので、組がずれている所が見つかります。Visual Studioなら、メニューの「編集 > 詳細 > ドキュメントのフォーマット」で字下げを整えると、ずれた所がはっきり見えます。

CS0103「The name ‘xxx’ does not exist in the current context」:名前が見つからない

使おうとした変数やメソッドの名前が、その場所から見えないときのエラーです。原因はおおむね2つ。

1つは単純なスペルミスや、大文字・小文字の違いです。C#は speed と Speed を別物として扱います。もう1つは、変数を宣言した場所の問題。Start() の中で宣言した変数は、Update() からは見えません。

// エラーになる例
void Start()
{
    int score = 0;   // Start の中だけで使える変数
}
void Update()
{
    score++;         // CS0103:ここからは score が見えない
}

// 直した例:クラスの中(メソッドの外)で宣言する
int score = 0;
void Start() { }
void Update()
{
    score++;
}

CS0246「The type or namespace name ‘xxx’ could not be found」:型が見つからない

TextMeshProUGUI や List など、ほかの名前空間にある型を使うときに、ファイルの先頭の using を書き忘れると出ます。

using UnityEngine;
using TMPro;                      // TextMeshPro の型を使うなら必要
using System.Collections.Generic; // List<T> を使うなら必要

public class ScoreText : MonoBehaviour
{
    public TextMeshProUGUI label;
    List<int> history = new List<int>();
}

using を書いても消えない場合は、そのパッケージ自体がプロジェクトに入っていない可能性があります。たとえば新しいInput Systemの using UnityEngine.InputSystem; は、Package ManagerでInput Systemを入れていないと「CS0234: The type or namespace name ‘InputSystem’ does not exist in the namespace ‘UnityEngine’」になります。Window > Package Manager で、使いたいパッケージが入っているか確かめてみてください。

CS1061「’xxx’ does not contain a definition for ‘yyy’」:そのメソッドは無い

型そのものは見つかったけれど、その型に指定したメソッドやプロパティが存在しない、というエラーです。

Rigidbody rb = GetComponent<Rigidbody>();
rb.AddForse(Vector3.up * 5f);   // CS1061:AddForce のつづり間違い
rb.AddForce(Vector3.up * 5f);   // 正しい書き方

つづり間違いのほかに、古い記事や動画のコードを写したときにも起きます。Unityのバージョンが上がって、名前が変わったり無くなったりしたAPIがあるためです。写したコードでこのエラーが出たら、Unityのスクリプトリファレンスで今の名前を確認するのが確実ですね。

CS0101「The namespace ‘<global namespace>’ already contains a definition for ‘xxx’」:同じ名前のクラスが2つある

同じクラス名のスクリプトが、プロジェクト内に2つあるときに出ます。スクリプトをコピーして名前を変えたつもりが、中身の public class の名前はそのままだった、というのが典型です。アセットのサンプルに入っている PlayerController と、自分の PlayerController がぶつかることもあります。

直し方は、片方のクラス名を変えること。MonoBehaviourを継承したクラスは、ファイル名とクラス名を同じにしておく決まりがあるので、ファイル名も一緒に変えます。アセット側と衝突した場合は、使っていないサンプルフォルダを消すか、自分のコードを namespace で囲むと解決します。

アセットを入れた直後のコンパイルエラー

自分では何も書いていないのに、アセットをインポートした途端に赤いエラーが並ぶことがあります。Consoleのファイルパスを見て、エラーがアセットのフォルダの中を指していたら、原因は自分のコードではありません。

よくあるのは、次の3つです。

  • アセットが今のUnityのバージョンに対応していない
  • アセットが必要とするパッケージ(Input System、TextMeshPro、URPなど)が入っていない
  • デモ用のサンプルスクリプトが、ほかのアセットや自分のクラスと名前で衝突している

2つ目なら、アセットの説明ページやReadmeに書かれた依存パッケージを入れれば直ります。1つ目は、ストアのページで対応バージョンを確認し、アセット側の更新を待つか、対応しているUnityのバージョンでプロジェクトを開くことになります。インポート前に確認しておくべき項目は、別の記事でまとめています。

Assetsフォルダの中のスクリプトを手当たり次第に消すのは避けてください。Unity 6に対応したアセットを選んでおけば、この種のエラーはかなり減らせます。

対応バージョンがはっきりしていて、更新の続いている定番アセットを探すなら、人気のものを集めた一覧も参考になると思います。

起動時の「Enter Safe Mode?」セーフモードの使い方

コンパイルエラーが残ったままプロジェクトを開くと、「Enter Safe Mode?」というダイアログが出ます。ボタンは3つです。

  • Enter Safe Mode:エラーを直すための最小限のエディタで開く
  • Ignore:エラーを無視して、壊れた状態のまま開く
  • Quit:Unityを閉じる

公式マニュアルでは、たいていの場合は Enter Safe Mode を選ぶように勧めています。セーフモードでは、スクリプトに関係するファイルだけが読み込まれ、モデルやテクスチャ、プレハブなどは読み込まれません。使えるウィンドウもConsole・Project・Inspector・Package Managerに限られます。そのぶん、余計な処理が走らずに、エラーの修正だけに集中できるわけです。

セーフモードの中でもConsoleのエラーをダブルクリックすればスクリプトが開きますし、Assetsメニューから「Open C# Project」も使えます。エラーをすべて直すと、Unityが自動でセーフモードを抜けて、プロジェクト全体を読み込み直してくれます。

画面上部のツールバーには「Exit Safe Mode」ボタンもありますが、これはエラーを残したまま抜けるためのもの。マニュアルでも勧められていないので、基本は押さずに直しきるのがいいと思います。

チームで作っていて、エラーの出ているスクリプトが自分の担当でない場合は、Quitで閉じて担当の人に連絡する、というのもマニュアルにある選択肢です。

なお、毎回ダイアログを出さずに自動でセーフモードに入りたい場合は、Edit > Preferences > Asset Pipeline の「Show Enter Safe Mode Dialog」をオフにします。詳しくはUnity公式マニュアルのSafe Modeのページ(英語)に載っています。

エラーが表示されない・消えない時の確認ポイント

「Playできないのに、Consoleに赤いエラーが見当たらない」という相談もよく見かけます。慌てる前に、次の順で確かめてみてください。

まず、Console右上の赤いボタンがオフになっていないか。ここがオフだと、エラーがあっても一覧に出ません。同じく、Consoleの検索欄に文字が残っていると、その文字を含む行しか表示されなくなります。

次に、コンパイルが終わっているか。スクリプトを保存したあと、Unityの画面右下でくるくる回るアイコンが出ている間は、まだ処理中です。外部エディタで保存したのにUnityが反応しないときは、Assets > Refresh(Ctrl + R)で読み込み直せます。

それでも直らない場合、Visual Studio側だけ赤い波線が消えない、逆にUnityだけでエラーが出る、といった食い違いは、エディタ用のプロジェクトファイルが古くなっていることが原因のことがあります。Edit > Preferences > External Tools にある「Regenerate project files」を押してから、Assetsメニューの「Open C# Project」で開き直してみてください。

最後の手段は、Unityの再起動です。Consoleの「⋮」メニューにある「Open Editor Log」でログを開くと、Consoleに出きらなかった情報が残っていることもあります。

コンパイルエラーをいったん無視して進めたい時

「このスクリプトは後で直すから、今はほかの所を確認したい」という場面もありますよね。とはいえ、Unityにはコンパイルエラーを無視してPlayする設定はありません。

現実的なのは、エラーの出ている部分を一時的にコメントアウトすることです。メソッドの中身を /* */ で囲めば、Unityはその部分を読み飛ばしてくれます。使っていないスクリプトなら、プロジェクトの外のフォルダへ移しておくのも手です。ただ、どちらも「直した」わけではないので、メモを残して後で必ず戻しましょう。

起動時のダイアログで Ignore を選ぶ方法もありますが、これはエラーを残したまま開くだけで、Playできないことに変わりはありません。古いプロジェクトから素材だけ取り出したい時など、用途はかなり限られます。

ちなみに、VRChatのワールドやアバターを作っている人は、SDKのアップロード画面でもこのエラーに出会います。Consoleの読み方はまったく同じなので、ここまでの手順でそのまま対処できます。

まとめ:コンパイルエラーの直し方は「Consoleの一番上から」

最後に、流れをおさらいしておきます。

  1. Window > General > Console を開き、赤いエラーを表示する
  2. 一番上のエラーをダブルクリックして、該当の行へ飛ぶ
  3. エラー番号(CS1002、CS0246など)から原因の当たりをつけて直す
  4. 保存して、件数が減ったか確かめる。これを0件になるまで繰り返す
  5. アセットのフォルダを指していたら、対応バージョンと依存パッケージを確認する

最初のうちは英語のエラー文が怖く見えますが、出てくる種類は意外と限られています。同じエラーを2回、3回と直すうちに、番号を見ただけで「ああ、セミコロンか」と分かるようになるはずです。

独学でつまずく所を減らしたいなら、Unity公式の無料教材を順番に進めるのも一つの方法です。

Unity 6でこれから始める人向けの最初の一歩は、Unity 6.x時代に今から始める人がやるべき3ステップにまとめています。また、アセットを買い足す予定があるなら、値引きのタイミングで買うと出費をかなり抑えられます。毎月のUnity Asset Storeのセール情報もあわせてチェックしてみてください。

著者プロフィール
うんくん

IT系に特化した記事がメインです。(Unity多め。)
Udemy講師もやっています。よろしくお願いします。

※Amazonのアソシエイトとして、当メディアは適格販売により収入を得ています。

うんくんをフォローする
unityunity基本操作
スポンサーリンク
シェアする
うんくんをフォローする