スポンサーリンク
エラー・トラブルシューティング

Unityでスクリプトを追加できない原因まとめ|MonoBehaviourやコンパイルエラーを確認しよう

エラー・トラブルシューティング

UnityでC#スクリプトを作ったのに、GameObjectへドラッグできなかったり、Inspectorで追加しようとしても弾かれたりすると、かなり焦りますよね。

特に、

  • 「Can’t add script component because the script class cannot be found」
  • 「No MonoBehaviour scripts in the file」

このあたりのエラーは、英語も長くて「結局なにが悪いの…?」となりがちです。

しかも厄介なのが、原因が1つではないこと。

ファイル名とclass名のズレだったり、MonoBehaviourの書き忘れだったり、まったく別のスクリプトのエラーが影響していたり…。初心者のうちは「全部壊れたのでは?」と感じやすいポイントでもあります。

ただ、実際には“確認する順番”さえ分かっていれば、かなり高い確率で短時間で解決できます。

私もUnityを始めた頃、このエラーで30分くらい悩んだあと、「class名の大文字が1文字違っただけだった」という経験があります。ある意味、Unity初心者あるあるです🙂

このページでは、Unityがスクリプトを認識できなくなる代表的な原因を、初心者でも切り分けしやすい順番で整理しています。

「まず何を見るべきか」を順番に確認していけば、原因をかなり絞り込みやすくなります。


Unity script class cannot be foundの結論

このエラーが出た時は、まず次の5つを確認してください。

  1. Consoleに赤いエラーが出ていないか
  2. .csファイル名とclass名が一致しているか
  3. MonoBehaviourを継承しているか
  4. namespaceや波括弧の構造が崩れていないか
  5. UnityとVisual Studioの再読み込みが必要な状態ではないか

特に多いのは、次の2パターンです。

  • Consoleに赤エラーが残っている
  • ファイル名とclass名が違う

まずはここを疑うだけで、かなりの確率で解決できます。

最初に見るべき5つの原因

Unityは、「コンパイルに成功したMonoBehaviourクラス」だけをGameObjectへ追加できます。

つまり、単純にC#ファイルが存在しているだけでは不十分なんですね。

たとえば、こんな状態だとUnityはスクリプトを認識できません。

状態Unity側の認識
Consoleに赤エラーがあるコンパイル停止
ファイル名とclass名が違う別クラス扱い
MonoBehaviourがないComponentとして追加不可
namespace構文が崩れているclass検出失敗
IDE連携が崩れている再読み込み失敗の可能性

逆に言うと、この5つを順番に確認すれば、かなり原因を絞れます。

ここで大事なのは、「重そうな対処から始めない」ことです。

初心者のうちは、

  • Unityを再インストール
  • Reimport All
  • Libraryフォルダ削除

こういった大きな対処を先に試したくなるのですが、多くの場合はそこまで行く前に解決します。

やるべきこと・後回しでよいこと

まず優先して確認したいのは、次の4つです。

  • Consoleの赤エラー
  • ファイル名とclass名
  • MonoBehaviour継承
  • 保存できているか

この4つは、数分で確認できるうえに、発生頻度もかなり高めです。

一方で、次の対処は「最後に試す枠」です。

  • Reimport All
  • .slnや.csproj削除
  • Unity再インストール
  • csc.rsp確認

特にReimport Allは、プロジェクトによってはかなり時間がかかります。

しかも、原因が「class名1文字違い」だった場合、待ち時間だけ増えてしまいます。

なので私は、まず「Console → 名前 → MonoBehaviour」の順番で見ることが多いです。

Unityのこのエラーは、順番に切り分けるだけでかなり楽になりますよ。




Consoleエラーがある時の直し方

「追加したいスクリプトには問題なさそうなのに、なぜかアタッチできない…」

そんな時は、まずConsoleウィンドウを確認してみてください。

実はUnityでは、“別のスクリプトのエラー”が原因で、新しいスクリプトまで認識されなくなることがあります。

別スクリプトのエラーでも追加できない

Unityは、スクリプトを1つずつ個別に読み込んでいるわけではありません。

プロジェクト内のC#コードをまとめてコンパイルしています。

そのため、たとえば追加したいスクリプトが正常でも、別ファイルにエラーがあると、Unity全体のコンパイルが止まることがあります。

