Unityを使っているとエラーにぶつかってしまってわけわからなくなる時、ありますよね。
その中でよく見るエラーについての解決方法を書いていきます。↑の動画でも解説していますので是非ご活用ください。
具体的なエラーについての解説は下の方にあるのでそちらをみたい方は←のリンクから飛んでください。
<デバッグのやり方を覚えよう>
まず、具体的なエラーについて取り上げる前に、エラーを特定する方法について覚えていきましょう。
まずはこれを覚えないとそのエラーがなんなのかすらわからないと思うので、とにかく手グセにしてしまうくらいの勢いで覚えるといいと思います。
コンソールでエラーをダブルクリックしよう
まずは、コンソールでエラーを確認したら、とにかくそのエラーログをダブルクリックしてください。
するとエラーがあったスクリプトまで飛ぶことができるので、エラー箇所を確認してください。
ダブルクリックで飛べない場合は、そのエラーの文章をよく読んでください。
エラーが起きたスクリプト名や該当箇所が書いてあることがあるのでそこを探してみましょう。
エラーログをコピってグーグル翻訳にかけよう
エラーログが何言っているのかわからなかったら、もうグーグル翻訳にぶっ込んでしまうのも手です。
コンソールウィンドウでそのログをクリックすると、下の方にその全文が表示されます。
それをドラッグで範囲選択し、右クリックすればコピーできます。
必要そうなログをコピってきて、グーグル翻訳にぶち込んで何と言われているのか確認してみましょう。
また、そのエラーそのものをググってみるのも有効です。
何か情報が転がっているかもしれません。
Debug.Logを仕込もう
スクリプトがどこからエラーになっているか、どの辺りからおかしくなっているのかわからない場合は適当なところにデバッグログを入れてみましょう。
例えば↓みたいなスクリプトでエラーになっていて、どこが原因かわからないとします。
どこでエラーになっているのかわからなかったら、めぼしいところにログを書きまくるのも手です。↓のようにしました。
これを実行すると↓のようになります。
1、2、3まで表示されてエラーが表示されています。ということは3と4の間にあるコードでエラーが起きていることがわかります。
このように適当なメッセージで調べてもいいですし、変数をログに表示させてもいいですし、とにかく怪しいところをログに表示させてエラー箇所を特定しましょう。
ブレークポイントの設定
UnityとVisual Studioを連携させていた場合、ブレークポイントを貼ることができます。
UnityとVisual Studioを連携できていない人は↓の記事を参考にしてください。
やり方はブレークポイントを貼りたいコードの場所でチェックマークをつけます。
チェックマークは行番号の左側をクリックするとつけることができます。
その後、上の方にある再生ボタンを押します。
Windowsの場合は再生ボタンではなく、上の方にUnityにアタッチとあると思うのでそれをクリックしてください。
この状態でUnity側の再生ボタンを押します。
すると↓のように該当箇所を通った時、処理が一旦ストップします。
この時、変数にカーソルを合わせることで、その変数の中に何が入っているかなどを確認することができます。
そのストップさせた瞬間のパラメータを確認することができるので便利です。
また、下の方にあるローカルと書いてあるところで変数の中身を変えてしまうこともできます。
加えた変更はその処理のみ有効になります。
デバッグの際にとても便利なのでよく使います。
また、Visual Studio側のボタンを確認すると↓のようになっています。
一番左の四角がアタッチの終了です。
そして、右側の再生ボタンは次のブレークポイントまでの処理を実行します。
その右はステップオーバーと言って次の1行の命令を実行します。しかし、メソッド(関数)があった場合そのメソッド(関数)の内部では止まらず、まるっとメソッド(関数)の処理が終わってから止まります。F10キーでも同じことができます。
その右はステップインと言って、1行だけ実行します。メソッド(関数)があった場合はその内部を考慮に入れて、次に実行される箇所で止まります。F11キーでも同じことができます。
一番右はステップアウトと言って、今実行しているメソッド(関数)の呼び出し元に戻るまで処理を進めます。Shift + F11キーでも同じことができます。
<具体的なエラーログ>
それでは具体的なエラーログの意味について触れてみたいと思います。エラーログになんと書いてあるのかを読んで対処法を見てみましょう。
The name ‘○○’ does not exist in the current context
このエラーログが出てきた時はスクリプトのスペルが間違っているか、存在しない命令を書いてます。
スクリプトをよく読んでどこか間違っていないか確認してください。
NullReferenceException: Object reference not set to an instance of an object
このエラーが表示されていた場合は、変数やアクセス先のインスタンスがありません。
インスタンスがわからない方は↓の記事を参考にしてみてください。
インスペクターでの設定間違いや、newし忘れ、GetComponentで対象のコンポーネントが無かった、GameObject.Findでそのゲームオブジェクトが見つからなかったなどなど、要因は様々あります。
エラーになった箇所をよく確認して、インスタンスが入ってない変数などを使っていないか確認してください。
空白のエラーログ
たまに、エラーログが出るけど何も表示されないことがあります。
これはUnity自体がバグっている可能性が高いです。
Unityをバージョンアップしてしまったなどの場合は元に戻しましょう。(必ずUnityのバージョンを上げるときはバックアップをとってください)
また、Unityを再インストールしても直る場合があります。直らない場合はLTSバージョンなど安全なバージョンをインストールするといいかもしれません。
All compiler errors have to be fixed before you can enter playmode!
エラーが起きているのにUnityの再生ボタンを押すと怒られます。
エラーを修正してから再生ボタンを押しましょう。
Scene ‘シーン名’ couldn’t be loaded because …
これは、シーン読み込み時に発生するエラーです。
単にシーンの名前を間違っているか、シーンの設定が足りてないので起きているエラーになります。
シーン名があっているか、シーンの設定が足りているか確認してください。
シーンの設定はそのシーンを開いている状態で、File>Build Settings…から
この画面のAdd Open Scenesをクリックします。
すると現在開いているシーンが表示されたかと思います。これで現在開いているシーンを設定に登録する事ができました。
<具体的なワーニングログ>
次に具体的なワーニングについても確認していきます。
これは起きていても問題にはなりませんが、ログが埋まってしまい、邪魔になってしまうのでなるべく起きないようにしたいところです。
There are inconsistent line endings in the ‘○○’ script. Some are Mac OS X (UNIX) and some are Windows.
このワーニングが出ていたら、改行コードに\r\nが入っています。
これはWindowsが使っているの改行コードとMacが使っている改行コードが違うので起きます。なるべく多くのコンパイラが読める\nを改行コードとして統一しようという動きがあるので\r\nを\nに直しましょう。
\r\nを\nに直すには、上部メニューからユーザー設定を開いてください。
その後、左のタブのソースコードをクリックし、展開したらコードのフォーマットをクリックし、展開したらC#ソースコードをクリックします。
そうしたら、改行コードをUnix / Macに変更しましょう。
次にテキストエディターのをクリックして、マーカーとルーラーをクリックしましょう。
そして非表示の文字を表示するを「常に行う」に変更し、改行コードを含めるにチェックを入れましょう。(スペースとタブについては外してもいいです)
するとスクリプトで\r\nが見えるようになるので
一番下の「}」を消してもう一回「}」を打ち込めば自動的に改行を\nに変換してくれます。
それでもまだ残っている\r\nが存在すると思うので、それはバックスペースかデリートで消してもう一回改行し直しましょう。