1220 スクリプトエラーを修正しよう! - mishimatsu/AdventCalendar2014 GitHub Wiki
前回は、シーンをリロードして、何度もボールを投げられるようにしてみました。
今回は、スクリプトを書いた時に発生するエラーの対応方法について学びましょう。
スクリプトのエラーと言っても文法が間違っている場合とロジックが間違っている場合があります。
今回は、文法が間違っている場合の対応について、説明します。
基本的に、本などで説明されている場合、スクリプトに間違いはないので、文法的なエラーについての対応法がが書かれていることはありません。
サンプルコードなどは、本に付いているメディからもしくは、ウェブサイトからコードをそのままコピーしてくるので、エラーが出ることはないでしょう。
しかし、自分で新しくスクリプトを作ろうとした場合に、様々なエラーに遭遇することになります。
この手のエラーは、わかってしまえばそんなに大したことでは、ないですがスクリプトを始めたばかりの人には、かなり大きな障害となります。
何が悪いかわからない、相談できる人が周りにいないとなると、そこでやめてしまう人も多くいます。
インターネット上には、そういった質問受け付けるサイトもあります、そういうところを活用するもの良いですが、初歩的なことは、自分で解決できるようになっておきたいものです。
ここまで、作ってきたサンプルで、自分が実際にやらかしてしまったスクリプトのエラーを練習問題として、進めていきます。
今回は、練習問題形式として、進めていこうと思います。
まずは、そのための準備を進めます。
Unityを起動します。
ここまでは、前回と同じです。
問題のスクリプトを入れるフォルダを作成します。
メニュのAssets→Create→Folderを選択します。
作成したFolderの名前は、questionにしておきます。
練習問題は、こちらで用意しています。
ウェブサイトからダウンロードして、先ほど作成したフォルダクリックして、フォルダの中へスクリプトファイルをドロップしてください。
問題1 変数が見つからない?
問題のスクリプトは、下記のURLにあります。
ダウンロードして、questionのフォルダへ追加してください。
q1.cs
Unityの下の部分に、メッセージが表示されたと思います。
このメッセージをクリックしてみましょう。
するとConsoleというタブが選択されて、問題のエラーが表示されています。
今回のエラーは、
Assets/question/q1.cs(21,25): error CS0103: The name `totalTie' does not exist in the current context
ということのようです。
インストール時のメッセージもそうなのですが、エラーメッセージが英語なのも初心者には、かなり難易度を上げている原因になっています。
しかし、原因自体は、そんなに難しくないので、少しずつ見て行きましょう。
Assets/question/q1.cs
この部分は、問題があるスクリプトのファイル名です。
今回の場合、問題になっているのは、Assets/question/q1.csということになります。
(21,25)
これは、ファイルのどの部分が間違っている可能性があるかを示しています。
間違った箇所の(行,列)になります。
つまり、今回の場合、21行目の25文字目あたりが間違っているということになります。
error CS0103
これは、問題の種類を表すエラーコードになります。
通常、気にする必要はありません。
The name `totalTie' does not exist in the current context
これがエラーの詳細です。
訳すと`totalTie'の名前がスクリプトファイル内に見つかりませんでした。
ということです。
つまり、
Assets/question/q1.csファイルの21行目の25文字目あたりの`totalTie'が見つかりませんというエラーです。
スクリプトは、知らない変数は、使用できません。
変数が定義されていないか、使う変数名が間違っているということになります。
今回の場合、`totalTie'は、`totalTime'の間違いということになります。
タイプミスの部分を修正してみましょう。
Consoleに表示されているエラーメッセージをダブルクリックするとエラーの箇所をMonoDevelopで開いてくれます。
MonoDevelopが起動して、問題のある21行目にカーソルが移動しています。
問題となっている箇所を修正しましょう。
totalTieをtotalTime
へ変更します。
修正が終わったらスクリプトをセーブして、Unityに戻ります。
エラーが修正されていればConsoleの画面からエラーメッセージが消えているはずです。
エラーが表示されているようであれば、エラーメッセージを確認して、MonoDevelopを使ってエラーを修正します。
問題2 カッコが足りない?
問題のスクリプトは、下記のURLにあります。
ダウンロードして、questionのフォルダへ追加してください。
q2.cs
前回の問題からだと、questionのフォルダが表示されていないと思います。
Projectのタブをクリックしてください。
今回は、次のようなエラーが出ていると思います。
Assets/question/q2.cs(37,18): error CS1547: Keyword `void' cannot be used in this context
Assets/question/q2.cs(37,19): error CS1525: Unexpected symbol `(', expecting `)', `,', `;', `[', or `='
エラーが複数ある場合には、Console画面に複数行にわたって表示されます。
最初のエラーから見て行きましょう。
Assets/question/q2.cs(37,18): error CS1547: Keyword `void' cannot be used in this context
Assets/question/q2.csファイルの37行目、18文字目あたりの`void'というキーワードは使うことが出来ませんというエラーです。
きちんとした関数の定義になっていて、見たところ問題は、なさそうです。
次のエラーメッセージを確認してみましょう。
Assets/question/q2.cs(37,19): error CS1525: Unexpected symbol `(', expecting `)', `,', `;', `[', or `='
Assets/question/q2.csファイルの37行目、19文字目あたりに予期せぬシンボル'('が現れたとあります。
期待していたシンボルは、')'とかだったのに・・・
スクリプトを始めたばかりの初心者にとって、このエラーは、まったく意味不明のものだと思います。
本と同じように入力したのに、エラーがでたとかでよく出るエラーです。
このエラーの原因は、エラーが表示された37行目ではなく、もっと前の行になります。
いままで、書いたBallスクリプトと比べてみましょう。
31行目に}がありませんね。
21行目のif文の{と対になっていないといけないのですが、そのカッコを閉じるのを忘れていたようです。
このエラーは、慣れてないとなかなか見つけることが出来ないエラーです。
スクリプトを記述する場合には、対になるカッコは、後で書くのではなく、先に一緒に書いておきます。
if(){
}
その後に、必要な条件文、処理を記述していきます。
そうすれば、カッコの書き忘れを防ぐことができます。
スクリプトを修正したらセーブして、Unityでエラーが無くなったことを確認します。
無事にスクリプトのエラーが修正されました。
今回取り上げたエラーは、かなり初歩的なものですが、スクリプトを書き始めて間もない時には、どういうエラーかわからずに途方に暮れてしまいます。
近くに、相談できる人がいると良いのですがなかなかいないものです。
本などのサンプルを入力する場合には、本と自分の書いたスクリプトを見比べて、違いがないかを調べることで、エラーの内容がわからなくても対応することが可能です。
ただ、自分でオリジナルのコードを追加し始めると、エラーが出た際の対応がかなり大変です。
今まで、作ったものと比べながら入力したスクリプトを一箇所ずつチェックしていきましょう。
何度も繰り返して、エラーの修正経験ができると自然に対応できるようになります。
そろそろ、自分でなにか作りたくなってきたんじゃないでしょうか?
今までやったことを参考にして、新しいものを作ってみましょう。
次回もスクリプトのエラーの修正について、解説します。
それでは、楽しいUnity Lifeを!
参考資料
C# コンパイラ エラー
コラム
Unity上でエラーが出た際の行番号と文字数がMonoDevelopとで、少しズレがあります。
これは、Unityは、8Tab、MonoDevelopが4Tabのため、Tab文字数 x 4文字分ずれてしまうようです。