こんなケースはかなり多いです。

// 追加したいスクリプト
PlayerMove.cs

public class PlayerMove : MonoBehaviour
{
}

このコード自体は正常でも、別のファイルでこんなミスがあると…。

// Enemy.cs
public class Enemy : MonoBehaviour
{
    void Start()
    {
        Debug.Log("Hello") // ← セミコロン忘れ
    }
}

Unityはコンパイルを完了できず、PlayerMoveも正常なComponentとして扱えなくなります。

初心者のうちは、「今触っているスクリプトだけ見ればいい」と考えやすいのですが、Unityではプロジェクト全体が影響するんですね。

なので、まず最優先で見るべきなのはConsoleです。

Consoleの赤エラーを上から直す

Consoleを開くと、赤いエラーが大量に並んでいることがあります。

この時のポイントは、「最初のエラーから順番に直す」ことです。

後ろに出ているエラーは、最初の1つが原因で連鎖している場合があります。

確認手順はこんな流れです。

  1. Unity上部メニューから「Window → General → Console」を開く
  2. 赤いエラーを確認する
  3. 一番上のエラーをダブルクリックする
  4. Visual StudioやRiderで該当箇所を修正する
  5. 保存してUnityへ戻る

修正後、Unity右下でコンパイルが走ります。

ここで赤エラーが消えれば、スクリプト追加できるようになるケースはかなり多いです。

逆に、赤エラーが残ったままだと、他の確認をしても直らないことがあります。

「まずConsoleを見る」は、Unityトラブル解決の基本習慣としてかなり大事です。




ファイル名とクラス名の直し方

Consoleエラーがない場合、次によくあるのが「ファイル名とclass名の不一致」です。

Unity初心者だと、かなり高い確率で一度は遭遇します。

しかも厄介なのが、“見た目では合っているように見える”ケースがあることです。

.csファイル名とpublic class名を一致させる

Unityでは、GameObjectへ追加するMonoBehaviourスクリプトは、基本的に「ファイル名」と「class名」が一致している必要があります。

たとえば、正常な例はこちらです。

// PlayerMove.cs

using UnityEngine;

public class PlayerMove : MonoBehaviour
{
}

PlayerMove.cspublic class PlayerMove が一致しています。

一方で、次のような状態だとUnityは正しく認識できません。

// PlayerMove.cs

using UnityEngine;

public class PlayerController : MonoBehaviour
{
}

ファイル名は PlayerMove.cs なのに、class名は PlayerController になっています。

この状態だと、Unityは「どのクラスをComponentとして扱えばいいの?」という状態になり、Inspectorへ追加できなくなります。

さらに注意したいのが、大文字・小文字です。

// PlayerMove.cs

public class playermove : MonoBehaviour
{
}

これも一致扱いになりません。

C#は大文字・小文字を区別する言語なので、Unity側でも別名として扱われます。

チェックする時は、次を見てみてください。

  • .csファイル名
  • public class名
  • 大文字・小文字
  • スペースや記号が混ざっていないか

特にコピペ後やリネーム後はズレやすいポイントです。

作成直後のリネームに注意する

Unity初心者でかなり多いのが、「NewBehaviourScript問題」です。

たとえば、こんな流れですね。

  1. 「Create → C# Script」で作成
  2. とりあえず作る
  3. 後から名前だけ変更する

この時、ファイル名だけ変わって、中のclass名が古いまま残ることがあります。

たとえばこんな状態です。

// PlayerMove.cs

using UnityEngine;

public class NewBehaviourScript : MonoBehaviour
{
}

見た目では「PlayerMove」という名前にしたつもりでも、中身はまだNewBehaviourScriptのままなんですね。

これ、Unity初心者あるあるです🙂

私も昔、これで10分くらい「なんで追加できないの!?」となりました。

再発防止としては、次を意識するとかなり減ります。

  • スクリプト作成時に名前を決める
  • リネーム後はclass名も確認する
  • UnityだけでなくIDE側も確認する

「名前が一致しているか」は、数秒で確認できるわりに、かなり重要なポイントです。




MonoBehaviourがない時の直し方

ファイル名とclass名が合っているのに追加できない場合は、MonoBehaviourの継承を確認してみてください。

Unityでは、GameObjectへ追加できるスクリプトに条件があります。

