1221 スクリプトエラーを修正しよう! その2 - mishimatsu/AdventCalendar2014 GitHub Wiki
前回に引き続き、スクリプトエラーの対応について説明します。
今回もこちらで、練習問題用のスクリプトを用意しました。
前回同様ダウンロードして、Unityに登録してください。
Unityを起動しましょう。
問題3 型が違う?
問題のスクリプトは、下記のURLにあります。
ダウンロードして、questionのフォルダへ追加してください。
q3.cs
ダウンロードしたスクリプトファイルを前回と同様questionのフォルダへドロップします。
今回は、エラーが4つ表示されました。
Assets/question/q3.cs(29,71): error CS1502: The best overloaded method match for `UnityEngine.Vector3.Vector3(float, float, float)' has some invalid arguments
Assets/question/q3.cs(29,71): error CS1503: Argument `#1' cannot convert `double' expression to type `float'
Assets/question/q3.cs(29,35): error CS1502: The best overloaded method match for `UnityEngine.Rigidbody.AddForce(UnityEngine.Vector3, UnityEngine.ForceMode)' has some invalid arguments
Assets/question/q3.cs(29,35): error CS1503: Argument `#1' cannot convert `object' expression to type `UnityEngine.Vector3'
上から順番にエラーメッセージを見て行きましょう。
Assets/question/q3.cs(29,71): error CS1502: The best overloaded method match for `UnityEngine.Vector3.Vector3(float, float, float)' has some invalid arguments
Vector3クラスの最適なオーバーロードメソッドに、無効な引数がありますというエラーです。
オーバーロードメソッドとは、なにか?気になるとは思いますが今回は、詳しく説明しません。
気になる方は、調べてみてください。
次のエラーメッセージを見てみましょう。
Assets/question/q3.cs(29,71): error CS1503: Argument `#1' cannot convert `double' expression to type `float'
第一引数をdouble型からfloat型へ変換できませんというエラーになります。
#1は、第一引数という意味になるようです。
Assets/question/q3.cs(29,35): error CS1502: The best overloaded method match for `UnityEngine.Rigidbody.AddForce(UnityEngine.Vector3, UnityEngine.ForceMode)' has some invalid arguments
これは、最初のエラーメッセージと同じですね。
AddForce()に与える引数が無効だということです。
最後のエラーメッセージを見てみましょう。
Assets/question/q3.cs(29,35): error CS1503: Argument `#1' cannot convert `object' expression to type `UnityEngine.Vector3'
これも2番めのエラーメッセージと同じですね。
object型からVector3型へ変換できないというエラーです。
このエラーメッセージをまとめると、AddForce()に渡すVector3の引数の型が間違っているので、エラーになっているようです。
そのエラーの原因は、double型をfloat型へ変換出来ないためにエラーになっているというのが根本の原因です。
Vector3のコンストラクタの引数の型は、Vector3(float, float, float)となっています。
しかし、今回のエラーメッセージを見るとVector3(double, double, double)で、コンストラクターを呼びだそうとしてエラーになっています。
つまり、double型をfloat型へ変更すれば今回のエラーは修正できそうです。
double型とfloat型の違いは、どこにあるのでしょうか?
それは、数字の後に付いているfになります。
0.0は、double型、0.0fは、float型となります。
これは、知っていないと対応できない問題です。
呼び出す関数の引数をよく確認して、きちんと使い分けてください。
エラーが発生した29行目を修正してみましょう。
Vector3の3つの引数の数値の後にfをつけます。
スクリプトをセーブして、Unity上でエラーが修正されたか確認しましょう。
無事にエラーは、修正されたようです。
エラーがたくさん出たとしても慌てずに、順番にエラーを確認して対応していきましょう。
問題4 見えない文字?
問題のスクリプトは、下記のURLにあります。
ダウンロードして、questionのフォルダへ追加してください。
q4.cs
ダウンロードしたスクリプトファイルを前回と同様questionのフォルダへドロップします。
今回のエラーメッセージは、1つです。
Assets/question/q4.cs(3,1): error CS8025: Parsing error
3行目の1文字目で、スクリプトの文法の解釈に失敗したというエラーです。
問題の箇所をMonoDevelopで見てみましょう。
見た感じ、特に問題があるように思えません。
Ballスクリプトと比較してみましょう。
MonoDevelop上で、確認する限り違いがないように見えます。
見えない文字を見えるようにする。
MonoDevelopには、通常見えない文字を見えるようにするというオプションがあります。
これを適応してみましょう。
メニューのTools→Optionsを選択します。
Markers and Rulersを選択
Show invisible CharacersをAlwaysに変更します。
これで、MonoDevelop上で、見えない文字が見えるようになります。
エラーが発生した3行目を見てみましょう。
\nというのが行末に付いていると思いますが、これは、改行コードを表しています。
\nの前に、空白がありますね。
選択して削除してみましょう。
削除したらスクリプトをセーブします。
Unityで確認してみましょう。
無事にエラーは、修正されたようです。
この空白は、何だったのでしょう?
その正体は、全角スペースです。
漢字でコメントを打った後やウェブからスクリプトをコピーしてきた時などに、起こることがあります。
通常、全角スペースが見えないので、初心者には、修正がかなり困難です。
この手のエラーが発生した場合には、全角スペースがあるのではないかということに注意してみてください。
2回に渡って、スクリプトエラーの対応方法を書いてみました。
少し文字が多くて、わかりにくかったかもしれません。
実際にやって、わからないよというところがあればフィードバックをいただければと思います。
別の機会に、詳しく解説したいと思います。
練習問題
問題5 エラーを修正しなさい
q5.cs
問題6 エラーを修正しなさい
q6.cs
問題7 エラーを修正しなさい
q7.cs
実際に、やる練習問題を3つ用意したので、やってみてください。
初歩的なエラーばかりですので、練習問題をやっておくと、自分でスクリプトを作成した時に、エラーが発生した場合に、対応できるようになります。
次回は、Unity AssetStoreについて、説明したいと思います。
それでは、楽しいUnity Lifeを!