0.はじめに
筆者はバリバリの初心者なので内部の仕組みは分からないし、この記事の内容も100%正確とは言い切れません。
1.有名なあのエラー
Unityを独学で勉強しようとGoogleを徘徊した時、多くのサイトで**「初心者がしやすいエラー」**として
クラス名とファイル名(スクリプト名)が一致していないというものが紹介されていた。実際にエラーを体験したという人もいるはず。
Consoleに表示されるのはこれ ↓
Can't add script component "ファイル名(スクリプト名)" because the script class cannot be found. Make sure that there are no compile errors and that the file name and class name match.
Google翻訳:スクリプトクラスが見つからないため、スクリプトコンポーネント「ファイル名(スクリプト名)」を追加できません。 コンパイルエラーがなく、ファイル名とクラス名が一致していることを確認してください。
Inspectorに表示されるのはこれ ↓
No MonoBehaviour scripts in the file, or their names do no match the file name.
Google翻訳:ファイルにMonoBehaviourスクリプトがないか、ファイルの名前がファイル名と一致していません。
2.クラス名とファイル名が一致してるのに...
初めての2Dゲームを制作している時、例のエラーが発生したので調べてみたが原因がわからなかった。
どちらも"MoveText"という風にクラス名もファイル名(スクリプト名)も一致しているのにエラーが出ている。
(タップした場所に表示されたテキストが上昇して消える、というものを作っていた)
エラーのことを調べながらこんなことを考えたり試したりした ↓
-
予約語を使っているかも!→名前を別のものに変える(4回変えた)
-
名前の後や前にあるスペースがクラス名と認識されて一致しないのでは?
-
日本語入力でアルファベットを入力したとか?
-
中身が間違っているんじゃないか?→変数名や演算子などを書き換え
-
etc...
が、すべて関係のないものだった。
(再起動は面倒くさいからやらなかった)
3.結論
1時間苦戦してやっと目当ての記事を見つけた ↓
https://teratail.com/questions/172017
内容はなんだか難しそうでよく分からなかったけど、
既存スクリプトにバグが無いかを確認する
この1行だけ読めた。
後で確認するとこの時、「DestroyMe」というスクリプトの中で「DestroyMe(this.gameObject)」と記述していた。
(本来ならメソッド名は「Destroy」のはずがスクリプト名の「DestroyMe」にしてしまっていた)
要は、**「既存スクリプトにバグがあった」**ということになる。
4.まとめ
検索してもなかなか出てこないのでこのエラーに1時間も費やしてしまった。検索スキルが低いだけかもしれない
スクリプト名を間違えやすい名前にするだとか、エラーを放置するといったことは避けた方が良さそう。
余談だけど、1時間悩んだうちの20分はエラー本文のclassをdassと訳していたから。エラーが出ても焦らずに対処しよう!