それが、「MonoBehaviourを継承していること」です。

GameObjectに追加するにはMonoBehaviourが必要

たとえば、正常なスクリプトはこんな形です。

using UnityEngine;

public class PlayerMove : MonoBehaviour
{
}

: MonoBehaviour が付いていますよね。

Unityは、この継承を見て「これはComponentとして追加できるスクリプトだ」と判断しています。

逆に、次のようなコードはGameObjectへ追加できません。

public class PlayerMove
{
}

普通のC#クラスとしては成立しています。

ただし、UnityのComponentではないため、Inspectorへ追加候補として表示されません。

さらに、using UnityEngine; が抜けているケースにも注意です。

public class PlayerMove : MonoBehaviour
{
}

この状態だと、MonoBehaviour自体を認識できず、Consoleエラーになることがあります。

チェックする時は、次を確認してみてください。

  • : MonoBehaviour が付いているか
  • using UnityEngine; があるか
  • classがpublicになっているか

特にChatGPTやサンプルコードをコピペした時は、「普通のC#クラス」が混ざっていることもあります。

「コードは書けているのに追加できない」という時は、この継承をかなり疑って大丈夫です。

MonoBehaviourが不要なクラスもある

ここで少しややこしいのが、「すべてのC#クラスにMonoBehaviourが必要なわけではない」という点です。

Unityでは、用途によってクラスを使い分けます。

種類GameObjectへ追加主な用途
MonoBehaviour継承クラスできるプレイヤー操作・UI・敵AIなど
通常のC#クラスできない計算処理・データ整理など
ScriptableObject直接は追加しない設定値・データ管理

つまり、「追加できない=コードが壊れている」とは限らないんですね。

たとえば、ダメージ計算専用クラスやセーブデータ整理クラスは、GameObjectへ追加できなくて正常です。

逆に、プレイヤー移動スクリプトなのに追加できない場合は、MonoBehaviour周辺を疑う価値があります。

この違いを理解すると、「Unityで使うクラス」と「普通のC#クラス」の役割がかなり整理しやすくなりますよ。




namespaceで追加できない時の直し方

ファイル名も合っている、MonoBehaviourも書いている。

それでも追加できない場合は、namespace周辺の構文を確認してみてください。

特に、コピペしたコードや、途中で整理しながら編集したコードで起こりやすいポイントです。

namespaceの構文ミスを確認する

まず前提として、namespace自体は悪いものではありません。

むしろ、中規模以上のUnityプロジェクトではかなり便利です。

問題になるのは、「namespaceの書き方が崩れているケース」です。

正常な例はこちらです。

using UnityEngine;

namespace MyGame
{
    public class PlayerMove : MonoBehaviour
    {
    }
}

波括弧の対応がきれいに閉じています。

一方で、次のように波括弧が崩れていると、Unityがclassを正しく認識できなくなることがあります。

using UnityEngine;

namespace MyGame
{
    public class PlayerMove : MonoBehaviour
    {
    }

// 波括弧が閉じていない

この場合、Consoleに構文エラーが出ることもあります。

ただ、初心者のうちはエラーメッセージだけ見ても原因が分かりにくいんですよね。

なので、namespaceを使っている場合は、まず次を確認してみてください。

  • 波括弧 { } の数が合っているか
  • classがnamespaceの外に飛び出していないか
  • コピペ時にコードが欠けていないか
  • Consoleに構文エラーが出ていないか

Visual StudioやRiderでは、対応する波括弧を選択するとハイライト表示されるので、それを使うと確認しやすいです。

空白より構文崩れを疑う

ネット検索をしていると、「namespace内の空白が原因」という情報を見ることがあります。

ただ、実際には“空白そのもの”というより、次のようなケースが原因になっていることが多いです。

