見出し画像

Unity初心者がつまずきやすいエラーを徹底解説!

こんにちは、Unity Japanのコミュニティ・アドボケイトの田村幸一です。私は普段、Unityを広く世の中に伝える、広報的な役回りをしています。

4月に公開した記事では、Unityを学び始めた人が抱える不安な気持ちをサポートするため、「Unity学習の“あるある失敗”とその対処方法」を3人の先生に伺いました。

以上の記事で、制作者のみなさんから「ひよこ本」の愛称で知られているUnity入門書の著者、荒川巧也さんは「Unity初心者がレベルアップするにはエラーの原因を知ること」と伝えています。

原因をすぐに特定できると、制作にかけられる時間も長くなります。その分、表現を突き詰めたり、ゲームの仕様を考えたりする時間に充てることができます。

今回、4月からUnityを学び始めたライター・つじのさんが実際に遭遇したUnityのエラーを題材に、エラーに対する向き合い方、Unity初心者がつまずきやすいエラーを荒川さんに聞きました。はたして2人は無事エラーを解決することができるでしょうか?

Unity初心者がエラーにもめげず、制作に没頭できればと願っています!


つじのゆい
株式会社インクワイア所属。ライターとして活躍中。実はこのUnity Japanのnoteでも企画・執筆・編集などを担当。Unityを含め、ゲーム開発・プログラミングは全くの未経験。

荒川 巧也
ユニティ・テクノロジーズ・ジャパン株式会社所属。「ひよこ本」の愛称で知られているUnity入門書の共著者。

エラーはゲーム完成へのヒントである

つじの:Unity上でエラーが表示されるたびに理由がわからず、パニックになってしまいます。荒川先生、どうすればいいでしょうか?😢

荒川:エラーが表示されると、「君は間違ってるよ!」と否定された気持ちになってしまいますよね。でも、だいじょうぶ。まずはエラーへの向き合い方を変えていきましょう。

つじの:向き合い方?

荒川さん:エラーはゲームの完成に不足していることを導いてくれる存在。恐れなくていいんです。「間違いが分かってよかった」と受け入れることが大事です。

つじの:たしかに、「完成からまた遠ざかってしまった」と不安になっていました。でも、エラーの内容を読み解こうとしても、英語で埋め尽くされていて……。英語が得意でない私でも、読み解けますか?

荒川:もちろん、英語力があったほうが対応は早いかもしれませんが、「エラー構文」を知れば、ずっと読み解きやすくなりますよ。

エラー構文を知れば、ずっとわかりやすくなる

つじの:エラー構文?

荒川:エラー構文とは、エラーのどこに、何が書かれているかを示すものです。


荒川:
まずは左側から見ていきましょう。エラーが発生した時間帯を示す「タイムスタンプ」、次に「エラーの名称」、そして「:」以降は「エラーの解説」となっています。

エラーに使われている英文はシンプルな単語で構成されているため、コピー&ペーストでGoogleDeepLなどの機械翻訳を活用してみるのもいいでしょう。また、エラー解消のためには、エラーの名称をダブルクォーテンションで囲み、Google検索すると参考記事にヒットしやすいですよ。

また、同じ操作を繰り返してしまい、エラーが大量に表示されることがあります。その場合は、「Collapse」ボタンを押すと1つに集約されますので、見やすくなります。

赤で囲った部分を押すと1つに集約されます

つじの:なんだか落ち着いて対応できる気がしてきました!

Unity初心者がつまずきやすいエラー「MissingComponentExecption:」を乗り越えてみよう!

荒川:せっかくなので、つじのさんがつまずいているエラーを一緒に読み解いてみましょうか。

つじの:ありがとうございます!今苦戦しているのは、Playerを動かそうとスクリプトを書いたときに発生した「MissingComponentExecption:」というエラーです。

荒川:「MissingComponentExecption:」は、Unity初心者が一番つまずきやすいエラーですね。

エラーの名称は「Missing=ない」「Component=コンポーネント」「Execption=例外」という意味。つまり、つじのさんがUnityに「コンポーネントを見てね!」と指示しているけれど、Unityが「参照するコンポーネントがないよ!」と伝えてくれているんです。

では、つじのさんが書いたスクリプトを見ていきましょう。

荒川:どんなスクリプトを書いたか説明できますか?

つじの:Playerを一定の速度で動かすためです。

Startでは、このスクリプトを添付したオブジェクトのRigidbodyコンポーネントを取得して、rbという関数に代入するようにしています。あとはFixedUpdateで、常にコントローラーの横(Horizontal)と縦(Vertical)の入力を取得して、先ほど取得したRigidbodyコンポーネントにAddForceメソッド、つまり力を加えて動かすという内容を書きました。

書き方が間違っているのでしょうか?

荒川:合っていますよ。「MissingComponentExecption:」の原因は、オブジェクトにRigidbodyのコンポーネントが付いていないからです。

「Inspecter」にRigidbodyのコンポーネントが入っているか確認してみましょう。

つじの:たしかに、「Inspector」に「Rigidbody」が入っていないです……。

荒川:「Add Component」から「Rigidbody」をコンポーネントのオブジェクトに追加すると、エラーは解消されますよ。

つじの:エラーがなくなりました!

変数をエディタ上から設定できるようにしてみよう

荒川:これで一歩前進ですね。

さらに、「コンポーネントを簡単にエディタへ追加したい!」というときは、変数にpublicアクセス修飾子を付けることで簡単にエディタからその変数を設定することが可能になります。

つじの:アクセス修飾子?

荒川:アクセス修飾子を設定することでその変数がどこからアクセスできるのかを決めることができます。例えばpublicを付けるとほかのクラスやエディタ上からアクセスができるようになります。privateを付けるとそのクラス内のみでアクセスすることができるようになります。今スクリプト内の”Rigidbody rb”を見るとアクセス修飾子がない状態です。この書き方だと、自動的に”private”の扱いになります。そうすると、ほかのクラスやエディタ上からその変数にアクセスすることができません。

つじの:確かに毎回コンポーネントを追加できて便利ですね!

荒川:そうです。やり方は簡単で、参照したいRididbodyの変数に「public」を追記したスクリプトを書きます。

荒川:スクリプトにpublicを追記しただけでは、またエラーが出てしまいます。完了するには、オブジェクトにコンポーネントをドラッグ&ドロップしなくてはいけません。

つじの:できました!これで、「MissingComponentExecption:」のエラーもこわくないですね!

落ち着いてエラーを読み解き、前進していこう

荒川:コンポーネントの追加忘れで発生する「MissingComponentExecption:」と似たエラーが、Tagの設定忘れです。Tagの設定を忘れてしまうと「UnityException: GameObject has undefined tag!」というエラーが発生します。「Inspector」からTagが設定されているかを確認しましょう。

荒川:また、Hierarchy Window上のオブジェクト名からオブジェクトを参照する「GameObject.Find("オブジェクト名")」を利用することがあると思います。しかし、指定したオブジェクト名がない場合(または、間違った名前を指定した場合)はエラーが出なくともうまくゲームが動かないことがあります。

このエラーは、「MissingComponentExecption:」と同様に「参照先がない」と伝えてくれているので、オブジェクト名が合っているか確認しましょう。

初心者でもプロでも、エラーは必ず発生するものです。まずは、エラー構文の内容を確認し、それでも対応が分からなければ参考記事を探しましょう。Unityユーザーがたくさんの参考記事をアップしていますので、手がかりになるはずです。

みんなにも読んでほしいですか?

オススメした記事はフォロワーのタイムラインに表示されます!

最後までお読みいただきありがとうございます。ぜひTwitterもフォローしてください。