0.はじめに
筆者はバリバリの初心者なので内部の仕組みは分からないし、この記事の内容も正確とは言い切れません。
初めてゲームっぽいものを作ろうとしていた際にすごく困ったので備忘録の意味も含めて記事に残します。
書き方が下手だけど許してね。
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.gameObjct)」と記述していた。
(本来なら「Destroy」のはずがスクリプト名の「DestroyMe」にしてしまっていた)
要は、「既存スクリプトにバグがあった」ということになる。
4.まとめ
もしかしたら今回の事はプロのプログラマの方なら普通に気づく事だったのかもしれないが、検索してもなかなか出てこないので筆者はこれに1時間も費やしてしまった。筆者の検索スキルが低いだけかもしれない
スクリプト名を間違えやすい名前にするだとか、エラーを放置するといったことは避けた方が良いだろう。
余談だけど、1時間悩んだうちの20分はエラー本文のclassをdassと訳していたから。なにやってんだ。