  • コピペ時の不可視文字
  • 波括弧の閉じ忘れ
  • classの入れ子構造崩れ
  • コメントアウトミス

特に初心者のうちは、「namespaceを消したら直った」という経験をしやすいのですが、実際にはnamespace内部の構文が壊れていた可能性があります。

なので、いきなりnamespace自体を悪者扱いするより、まずは構文を確認するのがおすすめです。

もし学習初期でまだnamespaceに慣れていない場合は、最初のうちは無理に使わず、シンプルな構成で慣れていくのも全然アリですよ。




No MonoBehaviour scriptsの対処法

No MonoBehaviour scripts in the file という表示が出ると、「スクリプト自体が壊れているのでは…?」と不安になりますよね。

でも、このエラーは“Unityが追加可能なMonoBehaviourクラスを見つけられていない”状態を表していることがほとんどです。

つまり、確認ポイントを順番に見れば、原因を切り分けやすいエラーでもあります。

この表示はMonoBehaviourを見つけられない状態

Unityは、GameObjectへ追加できるスクリプトを探す時に、次のような条件を見ています。

  • MonoBehaviourを継承している
  • コンパイルエラーがない
  • class名とファイル名が一致している
  • public classになっている

この条件を満たせないと、No MonoBehaviour scripts in the file が表示されることがあります。

たとえば、こんなコードです。

using UnityEngine;

class PlayerMove : MonoBehaviour
{
}

一見問題なさそうですが、public が付いていません。

この場合、Unityが追加対象として認識できないことがあります。

また、次のようなケースでも発生します。

  • class名とファイル名が違う
  • MonoBehaviourを継承していない
  • Consoleに赤エラーがある
  • abstract classになっている
  • ジェネリッククラスになっている

特に初心者のうちは、「コードが書いてある=追加できる」と思いやすいのですが、Unity側には“Componentとして認識する条件”があるんですね。

普通のC#クラスは追加できなくて正常

ここで覚えておきたいのが、「追加できない=異常ではない」というケースもあることです。

たとえば、こんなクラスは普通のC#クラスとして使うことがあります。

public class DamageCalculator
{
    public int Calculate(int attack, int defense)
    {
        return attack - defense;
    }
}

これは計算専用クラスなので、GameObjectへ追加する必要がありません。

つまり、Inspectorへドラッグできなくても正常です。

逆に、プレイヤー操作や敵AIなど、“Scene上で動作させたいスクリプト”なのに追加できない場合は異常の可能性があります。

判断に迷った時は、「そのクラスはGameObjectに付けて動かす予定だったか?」を考えると整理しやすいです。

また、ScriptableObjectも初心者が混同しやすいポイントです。

ScriptableObjectは便利な仕組みですが、基本的にはGameObjectへ直接追加する用途ではありません。

なので、「ScriptableObjectなのにアタッチできない!」という場合は、仕様として正常なケースもあります。

Unityでは、

  • GameObjectへ付けるクラス
  • データ管理用クラス
  • 計算専用クラス

この役割を分けて設計することが多いです。

この違いが分かるようになると、Unityのコード構造がかなり見やすくなりますよ。




UnityとIDEを再読み込みする方法

コードの修正も終わった。

Consoleエラーも消えた。

それなのに、まだスクリプトを追加できない…。

そんな時は、UnityとIDE(Visual StudioやRider)の連携がうまく更新されていない可能性があります。

特にUnityは、「コードを書き換えたあとに再コンパイルして認識を更新する」という仕組みなので、保存漏れや再読み込み失敗が起きると、古い状態のまま残ることがあります。

まず保存とUnityへの復帰を確認する

意外と多いのが、「保存したつもり問題」です。

Visual StudioやRiderでコードを書き換えても、保存していなければUnity側には反映されません。

まずは次を確認してみてください。

  • Ctrl + S で保存したか
  • Unityへ戻った時にコンパイルが走ったか
  • Unity右下の読み込み表示が終わったか
  • Consoleの赤エラーが消えているか

特にUnity右下の「Compiling Scripts…」表示が終わる前に操作すると、まだ古い状態のままになっていることがあります。

また、Visual Studio側で保存できていても、UnityとIDEの連携自体が崩れているケースもあります。

その場合は、Unityメニューの

Edit → Preferences → External Tools

を開き、使用しているIDEが正しく設定されているか確認してみてください。

IDE連携が崩れると、補完やエラー表示までおかしくなることがあります。

Reimportやプロジェクトファイル再生成は最後に使う

基本的な確認をしても直らない場合は、Unity側の再読み込みを試していきます。

おすすめの順番はこんな感じです。

