【Unity】ちょっと待った! そのスクリプトを消す前にComponentを確認だ!
「テスト用に作ったスクリプト、もう使わないからExportした後削除しとこ」
なんてスクリプトを削除した時に、
The referenced script on this Behaviour (Game Object ‘<null>’) is missing!
UnityEngine.GUIUtility:ProcessEvent(Int32, IntPtr)
といったエラーが出ることが稀によくあります。
該当のスクリプトが他のスクリプトから参照されていなければゲーム実行ができるため、無視しちゃってもいいケースもありますが、やっぱりWarningが出てくるのは喉の奥に魚の骨が刺さっているようなビミョーな気持ち。
もしビンカンなあなたの上司がコンソールを見てしまったら、「エラーが出てるじゃないか! 早く直せ!」と騒ぎ立てるかもしれません。
なのでさぱっと直しておくといい感じ。
環境
macOS 10.13 High Sierra
Unity2018.2.2f1
Warningが出ている状態
このワーニングが出ている時のコンソールはこんな感じ。ゲーム実行時にメッセージをクリアしてもすぐに出てきます。
コンソールを狭くしているので若干途切れていますが、メッセージは冒頭のものと一緒です。対象のゲームオブジェクトが異なるくらい。
これ、シーン内にあるオブジェクトが発生元だとコンソールのメッセージをダブルクリックで飛んでくれるのですが、Prefab化したオブジェクトが発生元だと飛ばないので探すのに苦労するんですよね。
私の場合はPrefabが原因でした。それをのぞいてみるとコンポーネントがこんな感じになってました。
コンポーネント内の警告文では、
The associated script can not be loaded.
Please fix any compile errors and assign a valid script.
(関連付けられたスクリプトは読み込めないよ。コンパイルエラーを直して、正しいスクリプトを割り当ててね)
と表示されます。見事にMissing。
残しておいてもアレなので、コンポーネントメニューの[Remove Component]でサクッと外します。Prefab自体不要であれば消してしまってもいいかも。
他にもないかPrefabを点検しつつ、Warningが出なくなることを確認しました。
スクリプトを削除する前には、そのスクリプトを使っていたオブジェクトのコンポーネントを確認すべし。
このメッセージが出やすいシチュエーション
プロジェクトでの開発でこのメッセージに遭遇することってそんなにないかも。開発中にごっそりスクリプトファイルを消すとか、阿鼻叫喚のデスいマーチのトリガーになりそうですし、そもそもバージョン管理もしっかりやってるでしょうし。
ありうるのは、テスト的に作った機能をプロジェクトから取り除く時でしょうか。
スクリプトは削除したけど、それを使っていたオブジェクトは消し忘れる、とか。特にPrefabにしているとうっかり忘れやすいです。
ProjectウィンドウではPrefabの子オブジェクトまでしか見られないので、孫オブジェクトにMissingなスクリプトがいると悲しみの向こうへと旅立てます。Hierarchyウィンドウでインスタンス化して中身確認して……なんて作業している姿が目に見えますね。ええ、私の姿です。
あとはリファクタリングした後も要注意です。スクリプトを統合したりなんかするとMissingが出てくるかも。こちらもPrefabが鬼門になるかもしれません。
リファクタリングするタイミングだとProject内のファイル数も多くなって来ますし、結構見つけるのが大変かもしれません。
まとめ
今回紹介したWarningは、コンポーネントとしてアタッチしたスクリプトファイルがプロジェクトフォルダ内に無い時に表示されます。
対処方法は該当のコンポーネントを外すだけなのですが、どのゲームオブジェクトが持つコンポーネントなのかを探し当てるのが大変。
特にPrefab化したオブジェクトで発生しがちなので、そちらを注意して見てみるといいかも。
ゲーム開発の攻略チャートを作りました!
-
前の記事
便利なAddressableAssetだけど、fbxのAnimationタブでエラーが出る 2018.08.15
-
次の記事
【Unity】コルーチンってなんなのなの? って時に読む記事【解説】 2018.09.01
コメントを書く