  1. Unityを再起動する
  2. 対象スクリプトを右クリック → Reimport
  3. 必要ならReimport Allを実行する
  4. .sln / .csproj を再生成する

まずはUnity再起動だけで直ることもあります。

特に長時間エディタを開いていた時や、パッケージ更新後は再起動で改善するケースがあります。

それでもダメなら、Projectウィンドウでスクリプトを右クリックし、Reimportを試します。

Reimport All はさらに強力ですが、プロジェクト規模によってはかなり時間がかかります。

なので私は、最後の手段寄りとして使うことが多いです。

さらにIDE連携が壊れている場合は、プロジェクトフォルダ内の

  • .sln
  • .csproj

を削除して再生成すると直ることがあります。

Unityを開き直すと、自動で再生成されます。

ただし、この方法は「名前不一致」や「MonoBehaviour漏れ」には効果がありません。

まずはコード側の基本チェックを済ませてから試すのがおすすめです。

Unityゲーム プログラミング・バイブル 2nd Generation
✅ Amazonでチェックする✅ 楽天でチェックする


3分診断チェックリスト

「原因が多すぎて、どこから見ればいいか分からない…」

そんな時は、上から順番に確認していくのがおすすめです。

Unityのこのエラーは、“確認順”だけでもかなり解決率が変わります。

上から順番に確認する

まずは次のチェックリストを、上から1つずつ確認してみてください。

  1. Consoleに赤エラーは出ている?
  2. Visual StudioやRiderで保存した?
  3. .csファイル名とclass名は一致している?
  4. 大文字・小文字も同じ?
  5. : MonoBehaviour が付いている?
  6. using UnityEngine; がある?
  7. public class になっている?
  8. namespaceの波括弧が崩れていない?
  9. Unity右下のコンパイルが終わっている?
  10. それでもダメなら再起動・Reimportを試す

ポイントは、「下からやらない」ことです。

たとえば、class名不一致なのにReimport Allをしても、根本原因は直っていません。

なので私は、まず「Console → 名前 → MonoBehaviour」の順番で確認しています。

この順番は、発生頻度が高いものから見られるので、かなり効率が良いです。

原因別の判断表

症状ごとに見ると、原因をかなり絞り込みやすくなります。

症状可能性が高い原因最初にやること
Consoleが真っ赤コンパイルエラー赤エラーを上から直す
class名だけ違う名前不一致ファイル名とclass名を一致
Inspectorへ追加できないMonoBehaviour漏れ: MonoBehaviour を確認
namespace使用中構文崩れ波括弧を確認
直したのに反映されない再読み込み失敗保存・再起動・Reimport

特に初心者のうちは、「全部同じエラーに見える」ことが多いです。

でも実際には、症状ごとに“よくある原因”があります。

逆に言うと、原因を順番に切り分ければ、Unityのエラーはかなり怖くなくなりますよ。




よくある誤解と注意点

ここまでの確認でかなりのケースは解決できます。

ただ、Unity初心者のうちは「別の問題と混同しやすいポイント」もあります。

特に、Visual Studio側の不具合やUnity再インストール周りは誤解されやすいです。

Visual Studioの補完不具合とは別問題

「Visual Studioの補完が効かない」と、「Unityでスクリプト追加できない」は、似ているようで別問題のことがあります。

たとえば、

  • 赤波線だらけ
  • 候補補完が出ない
  • MonoBehaviourが白文字のまま

この場合は、IDE連携の問題かもしれません。

一方で、Unity側のConsoleに赤エラーが出ているなら、Unityコンパイル側の問題である可能性が高いです。

整理すると、こんなイメージです。

症状疑うポイント
Consoleが赤いUnityコンパイルエラー
IDEだけおかしいIDE連携問題
両方おかしいExternal Toolsや.sln崩れ

初心者のうちは、「全部同じ問題」に見えやすいのですが、切り分けるとかなり整理しやすくなります。

Unity再インストールは基本不要

このエラーが出ると、「Unity壊れた?」と感じることがあります。

でも実際には、再インストールが必要になるケースはそこまで多くありません。

特に多い原因は、

  • class名不一致
  • Consoleエラー
  • MonoBehaviour漏れ
  • 保存忘れ

こういったコード・設定側の問題です。

なので、いきなりUnityを入れ直すより、まずは基本チェックを順番に確認する方がかなり効率的です。

私も過去に、「Unity壊れたかも…」と思ったら、実際はセミコロン1個抜けていただけ、なんてことがありました🙂

Unityはエラーメッセージが大きく見えるので焦りやすいのですが、原因自体はシンプルなことも多いです。

csc.rspやasmdefは特殊ケース

検索していると、

  • csc.rsp
  • Assembly Definition(asmdef)

このあたりが原因という情報を見ることがあります。

たしかに、中級者以上のプロジェクトでは影響するケースもあります。

ただ、初心者環境では遭遇率はそこまで高くありません。

なので、まずは次の基本確認を優先するのがおすすめです。

  • Consoleエラー
  • ファイル名とclass名
  • MonoBehaviour
  • namespace構文

それでも直らない時に、asmdefやcsc.rspを疑う流れで十分です。

Unityのトラブル解決は、「難しい原因から疑わない」のがかなり大事なんですね。




まとめ:まずConsoleと名前を確認

Can't add script component because the script class cannot be foundNo MonoBehaviour scripts in the file は、Unityが「このスクリプトをComponentとして認識できない」と判断している状態です。

特に初心者のうちは難しく見えますが、実際には“確認順”を整理するだけでかなり解決しやすくなります。

まず優先したいのは、次の3つです。

  1. Consoleに赤エラーがないか
  2. ファイル名とclass名が一致しているか
  3. : MonoBehaviour が付いているか

この3つだけで解決するケースはかなり多いです。

そのあとで、namespace構文やIDE連携、Reimportなどを確認していく流れがおすすめです。

逆に、最初からReimport AllやUnity再インストールへ進むと、時間だけ使ってしまうことがあります。

私の体感では、初心者環境だと「class名ズレ」と「Consoleエラー」が本当に多いです。

特に、

  • NewBehaviourScriptからリネームした
  • コピペした
  • 別スクリプトに赤エラーが残っていた

このあたりはかなり発生しやすいですね。

一方で、中級者以上になると、asmdefやnamespace構造、IDE連携なども疑う場面が増えてきます。

ただ、どのレベルでも共通して大事なのは、「簡単に確認できる順番から見ること」です。

Unityのエラーは、一見怖そうに見えても、原因を分解すると意外とシンプルなことも多いですよ。


よくある質問(FAQ)

Q
ファイル名とクラス名が違うだけで本当に追加できない?
A

はい。Unityでは、GameObjectへ追加するMonoBehaviourスクリプトは、基本的に「.csファイル名」と「public class名」が一致している必要があります。

たとえば、

// PlayerMove.cs

public class PlayerMove : MonoBehaviour
{
}

これは正常です。

一方で、

// PlayerMove.cs

public class PlayerController : MonoBehaviour
{
}

このように名前がズレていると、Unityが正しく認識できず、Inspectorへ追加できなくなることがあります。

また、大文字・小文字も区別されるので注意してください。

Q
他のスクリプトのエラーでも影響する?
A

影響します。

Unityはプロジェクト内のC#コードをまとめてコンパイルしているため、別スクリプトのエラーでも全体のコンパイルが止まることがあります。

たとえば、追加したいスクリプトが正常でも、別ファイルにセミコロン忘れや波括弧ミスがあると、Unityが新しいスクリプトを認識できなくなるケースがあります。

そのため、まず最優先で確認したいのはConsoleの赤エラーです。

赤エラーが残っている状態では、他の設定を直しても改善しないことがあります。

Q
Reimport Allをすれば直る?
A

直ることはあります。

ただし、最初に試す方法としてはあまりおすすめしません。

というのも、このエラーの多くは、

  • ファイル名とclass名不一致
  • MonoBehaviour継承漏れ
  • Consoleエラー
  • 保存忘れ

こういった基本的な原因だからです。

Reimport Allは、アセット数が多いプロジェクトだとかなり時間がかかることがあります。

なので、まずは「Console → 名前 → MonoBehaviour」の順番で確認して、それでも直らない時に試すのがおすすめです。

※当サイトはアフィリエイト広告を利用しています。リンクを経由して商品を購入された場合、当サイトに報酬が発生することがあります。

※本記事に記載しているAmazon商品情報(価格、在庫状況、割引、配送条件など)は、執筆時点のAmazon.co.jp上の情報に基づいています。
最新の価格・在庫・配送条件などの詳細は、Amazonの商品ページをご確認ください。

スポンサーリンク